日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基本预测类算法

發(fā)布時間:2023/12/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基本预测类算法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一:灰色預(yù)測算法G(1,1),可用于小樣本時間序列預(yù)測。
首先,介紹相關(guān)基本概念。
白色系統(tǒng):系統(tǒng)的相關(guān)信息全部已知。
黑色系統(tǒng):系統(tǒng)全部信息未知。
灰色系統(tǒng):處于黑色和白色系統(tǒng)的過渡階段,只有部分信息已知。

算法流程:
??(1)對數(shù)據(jù)進(jìn)行處理和檢驗:計算數(shù)列的級比:前一項和后一項的比值。如果所有的級比都落在區(qū)間(e-2/(n+1),e2/(n+1))。則滿足數(shù)據(jù)滿足要求。如果不滿足的話,可以進(jìn)行平移變換,使得原數(shù)列中每一個數(shù)據(jù)加上常數(shù)c,至于c的值,以實驗為準(zhǔn)。
??(2)當(dāng)數(shù)據(jù)滿足要求后,就可以建立GM(1,1)模型。
x0(k)+az1(k)=b。求解的話利用最小二乘法,直接進(jìn)行求解。其中,
z1(k)=cx1(k)+(1-c)x1。在這里,要注意幾個符號的含義和區(qū)別。x1(k)是累加生成數(shù)列中的一項。上標(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)估計誤差,可以通過殘差檢驗或者級比偏差值檢驗。
python代碼如下:

def GM1_1(x0):#驗證數(shù)據(jù)是否可以用if check_data(x0) ==0:passelse:x0 = offset(x0)#計算AOGx0 = np.array(x0)x1 = np.cumsum(x0)#計算x1的均值生成序列x1 = pd.DataFrame(x1)z1 = (x1+x1.shift())/2.0#該項與該項的前一項相加除以2,用shift比循環(huán)代碼更簡單z1 = z1[1:].values.reshape((len(z1)-1,1))#再將剛剛算出的數(shù)據(jù)轉(zhuǎn)成ndarray,刪去nanB = np.append(-z1,np.ones_like(z1),axis=1)#合并數(shù)據(jù)形成B矩陣Y = x0[1:].reshape((len(x0)-1,1))#建立Y矩陣#計算參數(shù)a,b np.dot為點(diǎn)乘,np.linalg.inv為矩陣求逆[[a],[b]] = np.dot(np.dot((np.linalg.inv(np.dot(B.T,B))),B.T),Y)#方程求解 f(k+1)表示x1(k+1)f = lambda k: (x0[0]-b/a)*np.exp(-a*(k-1))-(x0[0]-b/a)*np.exp(-a*(k-2))#求出估計的所有x1的預(yù)測值,大小和x0一樣x1_pre = [f(k) for k in range(1,len(x0)+1)]#求x0的預(yù)測值#x1_pre = pd.DataFrame(x1_pre)delta = np.abs(x0 - np.array([f(i) for i in range(1,len(x0)+1)]))#檢驗預(yù)測值,利用殘差檢驗residual_error = np.abs(x0-np.array(x1_pre))residual_error_max = residual_error.max#級比偏差值檢驗p = [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]之間,可以實現(xiàn)分類功能,映射方法可以通過選定合適的激活函數(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è)計。BP神經(jīng)網(wǎng)絡(luò),三級層級結(jié)構(gòu):input layyer,hidden layyer,output layyer。
??輸入層神經(jīng)元個數(shù)是輸入特征的數(shù)目加上偏置節(jié)點(diǎn)數(shù)目。
??輸出層經(jīng)元個數(shù)是想要得到的結(jié)果的個數(shù)。
??對于隱藏層來說,神經(jīng)元數(shù)目極大程度影響網(wǎng)絡(luò)性能。一般是大規(guī)模調(diào)參得到最優(yōu)值,當(dāng)然,也有經(jīng)驗公式L=(n+m)1/2+a (1<a<10) 。
(4)模型訓(xùn)練,前向傳播計算loss,反向傳播更新權(quán)重。
接著,附上一道例題。
房價預(yù)測

import numpy as np import pandas as pd from matplotlib import pyplot as plt def sigmoid(x): # 第一層到第二層的激活函數(shù) return 1 / (1 + np.exp(-x)) def deriv_sigmoid(x): # 第一層到第二層的激活函數(shù)的求導(dǎo)函數(shù) fx = sigmoid(x) return fx * (1 - fx) def mse_loss(y_true, y_pred): # 使用方差作為損失函數(shù) return ((y_true - y_pred) ** 2).mean() class OurNeuralNetwork: def __init__(self): # 第一層到第二層的函數(shù) 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() # 第二層到第三層的函數(shù) self.w1 = np.random.normal() self.w2 = np.random.normal() # 截距項,Biases self.b1 = np.random.normal() self.b2 = np.random.normal() self.b3 = np.random.normal() def feedforward(self, x): # 前向傳播學(xué)習(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 #訓(xùn)練函數(shù) def train(self, data, all_y_trues): learn_rate = 0.01 # 學(xué)習(xí)率 epochs = 1000 # 訓(xùn)練的次數(shù) # 畫圖數(shù)據(jù) self.loss = np.zeros(100) self.sum = 0; # 開始訓(xùn)練 for epoch in range(epochs): for x, y_true in zip(data, all_y_trues): # 計算h1 h1 = sigmoid(self.w11 * x[0] + self.w12 * x[1] + self.w13 * x[2] + self.w14 * x[3] + self.b1) # 計算h2 h2 = sigmoid(self.w21 * x[0] + self.w22 * x[1] + self.w23 * x[2] + self.w24 * x[3] + self.b2) #計算輸出節(jié)點(diǎn) y_pred = self.w1 * h1 + self.w2 * h2 + self.b3 # 反向傳播計算導(dǎo)數(shù) 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" # 禁用科學(xué)計數(shù)法 pd.set_option('float_format', lambda x: '%.3f' % x) np.set_printoptions(suppress=True, threshold=np.nan) # 得到的DataFrame分別為總價、面積、房間、客廳、年份 data = pd.read_excel(FILENAME, header=0, usecols="A,D,H,I,J") # DataFrame轉(zhuǎn)化為array DataArray = data.values Y = DataArray[:, 0] X = DataArray[:, 1:5] X = np.array(X)#轉(zhuǎn)化為array,自變量 Y = np.array(Y)#轉(zhuǎn)化為array,因變量房價 # 處理數(shù)據(jù) 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) # 訓(xùn)練數(shù)據(jù) network = OurNeuralNetwork() network.train(data, all_y_trues) # 輸出神經(jīng)網(wǎng)絡(luò)參數(shù) 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) # 標(biāo)題顯示中文 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 測試數(shù)據(jù) testData = np.array([99, 3, 2, 2014]) testPrice = network.feedforward(testData) # 損失函數(shù)曲線圖 plt.plot(np.arange(100), network.loss) plt.show() # 真實值與預(yù)測值對比 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("紅色為真實值,藍(lán)色為預(yù)測值") plt.show()

時間序列預(yù)測
??主要用來,小樣本預(yù)測。基本特點(diǎn):假設(shè)事物的過去趨勢會延伸到未來。常用的模型有:自回歸AR,移動平均MA,ARMA模型等。注意:白噪聲隨機(jī)性過強(qiáng),不能做時間序列預(yù)測。
??要求數(shù)據(jù)具有平穩(wěn)性:即序列的均值和方差不發(fā)生明顯的變化,一般要求均值和協(xié)方差不隨時間變化。如果,序列不平穩(wěn),則無效。可以利用差分法轉(zhuǎn)換,求原始數(shù)據(jù)的一階差分,二階差分等等。
??接著,介紹AR模型。利用變量自身歷史數(shù)據(jù)對自身做預(yù)測。需要滿足平穩(wěn)性和自相關(guān)性。公式如下:
?? ???? Yt=a1Y(t-1)+a2Y(t-2)+……+anY(t-n)+Zt
也就是將t時刻前n個時刻,對應(yīng)的值做線性組合。zt是白噪聲。AR模型認(rèn)為,t時刻的值,只和自身的值有關(guān),而與系統(tǒng)在這些時刻中進(jìn)來的噪聲無關(guān)。
接著,是移動平均MA模型。和AR模型相反,系統(tǒng)認(rèn)為自身的值只和噪聲有關(guān),而與自身的值無關(guān)。
?? ????Yt=a1E(t-1)+a2E(t-2)+……+anE(t-n)+Zt
也就是將t時刻前n個時刻的白噪聲,對應(yīng)的值做線性組合。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模型的基礎(chǔ)上加入差分。即之前的序列是不平穩(wěn)的,在加入差分后,是平穩(wěn)的。如果采用了d階差分,結(jié)合上述ARMA模型,可得出ARIMA符合(p,d,q)階模型。

總結(jié)

以上是生活随笔為你收集整理的基本预测类算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。