基於sparkts的時間序列預測
一. Arima理論基礎
可自行google或參考:
http://www.cnblogs.com/bradleon/p/6827109.html
http://people.duke.edu/~rnau/411arim.htm
二. 基於sparkts進行實操(單機版)
/**
* 單機版 時間序列預測
*@authorNeilWang
*/
objectSingleTimeSeriesor{
defmain(args:Array[String]):Unit={
/**
* 讀取樣本數據:
* 2017/3/23,38716.188
* 2017/3/24,34687.2
* 2017/3/25,35339.844
*/
vallines=scala.io.Source.fromFile("/Users/wangjh/Desktop/program/sbt-project/dh-model/gmv_2017.csv").getLines()
valtsVector=Vectors.dense(lines.filter(!_.split(",")(1).equals("gmv")).map(_.split(",")(1).toDouble).toArray)
/**
* 檢查時序數據的穩定性:製圖查看
* 如何變穩定:Differencing--差分
*/
// 製圖,查看原始樣本 是否 數據穩定
valf_source=EasyPlot.ezplot(tsVector)
println(f_source)
// 一階差分,查看是否穩定
vald1vector=differencesOfOrderD(tsVector,1)
valf_d1=EasyPlot.ezplot(d1vector)
println(f_d1)
/**
* 通過對自相關圖和偏自相關圖的分析,得到最佳的階層 p 和階數 q
*/
// 自相關圖
valf_acf=EasyPlot.acfPlot(d1vector.toArray,50)
println(f_acf)
// 偏自相關圖
valf_pacf=EasyPlot.pacfPlot(d1vector.toArray,50)
println(f_pacf)
/**
* 圖中,上下兩條紅線之間是置信區間,p的值就是ACF第一次穿過上置信區間時的橫軸值。q的值就是PACF第一次穿過上置信區間的橫軸值。
* 所以從圖中可以得到p=6,q=28。
* 註:若圖中沒有穿過上置信空間,則增大參數 maxLag 重新製圖。
*/
valpdq=(6,1,28)
/**
* 得到參數估計值p,d,q之後,生成模型ARIMA(p,d,q)進行預測
*/
valarimaModel=ARIMA.fitModel(pdq._1,pdq._2,pdq._3,tsVector,true,"css-cgd")
valpredictedN=14
valforecast=arimaModel.forecast(tsVector,predictedN)
//取出預測值
valpartArray=forecast.toArray.mkString(",").split(",")
vari=partArray.length-predictedN
while(i
forecastArrayBuffer+=partArray(i).toDouble
i=i+1
}
println(s"forecast of next $predictedNobservations: "+forecastArrayBuffer.toArray.mkString(","))
}
}
三. 相關圖


TAG:全球大搜羅 |