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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基本预测类算法

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

一:灰色預測算法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)#計算AOGx0 = np.array(x0)x1 = np.cumsum(x0)#計算x1的均值生成序列x1 = pd.DataFrame(x1)z1 = (x1+x1.shift())/2.0#該項與該項的前一項相加除以2,用shift比循環代碼更簡單z1 = z1[1:].values.reshape((len(z1)-1,1))#再將剛剛算出的數據轉成ndarray,刪去nanB = np.append(-z1,np.ones_like(z1),axis=1)#合并數據形成B矩陣Y = x0[1:].reshape((len(x0)-1,1))#建立Y矩陣#計算參數a,b np.dot為點乘,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的預測值,大小和x0一樣x1_pre = [f(k) for k in range(1,len(x0)+1)]#求x0的預測值#x1_pre = pd.DataFrame(x1_pre)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.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神經網絡預測
??我們將神經網絡輸出層映射到[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() # 截距項,Biases 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 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) #計算輸出節點 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) # 得到的DataFrame分別為總價、面積、房間、客廳、年份 data = pd.read_excel(FILENAME, header=0, usecols="A,D,H,I,J") # DataFrame轉化為array DataArray = data.values Y = DataArray[:, 0] X = DataArray[:, 1:5] X = np.array(X)#轉化為array,自變量 Y = np.array(Y)#轉化為array,因變量房價 # 處理數據 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)階模型。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。