问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

数学建模1:灰色预测模型

创作时间:
作者:
@小白创作中心

数学建模1:灰色预测模型

引用
CSDN
1.
https://blog.csdn.net/gr1423428723/article/details/142325343

灰色预测模型是一种用于处理不完全信息的预测方法,适用于 数据样本少系统不确定性高 的情况。

灰色预测模型的核心思想是 利用已有的部分信息对未来进行预测 。它的基本形式是 灰色模型GM(1,1) ,其中“1”表示一个方程、一个变量的模型。这个模型通过对原始数据序列进行累加生成序列,然后建立一个 差分方程 进行建模,最后利用这个模型来预测未来的数据。本文按照最基础的 单序列,一阶 模型

解题:

假设我们有一个时间序列数据(比如月销售量)如下:

求解:使用灰色模型预测第6个月的销量

1:计算累加生成序列

解得累加生成序列:

2.建立差分方程:

解均值序列为:

3.构造矩阵:

目标矩阵:

4.使用最小二乘法求解模型参数

求解目标方程为:

化为矩阵形式:

也就是如下形式

最小二乘法就是求取最小值时的U

求解U的估计值为:

求出a和b的值带入到微分方程中:

计算得:

a = -0.1173

b = 29.7412

带入得

python代码:

import numpy as np
import matplotlib.pyplot as plt

class GM11:
    def __init__(self, X, T):
        self.X = X
        self.T = T
        self.X1= []
        self.Z = []
        self.U = None
    def caculateXSum(self):#计算X1矩阵和Z矩阵
        count = 0
        X1 = []
        Z  = []

        for i in range(0, len(self.X),1):
            count = count + self.X[i]
            X1.append(count)
        for j in range(0, len(X1) - 1,1):
            Z.append((X1[j] + X1[j + 1])/2)
        self.X1 = X1
        self.Z = Z
    def caculateAB(self):#计算U矩阵的值
        Y = (np.array(self.X[1:])).reshape(-1,1)
        B = np.array(self.Z)*-1
        ones_column = np.ones((B.shape[0], 1))
        B = np.hstack((B.reshape(-1,1), ones_column))
        #print(B)
        #print(Y)
        self.U = np.linalg.inv(B.T @ B) @ B.T @ Y
        #self.U = np.dot(np.linalg.inv(np.dot(B.T,B)),np.dot((B.T),Y))
    def caculateX(self, t):#计算最终的X
        if self.U is None:
            self.caculateXSum()
            self.caculateAB()
        t = t - 1
        a = self.U[0]
        b = self.U[1]
        result = (self.X[0] - b/a)*(np.e ** (-1*a*(t))) + b/a
        return  result[0]

X = np.array([30, 35, 40, 45, 50])
T = np.array([1, 2, 3, 4, 5])
GM11 = GM11(X, T)
n = 6#预测第n个值
result = GM11.caculateX(6)
print(f'解得u矩阵为:{GM11.U[0]},{GM11.U[1]}')
print(f'预测得x({n})的值为:{result}')
#print(X)

#绘图
X1 =  GM11.X1
for i in range(1,4,1):
    X1.append(GM11.caculateX(5 + i))
#print(X1)
X = []
X.append(X1[0])
for i in range(1, len(X1), 1):
    X.append(X1[i] - X1[i - 1])
plt.plot(range(len(X) - 3), X[0:-3], 'o-', label='Original')
plt.plot(range(len(X) - 4, len(X)), X[-4:], 'x--', label='Future Prediction')
plt.legend()
plt.show()

效果图:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号