参考文献

1. 辅助函数


masked_median

 masked_median (x, mask, dim=-1, keepdim=True)

*带掩码的中位数*

计算张量 x 沿 dim 的中位数,忽略 mask 为 False 的值。xmask 需要可广播。

参数
x: 用于计算沿 dim 维度的中位数的 torch.Tensor。
mask: 与 x 形状相同的 torch Tensor 布尔值,其中 x 有效则为 True,应掩码则为 False。在 dim 维度的任何列中,mask 不应全为 False,以避免零除导致的 NaN。
dim (int, 可选): 计算中位数的维度。默认为 -1。
keepdim (bool, 可选): 是否保留 x 的维度。默认为 True。

返回值
x_median: 包含归一化值的 torch.Tensor。*


masked_mean

 masked_mean (x, mask, dim=-1, keepdim=True)

*带掩码的均值*

计算张量 x 沿维度的均值,忽略 mask 为 False 的值。xmask 需要可广播。

参数
x: 用于计算沿 dim 维度的均值的 torch.Tensor。
mask: 与 x 形状相同的 torch Tensor 布尔值,其中 x 有效则为 True,应掩码则为 False。在 dim 维度的任何列中,mask 不应全为 False,以避免零除导致的 NaN。
dim (int, 可选): 计算均值的维度。默认为 -1。
keepdim (bool, 可选): 是否保留 x 的维度。默认为 True。

返回值
x_mean: 包含归一化值的 torch.Tensor。*

2. 缩放器


minmax_statistics

 minmax_statistics (x, mask, eps=1e-06, dim=-1)

*MinMax 缩放器*

通过确保时间特征的范围位于 [0,1] 范围内对其进行标准化。这种变换通常用作标准缩放器的替代方法。缩放后的特征如下所示:

z=(x[B,T,C]min(x)[B,1,C])/(max(x)[B,1,C]min(x)[B,1,C]) \mathbf{z} = (\mathbf{x}_{[B,T,C]}-\mathrm{min}({\mathbf{x}})_{[B,1,C]})/ (\mathrm{max}({\mathbf{x}})_{[B,1,C]}- \mathrm{min}({\mathbf{x}})_{[B,1,C]})

参数
x: torch.Tensor 输入张量。
mask: torch Tensor 布尔值,与 x 维度相同,True 表示 x 有效,False 表示应掩码 x。在 dim 维度的任何列中,mask 不应全为 False,以避免零除导致的 NaN。
eps (float, 可选): 用于避免零除的小值。默认为 1e-6。
dim (int, 可选): 计算最小和最大值的维度。默认为 -1。

返回值
z: 与 x 形状相同,但已缩放的 torch.Tensor。*


minmax1_statistics

 minmax1_statistics (x, mask, eps=1e-06, dim=-1)

*MinMax1 缩放器*

通过确保时间特征的范围位于 [-1,1] 范围内对其进行标准化。这种变换通常用作标准缩放器或经典 Min Max 缩放器的替代方法。缩放后的特征如下所示:

z=2(x[B,T,C]min(x)[B,1,C])/(max(x)[B,1,C]min(x)[B,1,C])1\mathbf{z} = 2 (\mathbf{x}_{[B,T,C]}-\mathrm{min}({\mathbf{x}})_{[B,1,C]})/ (\mathrm{max}({\mathbf{x}})_{[B,1,C]}- \mathrm{min}({\mathbf{x}})_{[B,1,C]})-1

参数
x: torch.Tensor 输入张量。
mask: torch Tensor 布尔值,与 x 维度相同,True 表示 x 有效,False 表示应掩码 x。在 dim 维度的任何列中,mask 不应全为 False,以避免零除导致的 NaN。
eps (float, 可选): 用于避免零除的小值。默认为 1e-6。
dim (int, 可选): 计算最小和最大值的维度。默认为 -1。

返回值
z: 与 x 形状相同,但已缩放的 torch.Tensor。*


std_statistics

 std_statistics (x, mask, dim=-1, eps=1e-06)

*标准缩放器*

通过移除均值并沿 dim 维度缩放到单位方差来标准化特征。

例如,对于 base_windows 模型,缩放后的特征如下所示(dim=1):

z=(x[B,T,C]xˉ[B,1,C])/σ^[B,1,C]\mathbf{z} = (\mathbf{x}_{[B,T,C]}-\bar{\mathbf{x}}_{[B,1,C]})/\hat{\sigma}_{[B,1,C]}

参数
x: torch.Tensor。
mask: torch Tensor 布尔值,与 x 维度相同,True 表示 x 有效,False 表示应掩码 x。在 dim 维度的任何列中,mask 不应全为 False,以避免零除导致的 NaN。
eps (float, 可选): 用于避免零除的小值。默认为 1e-6。
dim (int, 可选): 计算均值和标准差的维度。默认为 -1。

返回值
z: 与 x 形状相同,但已缩放的 torch.Tensor。*


robust_statistics

 robust_statistics (x, mask, dim=-1, eps=1e-06)

*鲁棒中位数缩放器*

通过移除中位数并使用平均绝对偏差 (mad)(一种鲁棒的方差估计器)进行缩放来标准化特征。这种缩放器对于包含噪声数据特别有用,因为在噪声数据中异常值会严重负面影响样本均值/方差。在这种情况下,中位数和 mad 会给出更好的结果。

例如,对于 base_windows 模型,缩放后的特征如下所示(dim=1):

z=(x[B,T,C]median(x)[B,1,C])/mad(x)[B,1,C]\mathbf{z} = (\mathbf{x}_{[B,T,C]}-\textrm{median}(\mathbf{x})_{[B,1,C]})/\textrm{mad}(\mathbf{x})_{[B,1,C]}

mad(x)=1Nxmedian(x)\textrm{mad}(\mathbf{x}) = \frac{1}{N} \sum_{}|\mathbf{x} - \mathrm{median}(x)|

参数
x: torch.Tensor 输入张量。
mask: torch Tensor 布尔值,与 x 维度相同,True 表示 x 有效,False 表示应掩码 x。在 dim 维度的任何列中,mask 不应全为 False,以避免零除导致的 NaN。
eps (float, 可选): 用于避免零除的小值。默认为 1e-6。
dim (int, 可选): 计算中位数和 mad 的维度。默认为 -1。

返回值
z: 与 x 形状相同,但已缩放的 torch.Tensor。*


invariant_statistics

 invariant_statistics (x, mask, dim=-1, eps=1e-06)

*不变中位数缩放器*

通过移除中位数并使用平均绝对偏差 (mad)(一种鲁棒的方差估计器)进行缩放来标准化特征。此外,它还使用 arcsinh 变换来补充该变换。

例如,对于 base_windows 模型,缩放后的特征如下所示(dim=1):

z=(x[B,T,C]median(x)[B,1,C])/mad(x)[B,1,C]\mathbf{z} = (\mathbf{x}_{[B,T,C]}-\textrm{median}(\mathbf{x})_{[B,1,C]})/\textrm{mad}(\mathbf{x})_{[B,1,C]}

z=arcsinh(z)\mathbf{z} = \textrm{arcsinh}(\mathbf{z})

参数
x: torch.Tensor 输入张量。
mask: torch Tensor 布尔值,与 x 维度相同,True 表示 x 有效,False 表示应掩码 x。在 dim 维度的任何列中,mask 不应全为 False,以避免零除导致的 NaN。
eps (float, 可选): 用于避免零除的小值。默认为 1e-6。
dim (int, 可选): 计算中位数和 mad 的维度。默认为 -1。

返回值
z: 与 x 形状相同,但已缩放的 torch.Tensor。*


identity_statistics

 identity_statistics (x, mask, dim=-1, eps=1e-06)

*恒等缩放器*

一个占位符恒等缩放器,对参数不敏感。

参数
x: torch.Tensor 输入张量。
mask: torch Tensor 布尔值,与 x 维度相同,True 表示 x 有效,False 表示应掩码 x。在 dim 维度的任何列中,mask 不应全为 False,以避免零除导致的 NaN。
eps (float, 可选): 用于避免零除的小值。默认为 1e-6。
dim (int, 可选): 计算中位数和 mad 的维度。默认为 -1。

返回值
x: 原始的 torch.Tensor x。*

3. TemporalNorm 模块


TemporalNorm

 TemporalNorm (scaler_type='robust', dim=-1, eps=1e-06, num_features=None)

*时间归一化*

特征的标准化是许多机器学习估计器的常见要求,通常通过移除水平值并缩放其方差来实现。TemporalNorm 模块根据缩放器的类型对输入批次应用时间归一化。

z[B,T,C]=Scaler(x[B,T,C])\mathbf{z}_{[B,T,C]} = \textrm{Scaler}(\mathbf{x}_{[B,T,C]})

如果 scaler_typerevin,则在常规归一化技术之上添加可学习的归一化参数,参数通过尺度解耦全局跳跃连接学习。该技术适用于点预测和概率输出。

z^[B,T,C]=γ^[1,1,C]z[B,T,C]+β^[1,1,C]\mathbf{\hat{z}}_{[B,T,C]} = \boldsymbol{\hat{\gamma}}_{[1,1,C]} \mathbf{z}_{[B,T,C]} +\boldsymbol{\hat{\beta}}_{[1,1,C]}

参数
scaler_type: str, 定义 TemporalNorm 使用的缩放器类型。可用选项:[identity, standard, robust, minmax, minmax1, invariant, revin]。
dim (int, 可选): 计算尺度和偏移的维度。默认为 -1。
eps (float, 可选): 用于避免零除的小值。默认为 1e-6。
num_features: int=None, 用于类 RevIN 的可学习仿射参数初始化。

参考文献
- Kin G. Olivares, David Luo, Cristian Challu, Stefania La Vattiata, Max Mergenthaler, Artur Dubrawski (2023). “HINT: Hierarchical Mixture Networks For Coherent Probabilistic Forecasting”. Neural Information Processing Systems, 已提交。工作论文版本可在 arxiv 获取。
*


TemporalNorm.transform

 TemporalNorm.transform (x, mask)

*对数据进行中心化和缩放。*

参数
x: torch.Tensor,形状为 [batch, time, channels]。
mask: torch Tensor 布尔值,形状为 [batch, time],True 表示 x 有效,False 表示应掩码 x。在 dim 维度的任何列中,mask 不应全为 False,以避免零除导致的 NaN。

返回值
z: 与 x 形状相同,但已缩放的 torch.Tensor。*


TemporalNorm.inverse_transform

 TemporalNorm.inverse_transform (z, x_shift=None, x_scale=None)

*将数据缩放回原始表示。*

参数
z: torch.Tensor,形状为 [batch, time, channels],已缩放。

返回值
x: 原始的 torch.Tensor 数据。*

示例

import numpy as np
# Declare synthetic batch to normalize
x1 = 10**0 * np.arange(36)[:, None]
x2 = 10**1 * np.arange(36)[:, None]

np_x = np.concatenate([x1, x2], axis=1)
np_x = np.repeat(np_x[None, :,:], repeats=2, axis=0)
np_x[0,:,:] = np_x[0,:,:] + 100

np_mask = np.ones(np_x.shape)
np_mask[:, -12:, :] = 0

print(f'x.shape [batch, time, features]={np_x.shape}')
print(f'mask.shape [batch, time, features]={np_mask.shape}')
# Validate scalers
x = 1.0*torch.tensor(np_x)
mask = torch.tensor(np_mask)
scaler = TemporalNorm(scaler_type='standard', dim=1)
x_scaled = scaler.transform(x=x, mask=mask)
x_recovered = scaler.inverse_transform(x_scaled)

plt.plot(x[0,:,0], label='x1', color='#78ACA8')
plt.plot(x[0,:,1], label='x2',  color='#E3A39A')
plt.title('Before TemporalNorm')
plt.xlabel('Time')
plt.legend()
plt.show()

plt.plot(x_scaled[0,:,0], label='x1', color='#78ACA8')
plt.plot(x_scaled[0,:,1]+0.1, label='x2+0.1', color='#E3A39A')
plt.title(f'TemporalNorm \'{scaler.scaler_type}\' ')
plt.xlabel('Time')
plt.legend()
plt.show()

plt.plot(x_recovered[0,:,0], label='x1', color='#78ACA8')
plt.plot(x_recovered[0,:,1], label='x2', color='#E3A39A')
plt.title('Recovered')
plt.xlabel('Time')
plt.legend()
plt.show()