python数学建模_2:灰色预测模型(GM(1,1))使用文档

news2024/11/16 22:51:40

  • 灰色预测模型(GM(1,1))使用文档
    • 简介
    • 使用时机
    • 处理数据类型
    • 函数说明
    • 使用示例
    • 注意事项
    • 具体项目

灰色预测模型(GM(1,1))使用文档

简介

灰色预测模型(GM(1,1))是灰色系统理论的重要部分,常用于对包含不确定性的系统进行建模和预测。

使用时机

当数据量较小,且数据变化趋势明显,但不易确定具体规律时,可以使用灰色预测模型进行预测。特别是在经济、社会、科技等领域,灰色预测模型被广泛应用。

处理数据类型

模型可以处理一维的时间序列数据,数据应为非负数且不能全部相同。模型预测的结果为连续的实数。

函数说明

以下是代码中各个函数的说明:

level_check(x, r=(0.1, 2.5)):级比检验函数,检查序列是否满足灰色预测模型的使用条件。

GM_11(x0):构建GM(1,1)模型的函数,输入为原始数据序列,输出为模型预测函数以及参数a和b。

check_predict(x0, f):计算模型预测值、残差、相对误差以及级比偏差的函数。

create_df(x0, predict, e, delta_k, relative_e):根据原始值、模型值、残差、级比偏差和相对误差创建pandas DataFrame的函数。

plot_data(x0, predict):根据原始值和模型值绘制图表的函数。

使用示例

首先,你需要提供一组原始数据,然后调用level_check()函数进行级比检验,如果检验通过,说明这组数据适合使用灰色预测模型进行建模和预测。然后,你可以调用GM_11()函数生成预测模型,接着用check_predict()函数计算预测值以及各种误差,最后,你可以使用create_df()函数将这些数据整理成一个表格,并用plot_data()函数将原始值和预测值绘制在图表上。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from tabulate import tabulate


def level_check(x, r=(0.1, 2.5)):
    # 级比检验
    n = len(x)
    lambda_x = [x[i-1] / x[i] for i in range(1, n)]
    return all(r[0] <= lambda_x[i] <= r[1] for i in range(n-1))

def GM_11(x0):
    # 建立GM(1,1)模型
    n = len(x0)
    x1 = x0.cumsum() # 一次累加
    z1 = (x1[:n-1] + x1[1:]) / 2.0 # 紧邻均值生成序列
    B = np.array([-z1, np.ones(n-1)]).T
    Yn = x0[1:].reshape((n-1, 1))
    [[a], [b]] = np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Yn) # 计算参数
    f = lambda k: (x0[0]-b/a)*np.exp(-a*(k-1))-(x0[0]-b/a)*np.exp(-a*(k-2)) # 还原值
    return f, a, b


def check_predict(x0, f):
    n = len(x0)
    predict = [f(i+1) for i in range(n)]  # 将预测序列前移一位
    #predict[0] = x0[0]  # 使用原始序列的第一个值替换预测序列的第一个值
    e = x0 - np.array(predict)  # 残差
    relative_e = e / x0  # 相对误差
    lambda_k = [None] + [x0[i] / x0[i-1] for i in range(1, n)]
    lambda_k_hat = [None, None] + [(predict[i]-predict[i-1]) / (predict[i-1]-predict[i-2]) for i in range(2, n)]
    delta_k = [None if lk is None or lhk is None else abs(lk - lhk) for lk, lhk in zip(lambda_k, lambda_k_hat)]  # 级比偏差
    return predict, relative_e, delta_k


def create_df(x0, predict, e, delta_k, relative_e):
    # 创建一个包含原始值、模型值、残差、级比偏差和相对误差的pandas DataFrame
    df = pd.DataFrame({
        '原始值': x0,
        '模型值': predict,
        '残差': e,
        '级比偏差': delta_k,
        '相对误差': relative_e
    })
    return df

def plot_data(x0, predict):
    plt.rcParams['font.sans-serif'] = ['SimHei'] 
    plt.figure(figsize=(8, 4))
    plt.plot(range(len(x0)), x0, 'o-', label='原始值')
    plt.plot(range(len(predict)), predict, 'r--', label='模型值')
    plt.xlabel('时间')
    plt.ylabel('值')
    plt.title('灰色预测模型')
    plt.legend()
    plt.show()

# Test with some data
x0 = np.array([71.1,72.4,72.4,72.1,71.4,72.0,71.6])
if level_check(x0):
    f, a, b = GM_11(x0)
    predict, relative_e, delta_k = check_predict(x0, f)
    e = x0 - predict
    df = create_df(x0, predict, e, delta_k, relative_e)
    plot_data(x0, predict)
else:
    print("级比检验不通过,不能使用灰色预测")
df

在这里插入图片描述

注意事项

灰色预测模型是一种粗略的预测方法,仅适用于数据变化趋势明显、但难以找到明确规律的情况。如果数据变化规律不明显,或者已经找到了明确的数学模型,那么应该使用其他更精确的预测方法。

灰色预测模型假设数据变化趋势在一段时间内是恒定的,因此在使用模型进行长期预测时需要谨慎,因为实际情况中数据的变化趋势可能会发生改变。

此外,模型的预测精度会随着数据量的增加而提高。如果你发现预测结果与实际结果有较大偏差,你可以试着增加数据量,以提高模型的预测精度。

具体项目

在这里插入图片描述

import pandas as pd
import numpy as np

np.random.seed(0)

# 创建年份和月份标签
years = list(range(1997, 2004))
months = list(range(1, 13))

# 创建一个空的列表来存储所有年份的数据
all_data = []

# 初始化第一年的数据
data = [100 + np.random.randn() * 10 for _ in months]
all_data.append(data)

# 为每一年生成数据
for year in years[1:]:
    # 增加一个年度增长率
    growth_rate_year = 1 + np.random.rand() / 10
    # 对每个月应用月度增长率
    data = [prev_month * growth_rate_year * (0.8 if month in [1, 2, 7, 8] else 1.2) for month, prev_month in enumerate(data, start=1)]
    all_data.append(data)

# 将数据转换为二维形状,然后创建DataFrame
data_2d = np.array(all_data)
df = pd.DataFrame(data_2d, index=years, columns=months)

# 更新列名和行名
df.index.name = "Year"
df.columns.name = "Month"

df
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# 计算每年的平均收入,并只使用2003年之前的数据
average_income_per_year = df.loc[1997:2002].mean(axis=1)

# 计算每月收入的平均占比
average_monthly_ratio = df.loc[1997:2002].divide(average_income_per_year, axis=0).mean()

# 级比检验
def level_check(x, r=(0.1, 2.5)):
    lambda_x = [x[i-1] / x[i] for i in range(1, len(x))]
    return all(r[0] <= lambda_x[i] <= r[1] for i in range(len(x)-1))

if not level_check(average_income_per_year.values):
    print("级比检验不通过,不能使用灰色预测")
    exit()

# 灰色预测模型
x0 = average_income_per_year.values
n = len(x0)
x1 = x0.cumsum() # 一次累加
z1 = (x1[:n-1] + x1[1:]) / 2.0 # 紧邻均值生成序列
B = np.array([-z1, np.ones(n-1)]).T
Yn = x0[1:].reshape((n-1, 1))
[[a], [b]] = np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Yn) # 计算参数
f = lambda k: (x0[0]-b/a)*np.exp(-a*(k-1))-(x0[0]-b/a)*np.exp(-a*(k-2)) # 还原值

# 预测2003年的平均收入
average_income_2003_predicted = f(n+1)

# 将预测的平均收入分配到每个月
income_2003_predicted = average_monthly_ratio * average_income_2003_predicted

# 创建一个包含原始值、模型值、残差、级比偏差和相对误差的pandas DataFrame
def create_df(x0, f):
    n = len(x0)
    predict = [f(i) for i in range(1, n+1)]
    e = x0 - np.array(predict)  # 残差
    relative_e = e / x0  # 相对误差
    lambda_k = [None] + [x0[i] / x0[i-1] for i in range(1, n)]
    lambda_k_hat = [None, None] + [(predict[i]-f(i-1)) / (predict[i-1]-f(i-2)) for i in range(2, n)]
    delta_k = [None if lk is None or lhk is None else abs(lk - lhk) for lk, lhk in zip(lambda_k, lambda_k_hat)]  # 级比偏差
    df = pd.DataFrame({
        '原始值': x0,
        '模型值': predict,
        '残差': e,
        '级比偏差': delta_k,
        '相对误差': relative_e
    })
    return df

# 打印模型验证信息
print(create_df(average_income_per_year.values, f))

# 比较预测值和实际值
plt.figure(figsize=(12, 6))
plt.plot(df.columns, df.loc[2003], label='Actual')
plt.plot(df.columns, income_2003_predicted, label='Predicted')
plt.xlabel('Month')
plt.ylabel('Income')
plt.legend()
plt.show()

在这里插入图片描述

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

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

相关文章

树莓派通过天线+gps获取经纬度并调用高德地图api在地图上标点

完整项目为《基于机器视觉的行人和路面缺陷检测及其边缘设备部署》 完整功能视频演示地址&#xff1a;本科最后的课设&#xff1a;“车载系统的辅助系统——基于机器视觉的行人和路面缺陷检测”完结撒花*罒▽罒*_哔哩哔哩_bilibili 该博客介绍的功能为&#xff1a; 1&#xff1…

VS下开发Qt应用环境搭建

VS下开发Qt应用环境搭建 版本说明环境搭建步骤QT新增组件重新安装QTVS中的配置 版本说明 vs2019 QT5.14 我之前是按照QT基础组件的安装&#xff0c;但是这个安装只是最基础的组件&#xff0c;如果想要在VS中使用QT&#xff0c;还得安装其他组件&#xff0c;下面的安装流程、 …

轻松解决宝塔面板设置了授权IP访问,但是IP变动导致访问不了面板

为了宝塔面板的安全与隐蔽性&#xff0c;我们很多站长会设置授权IP&#xff0c;授权IP的作用是&#xff1a;设置访问授权IP,多个请使用逗号(,)隔开;注意&#xff1a;一旦设置授权IP,只有指定IP的电脑能访问面板! 但是很多站长不是通过专用的虚拟通道访问&#xff0c;用的都是宽…

【Python系列】Python基础语法轻松入门—从变量到循环

目录 写在前面 语法介绍 变量 数据类型 整数 浮点数 字符串 列表 元组 字典 运算符 算术运算符 比较运算符 逻辑运算符 条件语句 循环语句 图书推荐 图书介绍 参与方式 中奖名单 写在前面 Python 是一种高级、解释型的编程语言&#xff0c;具有简单易学…

恒心工程PMO运作实践︱恒丰银行苏州分行行长(拟)姜兆华

恒丰银行股份有限公司苏州分行党委书记、行长&#xff08;拟&#xff09;&#xff0c;原总行金融科技部副总经理、恒心工程PMO办公室主任姜兆华先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;恒心工程PMO运作实践——以商业银行核…

京东的成功秘诀:找到自己独特而有效的商业模式

你知道京东为什么能够从一个卖电器的小网站发展成为中国最大的电商平台吗&#xff1f;如果京东一开始靠卖电器赚钱&#xff0c;不可能有今天&#xff0c;在十几年刘强东刚创业的时候&#xff0c;如果京东靠卖电器赚钱&#xff0c;你知道想当年的国美黄光裕和想当年的苏宁的张近…

磁盘均衡器:HDFS Disk Balancer

HDFS Disk Balancer 背景产生的问题以及解决方法 hdfs disk balancer简介HDFS Disk Balancer功能数据传播报告 HDFS Disk Balancer开启相关命令 背景 相比较于个人PC&#xff0c;服务器一般可以通过挂载多块磁盘来扩大单机的存储能力在Hadoop HDFS中&#xff0c;DataNode负责最…

F5 LTM 知识点和实验 7-使用SNATs处理流量

第七章:使用SNATs处理流量 SNATs: 传统的vs都是对目的地址和端口进行改变,而源地址没有改变,如果你需要对源地址和源端口进行更改,则需要使用SNAT能力,好处在于: 1、允许不可路由地址(网络内部)的设备获得可路由地址以进入网络外部。2、确保目标服务器通过BIG-IP系统返…

[Docker实现测试部署CI/CD----相关服务器的安装配置(1)]

目录 0、CI/CD系统最终架构图规划IP地址 1、git配置Git下载pycharm配置gitidea配置git 2、GitLab安装与配置主机要求拉取镜像定义 compose.yml启动gitlab浏览器访问并修改密码查看登录密码修改密码 3、SonarQube 安装与配置拉取镜像修改虚拟内存的大小启动SonarQube登录 SonarQ…

5.2.16.静态映射操作LED3

5.2.16.静态映射操作LED3 5.2.16.1、添加驱动中的写函数 (1)先定义好应用和驱动之间的控制接口&#xff0c;这个是由自己来定义的。譬如定义为&#xff1a;应用向驱动写"on"则驱动让LED亮&#xff0c;应用向驱动写"off"&#xff0c;驱动就让LED灭 1. 驱动文…

自定义Controller接口参数的值不能为空的校验

需求&#xff1a;在进入到相应Controller控制器前&#xff0c;需要先校验参数是否符合规范要求&#xff0c;如是否为空等等。 有人说&#xff0c;可以使用PathVariable里面的required属性控制&#xff0c;然而该属性只是代表参数是否必填&#xff0c;并不能校验参数的值是否满…

python_在K线找出波段_01_找出所有转折点

目录 写在前面&#xff1a; 需要考虑的几种K线图情况&#xff1a; 寻找所有转折点逻辑&#xff1a; 代码&#xff1a; 寻找转折点方法&#xff1a;找到第一个转折点就返回 循环寻找峰谷方法 主方法 调用计算&#xff1a; 返回&#xff1a; 在【PyQt5开发验证K线视觉想…

C++继承特性(1)——含义与继承方式的讲解

目录 1.继承的含义 2.继承的定义&#xff1a; 3.继承方式 例子1&#xff1a;基类的访问限定符为public&#xff0c;两个派生类的继承方式分别为public、protected时&#xff1a; 例子2&#xff1a; 基类的访问限定符为protected&#xff0c;两个派生类的继承方式分别为pub…

软件测试工程师的职业规划,你都做好了吗?

第一阶段&#xff1a;初级测试工程师 一般刚刚入门&#xff0c;熟悉基本的测试流程&#xff0c;此时已打基础为主。入门薪资一般在6000-8000元之间。 具体工作是&#xff1a; &#xff08;1&#xff09; 按照测试方案和流程对产品进行功能测试&#xff0c;检查产品是否有缺陷…

Java读取及生成pb文件并转换jsonString

Java读取及生成pb文件并转换jsonString 1. 效果图2. 原理2.1 Protocol Buffers是什么2.2 支持的语言2.3 根据.proto生成.java2.4 初始化及构建pb&#xff0c;读取&#xff0c;转jsonString 3. 源码3.1 address.proto3.2 PbParseUtil.java 参考 读取pb及生成pb文件pb文件转换jso…

vue-cli4升级到vue-cli5的踩坑记录

前言 最近对部分项目升级了vue-cli脚手架&#xff0c;记录一下 问题一&#xff1a; scss/less/css中无法引入public下的静态资源 问题描述 在样式文件中使用静态资源路径导致编译无法通过 错误信息如下&#xff1a; Module not found: Error: Cant resolve /img/login/lo…

框架的知识点整理

目录 1、什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; 2 、 使用Spring框架有什么好处&#xff1f; 3、Spring MVC 工作原理 1、什么是Spring框架&#xff1f;Spring框架有哪些主要模块&#xff1f; Spring框架是一个开源的轻量级的Java应用程序开…

MySQL主从复制及读写分离(三十四)

目录 MySQL主从复制 一、概述 1、MySQL Replication优点&#xff1a; 二、MySQL复制类型 1、异步复制&#xff08;Asynchronous repication&#xff09; 2、全同步复制&#xff08;Fully synchronous replication&#xff09; 3、半同步复制&#xff08;Semisynchronous…

【构造】CF1758 C

Problem - 1758C - Codeforces 题意&#xff1a; 思路&#xff1a; 思路&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn2e510; const int mxe2e510;int N,x; int ans[mxn];void solve(){cin>>N>>x;if(N%x!0)…

1999-2021年30省平均受教育年限(含原始数据和具体计算过程)

1999-2021年30省平均受教育年限&#xff08;含原始数据和具体计算过程&#xff09; 1、时间&#xff1a;1999-2021年 2、范围&#xff1a;30省&#xff08;剔除西藏&#xff09; 3、计算方式&#xff1a;平均受教育年限&#xff08;未上学人数*0小学人数*6初中人数*9高中人数…