预测模型算法
預測模型
1、灰色預測
適用范圍:它是一種基于小樣本數據進行預測的模型。灰色系統理論它主要針對時間序列少、統計數據少、信息不完全的分析和建模。
灰色系統:我們將信息完全未確定的系統為黑色系統,信息完全確定的為白色系統,既有已知信息又有未知信息的為灰色系統
灰色系統是對離散序列建立的微分方程,它通過對原始數據的整理來尋求其變化規律,也就是灰色序列的生產。
灰色生成:累加生成、累減生成、均值生成、級比生成
1數據檢驗
計算數列的級比,所有級比都落在可覆蓋區間(e-2/n+1,e2/n+1)內,則可以建立GM(1,1)模型
2構建模型
生成x1的鄰值生成序列z1,定義模型為:
d(k)+az1(k)=b
(a為發展系數,z1(k)為白化背景值,b為灰作用量)
1.1預測檢驗
殘差檢驗:
s(k)=x0(k)-x^0(k)/x0(k)
所有的|s(k)|<0.1,認為達到較高的要求,
|s(k)|<0.2認為達到一般要求
級比偏差值檢驗:
p(k)=1-(1-0.5a)/(1+0.5a)*s(k)/s^(k)
|p(k)|<0.1認為達到較高要求
|p(k)|<0.2認為達到一般要求
2、馬爾可夫鏈
狀態空間從一個狀態到另一個狀態轉換的隨機過程。它必須滿足兩個條件:
1 任意時刻可以用有限個可能狀態之一描述
2 無后效性
狀態向量:x=(x1,x2,x3,…xk)
各個元素分別表示第幾次觀測時第i個狀態的概率
系統的可能狀態為k個
p 轉移概率矩陣
x(n+1)=x(0)P(n)
3、線性回歸
線性回歸在因變量和一個或多個自變量之間建立一種關系 a為截距,b表示斜率,然后衡量自變量與因變量的相關程度 較多適用于數據多、計算簡單。
其表達形式為:y=w’x+e.其中e為誤差服從均值為0的正態分布
最小二乘法:以殘差平方和最小確定直線的位置
調用python的sklearn可以實現線性回歸算法,訓練模型,從而求出截距和斜率
//灰色預測 import numpy as np import pandas as pd def ratio(x0):n=len(x0)ratio=[x0[i]/x0[i+1] for i in range(n-1)]print(f"級比:{ratio}")min_r=min(ratio)max_r=max(ratio)r=[np.exp(-2/(n+2)),np.exp(2/(n+2))]print(r)if min_r >= r[0] and max_r <= r[1]:print("級比滿足要求")else:print("級比超過灰色模型預測范圍")return ratio,r def predict(x0):n=len(x0)x1=np.cumsum(x0) #累加序列z=(x1[:len(x1)-1]+x1[1:])/2 z1=z.reshape(len(z),1)B=np.append(-z1,np.ones_like(z1),axis=1)Y=x0[1:].reshape(n-1,1)u=np.dot(np.dot(np.linalg.inv(np.dot(B.T,B)),B.T),Y)x12=np.zeros(n)x02=np.zeros(n)x12[0]=x02[0]=x0[0]for i in range(1,n):x12[i]=(x0[0]-u[1]/u[0])*np.exp(-u[0]*i)+u[1]/u[0]for i in range(1,n):x02[i]=x12[i]-x12[i-1]print(f"原始值:{x0}")print(f"預測值:{x02}")return x02,x12,u def accuracy(x0,x02,ratio,u):n=len(x0)deltas=[]for i in range(n):eps=x0[i]-x02[i]delta=abs(eps/x0[i])deltas.append(delta)print(f"殘差:{deltas}")ratio2=[x02[i]/x02[i+1] for i in range(n-1)]rhos=[]for i in range(n-1):rho=1-(1-0.5*u[0]/u[1])/(1+0.5*u[0]/u[1])*(ratio[i]/ratio2[i])rhos.append(rho)print(f"級比偏差:{rhos}") if __name__=='__main__':x0=np.array([71.1,72.4,72.4,72.1,71.4,72.0,71.6])ratio,r=ratio(x0)x02,x12,u=predict(x0)accuracy(x0,x02,ratio,u) //馬爾可夫鏈 import numpy as np import random as rm def markov():start=np.array([1,0])trans=np.array([[0.286,0.714],[0.455,0.545]])restmp=startfor i in range(15):res=np.dot(restmp,trans)print(res)restmp=res markov() //線性回歸 import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression Model=LinearRegression() data={"學習時間":[0.50,0.75,1.00,1.25,1.50,1.75,2.00,2.25,2.50],"成績":[10,20,13,43,20,22,33,50,62]} df=pd.DataFrame(data) x=df['學習時間'] y=df['成績'] r=df.corr() print(f"相關系數:{r}") x=x.values.reshape(-1,1) y=y.values.reshape(-1,1) Model.fit(x,y) a=Model.intercept_[0] print(f"截距:{a}") b=Model.coef_[0][0] print(f"斜率:{b}")總結
- 上一篇: android群英传 自定义滑动view
- 下一篇: 陈潇冰php,webpack4.x入门到