预测模型
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=start
for 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}")



