文章目錄
- 0.前言
- 一.時間序列
- 時間序列處理方法
- 二.灰色預測
- 2.1 GM(1,1)模型
- 2.2總結步驟
- 2.3GM(1,1)實戰
- 2.4python實作
- 總結
0.前言
該模型最重要的是擬合,比如線性,指數等擬合,對于已知的公式可以直接看出擬合型別,未知型別需要代碼擬合了,
一.時間序列
時間序列有點:一般用ARMA模型擬合時間序列,預測該時間序列未來值,Daniel檢驗平穩性,自動回歸AR(Auto regressive)和移動平均MA(Moving Average)預測模型,缺點就是:當遇到外界發生較大變化,往往會有較大偏差,時間序列預測法對于中短期預測的效果要比長期預測的效果好,
基于時間序列有三種:


時間序列處理方法
假設我們指導1到T的值,讓我們預測T+1的值,那么我們以平均值作為T+1D的預測值,

當然,也會有誤差:

該例子為平滑,以企業收入為例子:

該方法適用于數值比較穩定的資料,y10為一次移動平均,標準誤差,
二.灰色預測
在處理較少的特征值資料,不需要資料的樣本空間足夠大,就能解決歷史資料少、序列的完整性以及可靠性低的問題,能將無規律的原始資料進行生成得到規律較強的生成序列,缺點就是:只適用于中短期的預測,只適合近似于指數增長的預測,

2.1 GM(1,1)模型
適用于:一階微分方程,只含有1個變數的灰色模型,適用于有較強指數規律的序列,所涉及的序列有:累加序列和均值序列

我們如果對資料做了處理,加了一個闡述,最后預測結果要減去這個常數不要忘了,
程序:
一次累加生成序列:

均值生成序列

根據上面的結果,得到會微分方程:

白微分方程

求出a,b則得到x(1)和t關系,
a和b如何求解?最小二乘法

從而得到白微分方程:

x(0)是原始資料別完了,
2.2總結步驟
(1)原始序列(參考資料列):

(2)1次累加序列(1-AGO):

(3)1次累減序列(1-IAGO):

(也就是原始序列中,后一項依次減去前一項的值,例如,[x(2)-x(1),x(3-x(2),…,x(n)-x(n-1))],)
(4)均值生成序列:(這是對累加序列"(前一項+后一項)/2"得出的結果,)

畫個圖理一下思路:

2.3GM(1,1)實戰
使用GM(1,1)的預測檢驗“北方某城市1986年-1992年道路噪聲交通 平均聲級資料:

代碼為:
x0 = [71.1 72.4 72.4 72.1 71.4 72 71.6]'; %這里是列向量,相當于原始資料中因變數
n = length(x0);
lamda = x0(1:n-1)./x0(2:n) %計算級比
range = minmax(lamda') %計算級比的范圍
x1 = cumsum(x0)
B = [-0.5*(x1(1:n-1)+x1(2:n)),ones(n-1,1)]; %這是構造的資料矩陣B
Y = x0(2:n); %資料向量Y
u = B\Y %擬合引數u(1)=a,u(2)=b
syms x(t)
x = dsolve(diff(x)+u(1)*x==u(2),x(0)==x0(1)); %建立模型求解
xt = vpa(x,6) %以小數格式顯示微分方程的解
prediction1 = subs(x,t,[0:n-1]); %求已知資料的預測值
prediction1 = double(prediction1); %符號數轉換成數值型別,以便做差分運算
prediction = [x0(1),diff(prediction1)] %差分運算,還原資料
epsilon = x0'-prediction %計算殘差
delta = abs(epsilon./x0') %計算相對殘差
rho = 1-(1-0.5*u(1))/(1+0.5*u(1))*lamda'%計算級比偏差值,u(1)=a
回傳:

2.4python實作
# coding=gbk
"""
作者:川川
@時間 : 2021/9/2 3:57
群:970353786
"""
import numpy as np
import math
#對資料進行級比檢驗,若不符合進行平移變換,并回傳變換后的資料,以及變換次數
def deal_data(data, c):
times = 0
while True:
i = 1
while i < len(data):
proportion = data[i - 1] / data[i]
if math.exp(-2 / (len(data) + 1)) < proportion < math.exp(2 / (len(data) + 1)):
i = i + 1
else:
data = data + [c] * len(data)
times += 1
break
if i == len(data):
break
return data, times
#預測
def predict(data):
x1 = data.cumsum()
B1 = -(x1[:len(x1) - 1] + x1[1:]) / 2.0
B = np.array([B1, np.ones_like(B1)]).T
Y = data[1:]
u = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y)
a, b = u[0], u[1]
return np.array([(data[0] - b / a) * math.exp(-a * i) + b / a for i in range(len(data))])
#上面都是固定的演算法,可以copy
if __name__ == '__main__':
x = np.array([71.1, 72.4, 72.4, 72.1, 71.4, 72.0, 71.6])#已有資料
c = 0.1 # 平移常數,自行設定
data, times = deal_data(x, c) # 資料檢驗,并回傳平移后的資料,和平移次數
predict_data = predict(data) # 預測x1
result = np.ediff1d(predict_data) # 遞減
result = result - c * times # 減去平移的影響
print(result)#預測結果
print((np.array(result[:len(x)]) - np.array(x[1 :len(x)])) / np.array(x[1 :len(x)]))#標準差
回傳:

總結
似乎有點繞,這里我也參考了很多資料,演算法都一致,代碼基本都差不多,這里先說個大概,明天我講一個實戰縷一縷,到時候我再看這一篇文章怎么修改一下,暫時先發出來了,有問題留言指正,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297066.html
標籤:AI
上一篇:資料結構基礎-樹和二叉樹
