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

ops/2024/10/25 12:26:41/

灰色预测模型:

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

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

解题:

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

月销量3035404550
第几月12345

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

1:计算累加生成序列x_{1}(t)

x_{1}(1)=x(1)=30

x_{1}(2)=x(1)+x(2)=30+35=65

x_{1}(3)=x(1)+x(2)+x(3)=30+35+40=105

x_{1}(4)=x(1)+x(2)+x(3)+x(4)=30+35+40+45=150

x_{1}(5)=x(1)+x(2)+x(3)+x(4)+x(5)=30+35+40+45+50=200

解得累加生成序列:

x_{1}(t)=[30,65,105,150,200]

2.建立差分方程:z(t)

z(2) = \frac{x_{1}(1) + x_{1}(2)}{2} = \frac{30 + 65}{2} = 47.5

z(3) = \frac{x_{1}(2) + x_{1}(3)}{2} = \frac{65 + 105}{2} = 85

z(4) = \frac{x_{1}(3) + x_{1}(4)}{2} = \frac{105 + 150}{2} = 127.5

z(5) = \frac{x_{1}(4) + x_{1}(5)}{2} = \frac{150 + 200}{2} = 175

解均值序列为:

z(t) = [47.5,85,127.5,175]

3.构造矩阵:

B = \begin{pmatrix} -47.5\\ -85\\ -127.5\\ -175\\ \end{pmatrix}

目标矩阵:

Y = \begin{pmatrix} 35\\ 40\\45\\50\\ \end{pmatrix}

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

求解目标方程为:

x_{0}(t) = u - az(t)

化为矩阵形式:

Y = BU也就是如下形式

\begin{pmatrix} 35\\ 40\\45\\50\\ \end{pmatrix} = \begin{pmatrix} -47.5& 1\\-85 &1 \\ -127.5&1 \\ -175&1 \end{pmatrix}\begin{pmatrix} a\\ b \end{pmatrix}

 最小二乘法就是求(Y-BU)^{T}(Y-BU)取最小值时的U

求解U的估计值为:\hat{U} = [\hat{a},\hat{b}]^{T} = (B^{T}B)^{-1}B^{T}Y

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

x_{1}(t + 1) = (x_{0}(1) - \frac{b}{a})e^{-at} + \frac{b}{a}

计算得:

a = -0.1173

b = 29.7412

带入得

x_{1}(6) = 256.2

x_{0}(6) = 56.2

python代码:

import numpy as np
import matplotlib.pyplot as pltclass GM11:def __init__(self, X, T):self.X = Xself.T = Tself.X1= []self.Z = []self.U = Nonedef caculateXSum(self):#计算X1矩阵和Z矩阵count = 0X1 = []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 = X1self.Z = Zdef caculateAB(self):#计算U矩阵的值Y = (np.array(self.X[1:])).reshape(-1,1)B = np.array(self.Z)*-1ones_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):#计算最终的Xif self.U is None:self.caculateXSum()self.caculateAB()t = t - 1a = self.U[0]b = self.U[1]result = (self.X[0] - b/a)*(np.e ** (-1*a*(t))) + b/areturn  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()

效果图:

 


http://www.ppmy.cn/ops/128329.html

相关文章

oracle和hive之间关于sql的语法差异及转换

目录 前言 1、oracle中的()写法 1.1、区分左右连接 1.2、hive中的写法 a、最常用 b、副表带条件 c、只显示过滤条件的数据 2、select中含有子查询 3、oracle的decode函数 4、oracle的时间转化 5、oracle的trunc函数 6、oracle instr函数 7…

【ChatGPT】编写结构化 Prompt 的技巧

编写结构化 Prompt 的技巧 在与 ChatGPT 互动时,结构化 Prompt 是提升模型输出质量的有效手段。通过使用清晰的格式、分步指导以及明确的任务要求,您可以获得更符合预期的输出。本文将介绍如何通过编写结构化 Prompt 来优化 ChatGPT 的生成结果。 一、…

Crawler4j在多线程网页抓取中的应用

网页爬虫作为获取网络数据的重要工具,其效率和性能直接影响到数据获取的速度和质量。Crawler4j作为一个强大的Java库,专门用于网页爬取,提供了丰富的功能来帮助开发者高效地抓取网页内容。本文将探讨如何利用Crawler4j进行多线程网页抓取&…

Ubuntu20.04 更新Nvidia驱动 + 安装CUDA12.1 + cudnn8.9.7

一、概述 最近客户给了几台GPU服务器,长期放置落灰那种,然后想利用起来,所以上去看看了配置,系统是Ubuntu20.04,相关的驱动版本稍嫌老一些,所以需要更新Nvidia驱动,同时在安装CUDA和CUDNN&#…

Leetcode 柱状图中最大的矩形

h 是右边界&#xff0c;连续多个高度递增的柱子&#xff0c;如果遇到下一个 h < 栈顶元素(是最大的元素&#xff0c;单调递增栈)&#xff0c;那么会不断出栈来更新计算最大面积。 并非是一次性计算出最大面积的&#xff0c;很重要的一点是while (!stack.isEmpty()这一部分的…

教育平台的创新设计:Spring Boot实现

3系统分析 3.1可行性分析 通过对本信息化在线教学平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本信息化在线教学平台采用Spring Boot框架&#xff0c;JA…

C/C++逆向:字符数组与字符串对比

在逆向工程中&#xff0c;字符数组和字符串的处理是一个重要的方面。字符数组通常是由相同类型的数据元素组成的集合&#xff0c;存储在连续的内存空间中&#xff0c;而字符串则是字符数组的一种特殊形式&#xff0c;用于表示文本信息。字符数组和字符串的区别主要体现在它们的…

VScode分文件编写C++报错 | 如何进行VScode分文件编写C++ | 不懂也能轻松解决版

分文件编写遇到的问题 分文件编写例子如下所示&#xff1a; 但是直接使用 Run Code 或者 调试C/C文件 会报错如下&#xff1a; 正在执行任务: C/C: g.exe 生成活动文件 正在启动生成… cmd /c chcp 65001>nul && D:\Librarys\mingw64\bin\g.exe -fdiagnostics-col…