生活随笔
收集整理的這篇文章主要介紹了
基本预测类算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:灰色預測算法G(1,1),可用于小樣本時間序列預測。
首先,介紹相關基本概念。
白色系統:系統的相關信息全部已知。
黑色系統:系統全部信息未知。
灰色系統:處于黑色和白色系統的過渡階段,只有部分信息已知。
算法流程:
??(1)對數據進行處理和檢驗:計算數列的級比:前一項和后一項的比值。如果所有的級比都落在區間(e-2/(n+1),e2/(n+1))。則滿足數據滿足要求。如果不滿足的話,可以進行平移變換,使得原數列中每一個數據加上常數c,至于c的值,以實驗為準。
??(2)當數據滿足要求后,就可以建立GM(1,1)模型。
x0(k)+az1(k)=b。求解的話利用最小二乘法,直接進行求解。其中,
z1(k)=cx1(k)+(1-c)x1。在這里,要注意幾個符號的含義和區別。x1(k)是累加生成數列中的一項。上標1。表示使用原始數列,經過一次累加得到。x1是表示通過原始數列,經過一次累加得到的數列。
(3)求解相應的白化方程:x1(t)’+ax1(t)=b。求解微分方程,得到解為:x1(t)=(x(0)(1)-b/a)e-a(t-1)+b/a。
(4)聯立得到預測值:x(1)(k+1)=(x(0)(1)-b/a)e-ak+b/a。
x0(k+1)=x1(k+1)-x1(k)。
(5)估計誤差,可以通過殘差檢驗或者級比偏差值檢驗。
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神經網絡預測
??我們將神經網絡輸出層映射到[0,1]之間,可以實現分類功能,映射方法可以通過選定合適的激活函數得到。同樣地,通過改變激活函數,也可以實現預測功能。
一般流程如下:
(1)特征提取,特征提取的算法很多,選取合適的算法即可。當然,具體問題具體分析。
(2)數據標準化處理:主要為消除不同特征之間量綱的影響。
(3)接著是,神經網絡結構的設計。BP神經網絡,三級層級結構:input layyer,hidden layyer,output layyer。
??輸入層神經元個數是輸入特征的數目加上偏置節點數目。
??輸出層經元個數是想要得到的結果的個數。
??對于隱藏層來說,神經元數目極大程度影響網絡性能。一般是大規模調參得到最優值,當然,也有經驗公式L=(n+m)1/2+a (1<a<10) 。
(4)模型訓練,前向傳播計算loss,反向傳播更新權重。
接著,附上一道例題。
房價預測
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
("紅色為真實值,藍色為預測值")
plt
.show
()
時間序列預測
??主要用來,小樣本預測?;咎攸c:假設事物的過去趨勢會延伸到未來。常用的模型有:自回歸AR,移動平均MA,ARMA模型等。注意:白噪聲隨機性過強,不能做時間序列預測。
??要求數據具有平穩性:即序列的均值和方差不發生明顯的變化,一般要求均值和協方差不隨時間變化。如果,序列不平穩,則無效。可以利用差分法轉換,求原始數據的一階差分,二階差分等等。
??接著,介紹AR模型。利用變量自身歷史數據對自身做預測。需要滿足平穩性和自相關性。公式如下:
?? ???? Yt=a1Y(t-1)+a2Y(t-2)+……+anY(t-n)+Zt
也就是將t時刻前n個時刻,對應的值做線性組合。zt是白噪聲。AR模型認為,t時刻的值,只和自身的值有關,而與系統在這些時刻中進來的噪聲無關。
接著,是移動平均MA模型。和AR模型相反,系統認為自身的值只和噪聲有關,而與自身的值無關。
?? ????Yt=a1E(t-1)+a2E(t-2)+……+anE(t-n)+Zt
也就是將t時刻前n個時刻的白噪聲,對應的值做線性組合。zt是白噪聲
??將上述兩個模型整合在一起,得到ARMA模型:
Yt=a1Y(t-1)+a2Y(t-2)+……+apY(t-p)+Zt+b1E(t-1)+b2E(t-2)+……+bqE(t-q)+Zt
得到時間序列Yt服從(p,q)階自回歸方程。
ARIMA模型是在ARMA模型的基礎上加入差分。即之前的序列是不平穩的,在加入差分后,是平穩的。如果采用了d階差分,結合上述ARMA模型,可得出ARIMA符合(p,d,q)階模型。
總結
以上是生活随笔為你收集整理的基本预测类算法的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。