Deep Factors是一种global-local组合的框架预测模型,根据论文里给出的实验结果,Deep Factors的总体性能要优于现阶段主流的区间预测算法DeepAR和MQ-RNN。
    优势:1.速度更快;2.学习参数少;3.global-local组合比seq2seq结构更加灵活高效。
    Deep Factors一般有三种结构形式,本文复现的是第一种,即运用RNN求取sigma值。
    image.png

    image.png
    image.png

    1. class DeepFactor(nn.Module):
    2. def __init__(self, input_size, global_nlayers, global_hidden_size, n_global_factors):
    3. super(DeepFactor, self).__init__()
    4. self.lstm = nn.LSTM(input_size, global_hidden_size, global_nlayers, \
    5. bias=True, batch_first=True)
    6. self.factor = nn.Linear(global_hidden_size, n_global_factors)
    7. def forward(self, X):
    8. num_ts, num_features = X.shape
    9. X = X.unsqueeze(1)
    10. _, (h, c) = self.lstm(X)
    11. ht = h[-1, :, :] # num_ts, global factors
    12. ht = F.relu(ht)
    13. gt = ht
    14. return gt.view(num_ts, -1)
    15. class Noise(nn.Module):
    16. def __init__(self, input_size, noise_nlayers, noise_hidden_size):
    17. super(Noise, self).__init__()
    18. self.lstm = nn.LSTM(input_size, noise_hidden_size,
    19. noise_nlayers, bias=True, batch_first=True)
    20. self.affine = nn.Linear(noise_hidden_size, 1)
    21. def forward(self, X):
    22. num_ts, num_features = X.shape
    23. X = X.unsqueeze(1)
    24. _, (h, c) = self.lstm(X)
    25. ht = h[-1, :, :] # num_ts, global factors
    26. ht = F.relu(ht)
    27. sigma_t = self.affine(ht)
    28. sigma_t = torch.log(1 + torch.exp(sigma_t))
    29. return sigma_t.view(-1, 1)
    30. class DFRNN(nn.Module):
    31. def __init__(self, input_size, noise_nlayers, noise_hidden_size,
    32. global_nlayers, global_hidden_size, n_global_factors):
    33. super(DFRNN, self).__init__()
    34. self.noise = Noise(input_size, noise_hidden_size, noise_nlayers)
    35. self.global_factor = DeepFactor(input_size, global_nlayers,
    36. global_hidden_size, n_global_factors)
    37. self.embed = nn.Linear(global_hidden_size, n_global_factors)
    38. def forward(self, X,):
    39. if isinstance(X, type(np.empty(2))):
    40. X = torch.from_numpy(X).float()
    41. num_ts, num_periods, num_features = X.size()
    42. mu = []
    43. sigma = []
    44. for t in range(num_periods):
    45. gt = self.global_factor(X[:, t, :])
    46. ft = self.embed(gt)
    47. ft = ft.sum(dim=1).view(-1, 1)
    48. sigma_t = self.noise(X[:, t, :])
    49. mu.append(ft)
    50. sigma.append(sigma_t)
    51. mu = torch.cat(mu, dim=1).view(num_ts, num_periods)
    52. sigma = torch.cat(sigma, dim=1).view(num_ts, num_periods) + 1e-6
    53. return mu, sigma