基于python的灰色预测模型

灰色系统

我们称信息完全未确定的系统为黑色系统,称信息完全确定的系统为白色系统,灰色系统就是这介于这之间,一部分信息是已知的,另一部分信息是未知的,系统内各因素间有不确定的关系。

特点

  • 用灰色数学处理不确定量,使之量化。
  • 充分利用已知信息寻求系统的运动规律。
  • 灰色系统理论能处理贫信息系统。

直接上代码

首先引入所需要的库

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

data = pd.read_excel("E:/桌面/灰色预测.xlsx",sheet_name=1)
list1 = data["序列"]
tlist1 = [2014,2015,2016,2017,2018]

完整代码。

编写函数GM11(x,n)

fy = []
def GM11(x,n):
    '''
    灰色预测
    x:序列,numpy对象
    n:需要往后预测的个数
    '''
    x1 = x.cumsum()#一次累加  
    z1 = (x1[:len(x1) - 1] + x1[1:])/2.0#紧邻均值  
    z1 = z1.reshape((len(z1),1))  
    B = np.append(-z1,np.ones_like(z1),axis=1)  
    Y = x[1:].reshape((len(x) - 1,1))
    #a为发展系数 b为灰色作用量
    [[a],[b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y)#计算待估参数  
    result = (x[0]-b/a)*np.exp(-a*(n-1))-(x[0]-b/a)*np.exp(-a*(n-2))  #预测方程
    S1_2 = x.var()#原序列方差
    e = list()#残差序列
    for index in range(1,x.shape[0]+1):
        predict = (x[0]-b/a)*np.exp(-a*(index-1))-(x[0]-b/a)*np.exp(-a*(index-2))
        e.append(x[index-1]-predict)
        print(predict)    #预测值
        fy.append(predict)
    print("后验差检验")
    S2_2 = np.array(e).var()#残差方差
    C = S2_2/S1_2#后验差比
    if C<=0.35:
        assess = '后验差比<=0.35,模型精度等级为好'
    elif C<=0.5:
        assess = '后验差比<=0.5,模型精度等级为合格'
    elif C<=0.65:
        assess = '后验差比<=0.65,模型精度等级为勉强'
    else:
        assess = '后验差比>0.65,模型精度等级为不合格'
    #预测数据
    predict = list()
    for index in range(x.shape[0]+1,x.shape[0]+n+1):
        predict.append((x[0]-b/a)*np.exp(-a*(index-1))-(x[0]-b/a)*np.exp(-a*(index-2)))
    predict = np.array(predict)
  

    return {
            'a':{'value':a,'desc':'发展灰数'},
            'b':{'value':b,'desc':'控制灰数'},
            'predict':{'value':result,'desc':'第%d个预测值'%n},
            'C':{'value':C,'desc':assess},
            'predict':{'value':predict,'desc':'往后预测%d个的序列'%(n)},
            }
    
 
    
if __name__ == "__main__":
    data = np.array(list1)
    x = data[0:5]#输入数据
    #y = data[0:]#需要预测的数据
    result = GM11(x,1)
    predict = result['predict']['value']
    predict = np.round(predict,1)
    #print('真实值:',x)
    print('预测值:',predict)
    print(result)

print("残差检验")
a = []
for i in range(5):
    a.append(abs(fy[i]-list1[i]))
    print('%.5f%%' % ((abs(fy[i]-list1[i]))/list1[i]))
print("关联度检验")
c= []
for i in range(5):
    b = (min(a)+0.5*max(a))/(abs(a[i])+0.5*max(a))
    c.append(b)
print("ρ = 0.5 关联度为:",np.mean(c))
#print(y)
print(predict)
fy.append(3.8)

检验

后验差检验,关联度检验,残差检验。解释(上面代码已经包含)

 print("后验差检验")
    S2_2 = np.array(e).var()#残差方差
    C = S2_2/S1_2#后验差比
    if C<=0.35:
        assess = '后验差比<=0.35,模型精度等级为好'
    elif C<=0.5:
        assess = '后验差比<=0.5,模型精度等级为合格'
    elif C<=0.65:
        assess = '后验差比<=0.65,模型精度等级为勉强'
    else:
        assess = '后验差比>0.65,模型精度等级为不合格'

后验差检验检验结果判定

 关联度与残差检验。

print("残差检验")
a = []
for i in range(5):
    a.append(abs(fy[i]-list1[i]))
    print('%.5f%%' % ((abs(fy[i]-list1[i]))/list1[i]))
print("关联度检验")
c= []
for i in range(5):
    b = (min(a)+0.5*max(a))/(abs(a[i])+0.5*max(a))
    c.append(b)
print("ρ = 0.5 关联度为:",np.mean(c))

关联度检验结果大于0.6即可。

输出结果。

 对结果与源数据进行对比

#作图
import numpy as np
import matplotlib.pyplot as plt
x1 = np.array([2014,2015,2016,2017,2018])
y1 = np.array(x)
x2 = np.array([2014,2015,2016,2017,2018,2019])
y2 = np.array(fy)

plt.plot(x1,y1,'r*-',label='真实值曲线')   #真实值
plt.plot(x2,y2,'b+-',label='预测值曲线')   #预测值
plt.xlabel('年份')
plt.ylabel('值')
plt.legend()
plt.plot()
plt.show()

 利用python对灰色系统进行预测适用于短期预测,对长期预测效果并不是很好。若需要长期预测可使用ARIMA(p,d,q)模型。

嗨!对于使用Python实现GM(1,1)灰色预测模型,你可以按照以下步骤进行操作: 1. 导入所需的库: ``` import numpy as np import matplotlib.pyplot as plt ``` 2. 定义GM(1,1)灰色预测函数: ``` def gm11(x): n = len(x) # 累加生成 cum_x = np.cumsum(x) # 紧邻均值生成 z = (cum_x[:-1] + cum_x[1:]) / 2.0 # 紧邻均值级比生成 B = np.append(-z.reshape((n-2, 1)), np.ones_like(z.reshape((n-2, 1))), axis=1) Y = x[1:].reshape((n-1, 1)) # 矩阵运算求参数 [[a], [b]] = np.dot(np.dot(np.linalg.inv(np.dot(B.T, B)), B.T), Y) # 模型精度的后验差检验 delta = np.abs(Y - (a * z + b)) C = delta.std() / y.std() P = 1.0 * (np.abs(delta - delta.mean()) < 0.6745 * y.std()).sum() / len(delta) # 修正后的灰色预测模型 result = (x[0] - b / a) * np.exp(-a * (list(range(n)) - 1)) - (x[0] - b / a) * np.exp(-a * (list(range(n)) - 2)) # 预测数据 predict = np.abs(result - np.append(x[0], x[:-1])).tolist() return result, predict, C, P ``` 3. 输入数据并调用灰色预测函数进行预测: ``` x = np.array([1, 2, 3, 4, 5, 6]) # 输入数据 result, predict, C, P = gm11(x) # 调用GM(1,)灰色预测函数 ``` 4. 可视化结果: ``` plt.plot(list(range(len(x))), x, marker='o', label='原始数据') plt.plot(list(range(len(x))), result, marker='o', label='预测数据') plt.plot(list(range(len(x))), predict, marker='o', label='残差') plt.xlabel('x') plt.ylabel('y') plt.legend() plt.show() ``` 这样,你就可以使用Python编写GM(1,1)灰色预测模型了。希望对你有所帮助!如有其他问题,请随时提问。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据白白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值