最近一直在做时序数列预测的东东,因为数据本身的特点想到了MarKov算法,但效果并不理想,后来想到了ARIMA(自回归差分滑动平均算法),
一. ARIMA算法
其形式分为AR、MA、ARMA,其核心意义,是确定当前数据与过去几天数据之间有相互的关系(仅与过去数据有关为AR模型),或者跟过去几天的噪声有关(仅与噪声有关为MA模型)与过去数据、噪声都有关则为ARMA模型。其流程为:
1.检验时序数列是否为平稳序列,所谓平稳,形象上说就是数列均值固定,方差固定,准确说,平稳数列需要经过单位根检验;如果不平稳,可以做一阶差分,再检验是否平稳,如不,做二阶差分直到平稳为止。
2. 定阶,所谓定阶,就是确定当前数据到底跟过去几天数据有关,这一步,同时选定模型,根据自相关、偏自相关函数的截尾、拖尾情况选定模型,其中过去几天数据的系数由偏相关系数决定,噪声系数由自相关系数决定。具体选取需要计算各选定模型的AIC值,选取最小AIC对应的模型,作为最终模型。
3. 检验模型参数的显著性,同时检验模型残差是否为高斯白噪声,如果是高斯白噪声说明,模型基本提取到数据的特征,能很好拟合数据,否则,回到步骤2
该算法有对应的专业软件,EVIEWS,但是该算法有一个弊端,需要人为定阶,其次,效果未必好,这是最头疼的地方
二. Elman 神经网络
Elman跟传统神经网络的差别支出在于,它多了一个copy层,该copy层仅仅是保留隐藏层上一次的输出,在这一次计算隐藏侧输出的时候,用到copy层值,也就是这一次的隐藏侧输出受到了上一次隐藏侧输出的影响。其训练方式同样是BP算法,需要说明的是,Elman输入结点数目一旦确定,其输入样本的处理就一定,举例俩说,比如有一个时序数列,该数列是一天产生1个数据,前5天的数据是:2,4,6,8,9,现在输入结点为3,那么样本为:①input:2,4,6,label:8。②input:4,6,8 label:9。这就是样本的处理方式,当然样本可能需要归一化等处理,这都属于预处理范畴,不做讨论。基于Python的Elman工具包PyNeurGen,里面包含丰富的神经网络包,对于java爱好者,可以调用Encog Machine Learning Framework,它同时包含C#版本,对应user guide ,Elman做时序数列的预测,其弊端对应神经网络的一些弊端,比如结点数目的选取,迭代次数的设定等,但是其效果大体上让人满意,对于神经网络做时序数列预测,对应还有Jordan Neural network, NAR network, NARX neteork。都可以参考,他们统称为递归神经网络,他们的特点都是保存某一层或者基层结点上一次的输出,并作用于这一次的计算。这样就将数据的时序性体现出来了。。上面对应的几种网络在参考包里都有不同程度的涉及,有的甚至包含全部递归网络结构。
三 基于 tensorflow 的时序数列预测方法
Tensorflow1.3版本中,加入了一个Tensorflow Time Series 模块(源码地址,简称TFTS),TFTS 专门设计了一套针对时间序列预测问题的API,目前提供了AR、Anomaly Mixture AR、LSTM三种预测模式,甚至还有GPU选项