如何使用SGD进行时间序列分析

时间:2012-05-31 16:52:18

标签: machine-learning signal-processing time-series classification regression

是否可以使用stochastic gradient descent进行时间序列分析?

我的初步想法,给定一系列(t,v)对,我希望SGD回归量预测与t + 1相关的v,将日期/时间转换为整数值,并训练回归量在此列表中使用铰链损失功能。这可行吗?

编辑:这是使用scikit-learn中的SGD implementation的示例代码。但是,它无法正确预测简单的线性时间序列模型。它似乎只是计算训练Y值的平均值,并将其用作测试Y值的预测值。 SGD是否不适合进行时间序列分析,还是我错误地制定了这个?

from datetime import date
from sklearn.linear_model import SGDRegressor

# Build data.
s = date(2010,1,1)
i = 0
training = []
for _ in xrange(12):
    i += 1
    training.append([[date(2012,1,i).toordinal()], i])
testing = []
for _ in xrange(12):
    i += 1
    testing.append([[date(2012,1,i).toordinal()], i])

clf = SGDRegressor(loss='huber')

print 'Training...'
for _ in xrange(20):
    try:
        print _
        clf.partial_fit(X=[X for X,_ in training], y=[y for _,y in training])
    except ValueError:
        break

print 'Testing...'
for X,y in testing:
    p = clf.predict(X)
    print y,p,abs(p-y)

3 个答案:

答案 0 :(得分:3)

您应该查看LMS算法。它是一种自适应维纳滤波器,可用于预测或任何其他任务。 LMS基于随机梯度下降。还有许多其他变种,如NLMS,Leaky LMS,Sign LMS。

答案 1 :(得分:1)

sklearn中的 SGDRegressor对于不按比例缩放的输入参数在数值上不稳定。为了获得良好的结果,强烈建议您缩放输入变量。

from datetime import date
from sklearn.linear_model import SGDRegressor

# Build data.
s = date(2010,1,1).toordinal()
i = 0
training = []
for _ in range(1,13):
    i += 1
    training.append([[s+i], i])
testing = []
for _ in range(13,25):
    i += 1
    testing.append([[s+i], i])

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform([X for X,_ in training])

在训练了SGD回归器之后,您将必须相应地缩放测试输入变量。

clf = SGDRegressor()
clf.fit(X=X_train, y=[y for _,y in training])

print(clf.intercept_, clf.coef_)

print('Testing...')
for X,y in testing:
    p = clf.predict(scaler.transform([X]))
    print(X[0],y,p[0],abs(p[0]-y))

这是结果:

[6.31706122] [3.35332573]
Testing...
733786 13 12.631164799851827 0.3688352001481725
733787 14 13.602565350686039 0.39743464931396133
733788 15 14.573965901520248 0.42603409847975193
733789 16 15.545366452354457 0.45463354764554254
733790 17 16.51676700318867 0.48323299681133136
733791 18 17.488167554022876 0.5118324459771237
733792 19 18.459568104857084 0.5404318951429161
733793 20 19.430968655691295 0.569031344308705
733794 21 20.402369206525506 0.5976307934744938
733795 22 21.373769757359714 0.6262302426402861
733796 23 22.34517030819392 0.6548296918060785
733797 24 23.316570859028133 0.6834291409718674

答案 2 :(得分:0)

嗯,这不是一个编程问题。但是,无论如何......

时间序列预测的首选方法取决于您对时间序列的了解。如果为任务选择特定方法,则始终对信号的性质和生成信号的系统类型做出隐含的假设。任何方法始终是系统的模型。您对信号和系统的先验知识越多,您就越能够对其进行建模。

如果您的信号具有随机性,通常ARMA过程或卡尔曼滤波器是一个不错的选择。如果那些失败了,其他更确定的模型可能对corse有帮助,你有一些关于你系统的信息。