生活随笔
收集整理的這篇文章主要介紹了
基本预测类算法
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一:灰色預(yù)測算法G(1,1),可用于小樣本時(shí)間序列預(yù)測。
首先,介紹相關(guān)基本概念。
白色系統(tǒng):系統(tǒng)的相關(guān)信息全部已知。
黑色系統(tǒng):系統(tǒng)全部信息未知。
灰色系統(tǒng):處于黑色和白色系統(tǒng)的過渡階段,只有部分信息已知。
算法流程:
??(1)對(duì)數(shù)據(jù)進(jìn)行處理和檢驗(yàn):計(jì)算數(shù)列的級(jí)比:前一項(xiàng)和后一項(xiàng)的比值。如果所有的級(jí)比都落在區(qū)間(e-2/(n+1),e2/(n+1))。則滿足數(shù)據(jù)滿足要求。如果不滿足的話,可以進(jìn)行平移變換,使得原數(shù)列中每一個(gè)數(shù)據(jù)加上常數(shù)c,至于c的值,以實(shí)驗(yàn)為準(zhǔn)。
??(2)當(dāng)數(shù)據(jù)滿足要求后,就可以建立GM(1,1)模型。
x0(k)+az1(k)=b。求解的話利用最小二乘法,直接進(jìn)行求解。其中,
z1(k)=cx1(k)+(1-c)x1。在這里,要注意幾個(gè)符號(hào)的含義和區(qū)別。x1(k)是累加生成數(shù)列中的一項(xiàng)。上標(biāo)1。表示使用原始數(shù)列,經(jīng)過一次累加得到。x1是表示通過原始數(shù)列,經(jīng)過一次累加得到的數(shù)列。
(3)求解相應(yīng)的白化方程:x1(t)’+ax1(t)=b。求解微分方程,得到解為:x1(t)=(x(0)(1)-b/a)e-a(t-1)+b/a。
(4)聯(lián)立得到預(yù)測值:x(1)(k+1)=(x(0)(1)-b/a)e-ak+b/a。
x0(k+1)=x1(k+1)-x1(k)。
(5)估計(jì)誤差,可以通過殘差檢驗(yàn)或者級(jí)比偏差值檢驗(yàn)。
python代碼如下:
def GM1_1(x0
):if check_data
(x0
) ==0:passelse:x0
= offset
(x0
)x0
= np
.array
(x0
)x1
= np
.cumsum
(x0
)x1
= pd
.DataFrame
(x1
)z1
= (x1
+x1
.shift
())/2.0z1
= z1
[1:].values
.reshape
((len(z1
)-1,1))B
= np
.append
(-z1
,np
.ones_like
(z1
),axis
=1)Y
= x0
[1:].reshape
((len(x0
)-1,1))[[a
],[b
]] = np
.dot
(np
.dot
((np
.linalg
.inv
(np
.dot
(B
.T
,B
))),B
.T
),Y
)f
= lambda k
: (x0
[0]-b
/a
)*np
.exp
(-a
*(k
-1))-(x0
[0]-b
/a
)*np
.exp
(-a
*(k
-2))x1_pre
= [f
(k
) for k
in range(1,len(x0
)+1)]delta
= np
.abs(x0
- np
.array
([f
(i
) for i
in range(1,len(x0
)+1)]))residual_error
= np
.abs(x0
-np
.array
(x1_pre
))residual_error_max
= residual_error
.maxp
= [1-((1-0.5*a
)/(1+0.5*a
))*l
for l
in lambda_k
]return a
,b
,residual_error_max
,p
,f
二 BP神經(jīng)網(wǎng)絡(luò)預(yù)測
??我們將神經(jīng)網(wǎng)絡(luò)輸出層映射到[0,1]之間,可以實(shí)現(xiàn)分類功能,映射方法可以通過選定合適的激活函數(shù)得到。同樣地,通過改變激活函數(shù),也可以實(shí)現(xiàn)預(yù)測功能。
一般流程如下:
(1)特征提取,特征提取的算法很多,選取合適的算法即可。當(dāng)然,具體問題具體分析。
(2)數(shù)據(jù)標(biāo)準(zhǔn)化處理:主要為消除不同特征之間量綱的影響。
(3)接著是,神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的設(shè)計(jì)。BP神經(jīng)網(wǎng)絡(luò),三級(jí)層級(jí)結(jié)構(gòu):input layyer,hidden layyer,output layyer。
??輸入層神經(jīng)元個(gè)數(shù)是輸入特征的數(shù)目加上偏置節(jié)點(diǎn)數(shù)目。
??輸出層經(jīng)元個(gè)數(shù)是想要得到的結(jié)果的個(gè)數(shù)。
??對(duì)于隱藏層來說,神經(jīng)元數(shù)目極大程度影響網(wǎng)絡(luò)性能。一般是大規(guī)模調(diào)參得到最優(yōu)值,當(dāng)然,也有經(jīng)驗(yàn)公式L=(n+m)1/2+a (1<a<10) 。
(4)模型訓(xùn)練,前向傳播計(jì)算loss,反向傳播更新權(quán)重。
接著,附上一道例題。
房價(jià)預(yù)測
import numpy
as np
import pandas
as pd
from matplotlib
import pyplot
as plt
def sigmoid(x
): return 1 / (1 + np
.exp
(-x
)) def deriv_sigmoid(x
): fx
= sigmoid
(x
) return fx
* (1 - fx
) def mse_loss(y_true
, y_pred
): return ((y_true
- y_pred
) ** 2).mean
() class OurNeuralNetwork: def __init__(self
): self
.w11
= np
.random
.normal
() self
.w12
= np
.random
.normal
() self
.w13
= np
.random
.normal
() self
.w14
= np
.random
.normal
() self
.w21
= np
.random
.normal
() self
.w22
= np
.random
.normal
() self
.w23
= np
.random
.normal
() self
.w24
= np
.random
.normal
() self
.w1
= np
.random
.normal
() self
.w2
= np
.random
.normal
() self
.b1
= np
.random
.normal
() self
.b2
= np
.random
.normal
() self
.b3
= np
.random
.normal
() def feedforward(self
, x
): h1
= sigmoid
(self
.w11
* x
[0] + self
.w12
* x
[1] + self
.w13
* x
[2] + self
.w14
* x
[3] + self
.b1
) h2
= sigmoid
(self
.w21
* x
[0] + self
.w22
* x
[1] + self
.w23
* x
[2] + self
.w24
* x
[3] + self
.b1
) o1
= self
.w1
* h1
+ self
.w2
* h2
+ self
.b3
return o1
def train(self
, data
, all_y_trues
): learn_rate
= 0.01 epochs
= 1000 self
.loss
= np
.zeros
(100) self
.sum = 0; for epoch
in range(epochs
): for x
, y_true
in zip(data
, all_y_trues
): h1
= sigmoid
(self
.w11
* x
[0] + self
.w12
* x
[1] + self
.w13
* x
[2] + self
.w14
* x
[3] + self
.b1
) h2
= sigmoid
(self
.w21
* x
[0] + self
.w22
* x
[1] + self
.w23
* x
[2] + self
.w24
* x
[3] + self
.b2
) y_pred
= self
.w1
* h1
+ self
.w2
* h2
+ self
.b3 d_L_d_ypred
= -2 * (y_true
- y_pred
) d_ypred_d_w1
= h1 d_ypred_d_w2
= h2 d_ypred_d_b3
= 0 d_ypred_d_h1
= self
.w1 d_ypred_d_h2
= self
.w2 sum_1
=self
.w11
* x
[0] + self
.w12
* x
[1] + self
.w13
* x
[2] + self
.w14
* x
[3] + self
.b1 d_h1_d_w11
= x
[0] * deriv_sigmoid
(sum_1
) d_h1_d_w12
= x
[1] * deriv_sigmoid
(sum_1
) d_h1_d_w13
= x
[2] * deriv_sigmoid
(sum_1
) d_h1_d_w14
= x
[3] * deriv_sigmoid
(sum_1
) d_h1_d_b1
= deriv_sigmoid
(sum_1
) sum_2
= self
.w21
* x
[0] + self
.w22
* x
[1] + self
.w23
* x
[2] + self
.w24
* x
[3] + self
.b2 d_h1_d_w21
= x
[0] * deriv_sigmoid
(sum_2
) d_h1_d_w22
= x
[1] * deriv_sigmoid
(sum_2
) d_h1_d_w23
= x
[2] * deriv_sigmoid
(sum_2
) d_h1_d_w24
= x
[3] * deriv_sigmoid
(sum_2
) d_h1_d_b2
= deriv_sigmoid
(sum_2
) self
.w11
-= learn_rate
* d_L_d_ypred
* d_ypred_d_h1
* d_h1_d_w11 self
.w12
-= learn_rate
* d_L_d_ypred
* d_ypred_d_h1
* d_h1_d_w12 self
.w13
-= learn_rate
* d_L_d_ypred
* d_ypred_d_h1
* d_h1_d_w13 self
.w14
-= learn_rate
* d_L_d_ypred
* d_ypred_d_h1
* d_h1_d_w14 self
.b1
-= learn_rate
* d_L_d_ypred
* d_ypred_d_h1
* d_h1_d_b1 self
.w21
-= learn_rate
* d_L_d_ypred
* d_ypred_d_h2
* d_h1_d_w21 self
.w22
-= learn_rate
* d_L_d_ypred
* d_ypred_d_h2
* d_h1_d_w22 self
.w23
-= learn_rate
* d_L_d_ypred
* d_ypred_d_h2
* d_h1_d_w23 self
.w24
-= learn_rate
* d_L_d_ypred
* d_ypred_d_h2
* d_h1_d_w24 self
.b2
-= learn_rate
* d_L_d_ypred
* d_ypred_d_h2
* d_h1_d_b2 self
.w1
-= learn_rate
* d_L_d_ypred
* d_ypred_d_w1 self
.w1
-= learn_rate
* d_L_d_ypred
* d_ypred_d_w2 self
.b3
-= learn_rate
* d_L_d_ypred
* d_ypred_d_b3
if epoch
% 10 == 0: y_preds
= np
.apply_along_axis
(self
.feedforward
, 1, data
) loss
= mse_loss
(all_y_trues
, y_preds
) print("Epoch %d loss: %.3f" % (epoch
, loss
)) self
.loss
[self
.sum] = loss self
.sum = self
.sum + 1
FILENAME
= "../data.xlsx"
pd
.set_option
('float_format', lambda x
: '%.3f' % x
)
np
.set_printoptions
(suppress
=True, threshold
=np
.nan
)
data
= pd
.read_excel
(FILENAME
, header
=0, usecols
="A,D,H,I,J")
DataArray
= data
.values
Y
= DataArray
[:, 0]
X
= DataArray
[:, 1:5]
X
= np
.array
(X
)
Y
= np
.array
(Y
)
data
= np
.array
(X
)
data_mean
= np
.sum(data
, axis
=0) / np
.size
(data
, 0)
data
= (data
- data_mean
) / np
.max(data
)
all_y_trues
= np
.array
(Y
)
all_y_trues_mean
= np
.sum(all_y_trues
) / np
.size
(all_y_trues
)
all_y_trues
= (all_y_trues
- all_y_trues_mean
) / np
.max(all_y_trues
)
network
= OurNeuralNetwork
()
network
.train
(data
, all_y_trues
)
print("w11-->%.3f" % network
.w11
)
print("w12-->%.3f" % network
.w12
)
print("w13-->%.3f" % network
.w13
)
print("w14-->%.3f" % network
.w14
)
print("w21-->%.3f" % network
.w21
)
print("w22-->%.3f" % network
.w22
)
print("w23-->%.3f" % network
.w23
)
print("w24-->%.3f" % network
.w24
)
print("w1-->%.3f" % network
.w1
)
print("w2-->%.3f" % network
.w2
)
print("b1-->%.3f" % network
.b1
)
print("b2-->%.3f" % network
.b2
)
print("b3-->%.3f" % network
.b3
)
plt
.rcParams
['font.sans-serif']=['SimHei']
plt
.rcParams
['axes.unicode_minus'] = False
testData
= np
.array
([99, 3, 2, 2014])
testPrice
= network
.feedforward
(testData
)
plt
.plot
(np
.arange
(100), network
.loss
)
plt
.show
()
y_preds
= np
.apply_along_axis
(network
.feedforward
, 1, data
)
plt
.plot
(np
.arange
(380), all_y_trues
,"r^")
plt
.plot
(np
.arange
(380),y_preds
,"bs")
plt
.title
("紅色為真實(shí)值,藍(lán)色為預(yù)測值")
plt
.show
()
時(shí)間序列預(yù)測
??主要用來,小樣本預(yù)測。基本特點(diǎn):假設(shè)事物的過去趨勢會(huì)延伸到未來。常用的模型有:自回歸AR,移動(dòng)平均MA,ARMA模型等。注意:白噪聲隨機(jī)性過強(qiáng),不能做時(shí)間序列預(yù)測。
??要求數(shù)據(jù)具有平穩(wěn)性:即序列的均值和方差不發(fā)生明顯的變化,一般要求均值和協(xié)方差不隨時(shí)間變化。如果,序列不平穩(wěn),則無效??梢岳貌罘址ㄞD(zhuǎn)換,求原始數(shù)據(jù)的一階差分,二階差分等等。
??接著,介紹AR模型。利用變量自身歷史數(shù)據(jù)對(duì)自身做預(yù)測。需要滿足平穩(wěn)性和自相關(guān)性。公式如下:
?? ???? Yt=a1Y(t-1)+a2Y(t-2)+……+anY(t-n)+Zt
也就是將t時(shí)刻前n個(gè)時(shí)刻,對(duì)應(yīng)的值做線性組合。zt是白噪聲。AR模型認(rèn)為,t時(shí)刻的值,只和自身的值有關(guān),而與系統(tǒng)在這些時(shí)刻中進(jìn)來的噪聲無關(guān)。
接著,是移動(dòng)平均MA模型。和AR模型相反,系統(tǒng)認(rèn)為自身的值只和噪聲有關(guān),而與自身的值無關(guān)。
?? ????Yt=a1E(t-1)+a2E(t-2)+……+anE(t-n)+Zt
也就是將t時(shí)刻前n個(gè)時(shí)刻的白噪聲,對(duì)應(yīng)的值做線性組合。zt是白噪聲
??將上述兩個(gè)模型整合在一起,得到ARMA模型:
Yt=a1Y(t-1)+a2Y(t-2)+……+apY(t-p)+Zt+b1E(t-1)+b2E(t-2)+……+bqE(t-q)+Zt
得到時(shí)間序列Yt服從(p,q)階自回歸方程。
ARIMA模型是在ARMA模型的基礎(chǔ)上加入差分。即之前的序列是不平穩(wěn)的,在加入差分后,是平穩(wěn)的。如果采用了d階差分,結(jié)合上述ARMA模型,可得出ARIMA符合(p,d,q)階模型。
總結(jié)
以上是生活随笔為你收集整理的基本预测类算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。