数学建模--G(1,1)型的灰色预测模型的Python实现

news2024/11/27 12:41:52

目录

 

  1.算法适用情况

  2.算法推演步骤

  3.算法核心代码

  4.算法效果展示


 1.算法适用情况

#1.灰色预测模型简介
"""
1.灰色预测是对既含有已知信息又含有不确定信息的系统进行预测,就是对在一定范围内变化的、与时间有关的灰色过程进行预测。
2.灰色预测对原始数据进行生成处理来寻找系统变动的规律,并生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物未来发展趋势的状况。
3.灰色预测模型要求时长尽可能多或者数据尽可能充足,如果数据不足的话灰色预测的效果很差
4.如果数据不足,可以采用普通的时间序列来进行预测
"""

  2.算法推演步骤

#算法步骤如下所示:
#1.生成累加数据集合
#2.计算矩阵B和向量Y
#3.计算结果矩阵U=[a,u] U=(B^T.B)^-1.B^T.Y
#4.建立灰色预测模型函数
#5.灰色预测精度检验
#6.灰色误差检验
#7.可视化绘图

  3.算法核心代码

#1.灰色预测模型简介
"""
1.灰色预测是对既含有已知信息又含有不确定信息的系统进行预测,就是对在一定范围内变化的、与时间有关的灰色过程进行预测。
2.灰色预测对原始数据进行生成处理来寻找系统变动的规律,并生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物未来发展趋势的状况。
3.灰色预测模型要求时长尽可能多或者数据尽可能充足,如果数据不足的话灰色预测的效果很差
4.如果数据不足,可以采用普通的时间序列来进行预测
"""
#导入必要的库和数据
import math
import numpy as np
import matplotlib.pyplot as plt
# 这两行代码解决 plt 中文显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

hist_data=[724.57,746.62,778.27,800.8,827.75,871.1,912.37,954.28,995.01,1037.2]
number=len(hist_data)
x0=np.array(hist_data)

#1.生成累加数据集合
add_hist_data = [sum(hist_data[0:i+1]) for i in range(number)]
x1 = np.array(add_hist_data)
#2.计算矩阵B和向量Y
#B矩阵是一个number-1行2列的矩阵
#Y向量是一个number-1行1列的矩阵
B=np.zeros([number-1,2])
Y=np.zeros([number-1,1])
#通过for循环计算值
#Y=[x0[1],x0[2],x0[3],.......x0[n-1]]
#B=[[-0.5(x(0)+x(1)),1],.......,[-0.5(x(number)+x(1=number-1)),1]]
for i in range(0,number-1):
    B[i][0] = -0.5*(x1[i] + x1[i+1])
    B[i][1] = 1
    Y[i][0] = x0[i+1]
#3.计算结果矩阵U=[a,u]^T
#U=(B^T.B)^-1.B^T.Y
U=np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Y)
a=U[0][0]
u=U[1][0]
#4.建立灰色预测模型函数
ans=np.zeros(number)
ans[0]=x0[0]
for i in range(1,number):
    ans[i]=(x0[0]-u/a)*(1-math.exp(a))*math.exp(-a*(i))
#5.灰色预测精度检验
#5.1.残差平均值+残差平方
#残差平均值
aver0=0
for i in range(number):
    aver0+=(x0[i]-ans[i])
aver0=aver0/number
#残差平方
s0 = 0;       
for i in range(0,number):
    s0 += ((x0[i] - ans[i]) - aver0)**2;
s0 /= number

#5.2.历史数据平均值+历史数据方差
aver1=0
S1=0
for i in range(number):
    aver1+=(x0[i])
aver1=aver1/number
for i in range(number):
    S1+= (x0[i]-aver1)**2;
S1 /= number
#5.3.后验差比值
C=s0/S1
#5.4.小误差概率P
sum=0
for i in range(number):
    if abs(x0[i]-ans[i]-aver0)<0.6754*math.sqrt(S1):
        sum=sum+1
    else:
        sum=sum
p=sum/number
#6.灰色误差检验
ANS=0
if(C<0.35 and p>0.95):
    #预测效果不错
    ANS=1
    m=20
    answer=np.zeros(m)
    for i in range(m):
        answer[i]=(x0[0]-u/a)*(1-math.exp(a))*math.exp(-a*(i+number))
else:
    ANS=0
    print("关联性不强,灰色预测法不可用!")
#7.可视化绘图
if ANS == 1:
    for i in range(m):
        print("预测第",i+1,"年的数据是:",answer[i])
    x=[]
    y=[]
    for i in range(m):
        x.append(i+1)
        y.append(answer[i]) 
    plt.bar(x,y,color='r')
    plt.xlabel("预测时间变化",color='b')
    plt.ylabel("预测产量变化",color='b')
    plt.title("G(1,1)灰色预测模型下20年产量的预测情况",color='b')
    plt.savefig('C:/Users/Zeng Zhong Yan/Desktop/灰度预测模型.png', dpi=200, bbox_inches='tight')
    plt.show()

  4.算法效果展示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/968853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击

智能合约安全分析&#xff0c;针对 ERC777 任意调用合约 Hook 攻击 Safful发现了一个有趣的错误&#xff0c;有可能成为一些 DeFi 项目的攻击媒介。这个错误尤其与著名的 ERC777 代币标准有关。此外&#xff0c;它不仅仅是众所周知的黑客中常见的简单的重入问题。 这篇文章对 …

数学建模--粒子群算法(PSO)的Python实现

目录 1.开篇提示 2.算法流程简介 3.算法核心代码 4.算法效果展示 1.开篇提示 """ 开篇提示: 这篇文章是一篇学习文章,思路和参考来自:https://blog.csdn.net/weixin_42051846/article/details/128673427?utm_mediumdistribute.pc_relevant.none-task-blog-…

Android 12 源码分析 —— 应用层 四(SystemUI的基本布局设计及其基本概念)

Android 12 源码分析 —— 应用层 四&#xff08;SystemUI的基本布局设计及其基本概念&#xff09; 在上两篇文章中&#xff0c;我们介绍SystemUI的启动过程&#xff0c;以及基本的组件依赖关系。基本的依赖关系请读者一定要掌握&#xff0c;因为后面的文章&#xff0c;将会时…

数学建模--主成分分析法(PCA)的Python实现(

目录 1.算法核心思想&#xff1a; 2.算法核心代码&#xff1a; 3.算法分类效果&#xff1a; 1.算法核心思想&#xff1a; 1.设置降维后主成分的数目为2 2.进行数据降维 3.设置main_factors1个划分类型 4.根据组分中的值进行分类 5.绘制出对应的图像 2.算法核心代码&#xff1a…

使用多线程std::thread发挥多核计算优势(解答)

使用多线程std::thread发挥多核计算优势&#xff08;题目&#xff09; 单核无能为力 如果我们的电脑只有一个核&#xff0c;那么我们没有什么更好的办法可以让我们的程序更快。 因为这个作业限制了你修改算法函数。你唯一能做的就是利用你电脑的多核。 使用多线程 由于我们…

C语言练习8(巩固提升)

C语言练习8 编程题 前言 奋斗是曲折的&#xff0c;“为有牺牲多壮志&#xff0c;敢教日月换新天”&#xff0c;要奋斗就会有牺牲&#xff0c;我们要始终发扬大无畏精神和无私奉献精神。奋斗者是精神最为富足的人&#xff0c;也是最懂得幸福、最享受幸福的人。正如马克思所讲&am…

无涯教程-JavaScript - CUBESETCOUNT函数

描述 CUBESETCOUNT函数返回集合中的项目数。 语法 CUBESETCOUNT (set)争论 Argument描述Required/Optionalset Microsoft Excel表达式的文本字符串,其输出为由CUBESET函数定义的集合。 OR CUBESET功能。 OR 对包含CUBESET函数的单元格的引用。 Required Notes 求值CUBESE…

【个人博客系统网站】统一处理 · 拦截器

【JavaEE】进阶 个人博客系统&#xff08;2&#xff09; 文章目录 【JavaEE】进阶 个人博客系统&#xff08;2&#xff09;1. 统一返回格式处理1.1 统一返回类common.CommonResult1.2 统一返回处理器component.ResponseAdvice 2. 统一异常处理3. 拦截器实现3.1 全局变量SESSI…

Mariadb高可用(四十)

目录 一、概述 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;组成 &#xff08;三&#xff09;特点 &#xff08;四&#xff09;工作原理 二、实验要求 三、构建MHA &#xff08;一&#xff09;ssh免密登录 &#xff08;二&#xff09;安装mariadb数据库…

数学建模--一维插值法的多种插值方式的Python实现

目录 1.算法流程步骤 2.算法核心代码 3.算法效果展示 1.算法流程步骤 #算法的核心就是利用scipy中的interpolate来完成工作 #一共是5种一维插值算法形式: #插值方法&#xff1a;1.阶梯插值 2.线性插值 3.2阶样条插值 4.3阶样条插值 #"nearest"阶梯插值 #"zero&…

硬盘数据恢复的基础操作方法分享

确定硬盘故障类型&#xff1a;在进行硬盘数据恢复之前&#xff0c;首先需要确定故障类型是硬件故障还是软件故障。如果是软件故障&#xff0c;可以尝试使用数据恢复软件进行恢复&#xff1b;如果是硬件故障&#xff0c;则需要求助专业数据恢复公司进行处理。 使用数据恢复软件…

JavaScript基础05——字面量、变量介绍及变量基本使用

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 说起变量感觉很熟悉&#xff0c;但要让解释什么是变量时&#xff0c;却有点语塞&#xff0c;就像解释下为啥112一样&#xff0c;感觉非常熟悉&#xff0c;就是知道&#xff0c;但确解释不出来。 不过虽然在其他场景比较…

机器学习——线性回归/岭回归

0、前言&#xff1a; 线性回归会用到python第三方库&#xff1a;sklearn.linear_model中的LinearRegression导入第三方库的方法&#xff1a;from sklearn.linear_model import LinearRegression使用LinearRegression(二维数据&#xff0c;一维数据)进行预测&#xff0c;其中数…

MySQL中的索引事务(2)事务----》数据库运行的原理知识+面试题~

本篇文章建议读者结合&#xff1a;MySQL中的索引事务&#xff08;1&#xff09;索引----》数据库运行的原理知识面试题~_念君思宁的博客-CSDN博客此时&#xff0c;如果你根据name来查询&#xff0c;查到叶子节点得到的只是主键id&#xff0c;还需要通过主键id去主键的B树里面在…

源码角度看待线程池的执行流程

文章目录 前言一、线程池的相关接口和实现类1.Executor接口2.ExecutorService接口3.AbstractExecutorService接口4.ThreadPoolExecutor 实现类 二、ThreadPoolExecutor源码解析1.Worker内部类2.execute()方法3.addWorker()方法 总结 前言 线程池内部维护了若干个线程&#xff…

RT-Thread 内核移植

内核移植 内核移植就是将RTT内核在不同的芯片架构、不同的板卡上运行起来&#xff0c;能够具备线程管理和调度&#xff0c;内存管理&#xff0c;线程间同步等功能。 移植可分为CPU架构移植和BSP&#xff08;Board support package&#xff0c;板级支持包&#xff09;移植两部…

1783_CMD启动MATLAB同时执行一个脚本

全部学习汇总&#xff1a; GitHub - GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes…

【数据结构】树和二叉树的概念及结构(一)

目录 一&#xff0c;树的概念及结构 1&#xff0c;树的定义 2&#xff0c;树结点的分类及关系 3&#xff0c;树的表示 二&#xff0c;二叉树的概念及结构 1&#xff0c;二叉树的定义 2&#xff0c;特殊的二叉树 3&#xff0c;二叉树的性质 4&#xff0c;二叉树的存储结构 1&…

Unity中Shader 纹理属性 Tilling(缩放度) 和 Offset(偏移度)

文章目录 前言一、Tilling(缩放度)&#xff0c;个人理解有点像减小周期函数的周期的效果&#xff08;在单位空间内&#xff0c;容得下重复的函数图像的多少&#xff09;二、Offset&#xff08;偏移度&#xff09;&#xff0c;个人理解是函数的平移三、在Shader中使用 Tilling 和…

如何批量查询所有德邦快递的物流信息

当我们需要查询多个德邦快递的物流信息时&#xff0c;我们可以使用固乔快递查询助手来批量查询。以下是具体的操作步骤&#xff1a; 1. 在浏览器中搜索并下载【固乔快递查询助手】软件。这款软件支持多种快递公司&#xff0c;包括德邦快递&#xff0c;而且可以批量查询物流信息…