元宵节 自回归模型

自回归模型(AutoRegression Model)可以用来预测时间序列将来的值,该模型假定前后值之间的关系是线性的。在使用该模型时,通常要假定一个随机变量的值依赖于它前面的值。我们要做的是拟合数据,为数据找到适当的参数。自回归模型的数学公式如下:
x t x_t xt=c+ ∑ i = 1 p a i ∗ x k \sum_{i=1}^{p}a_i*x_k i=1paixk+ g t g_t gt (k=t-i)
上述公式中,c为常量,最后一项为随机分量,又称为白噪声。
在进行回归分析时,如果在样本拟合程度非常好的情况下引入新的数据点,可能会出现拟合表现立刻变差的情况。我们可以通过交叉验证,或者使用没有过拟合问题的算法来解决这个问题。
下面通过scipy.optimize.least()函数来搭建一个模型,我们用太阳黑子的数据来训练该模型。代码如下:

'''Xu Yong Kang'''
from scipy.optimize import leastsq
import statsmodels.api as sm
import matplotlib.pyplot as plt
import numpy as np

#使用scipy.optimize.leastp函数来搭建模型
def model(p,x1,x10):
    p1,p10=p
    return p1*x1+p10*x10

def error(p,data,x1,x10):
    return data-model(p,x1,x10)

#拟合模型
def fit(data):
    p0=[0.5,0.5]
    params=leastsq(error,p0,args=(data[10:],data[9:-1],data[:-10]))
    return params

#在太阳黑子数据集上训练模型
data_loader=sm.datasets.sunspots.load_pandas()
sunspots=data_loader.data['SUNACTIVITY'].values
cutoff=0.9*len(sunspots)
params=fit(sunspots[:int(cutoff)])
print('Params',params)    #得到参数
print(params[0].shape)
print(params[1])
#预测值并计算各指标
pred=params[0][0]*sunspots[int(cutoff-1):-1]+params[0][1]*sunspots[int(cutoff-10):-10]
actual=sunspots[int(cutoff):]

print('Root mean square error',np.sqrt(np.mean((actual-pred)**2)))
print('Mean absolute error',np.mean(np.abs(actual-pred)))
print('Mean absolute percentage error',100*np.mean(np.abs(actual-pred)/actual))
print('Cofficient of determination',1-((actual-pred)**2).sum()/((actual-actual.mean())**2).sum())

year_range=data_loader.data['YEAR'].values[int(cutoff):]
plt.plot(year_range,actual,'x',label='Actual Sunspots',color='red')
plt.plot(year_range,pred,'o',label='Prediction',color='blue')
plt.grid(True)
plt.xlabel('Year')
plt.ylabel('Activity')
plt.legend()
plt.show()

我们可以从训练结果中得到参数

Params (array([0.67172672, 0.33626295]), 2)

通过这些可以得到预测值
太阳黑子预测
从图中我们可以发现,许多预测几乎是成功的,但也有一些效果很差。
注:
在pred的计算上存在一个关于numpy广播的问题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值