Python 灰色关联度 灰色预测模型

article/2025/6/8 13:34:34

灰色关联度

灰色关联度常用于分析影响因子与被影响因子的关联,是水论文的好东西

如果数据的量纲不统一的话,需要先进行归一化处理

import numpy as npdef gray_correlation(refer, data, rho=0.5):''' refer: 参照数列 (列向量)data: 比较数列 (以列为单位)rho: 分辨率return: 灰色关联度'''# 确保参照数列为列向量refer = refer.reshape(-1, 1)# 数列间的绝对距离distance = np.abs(data - refer)dis_min = distance.min()dis_max = rho * distance.max()# 关联系数: 比较数列中每个值与参照数列的关联性cor_param = (dis_min + dis_max) / (distance + dis_max)# 关联度: 关联系数按列求平均degree = cor_param.mean(axis=0)return degree

求解示例:

x0 = np.array([9, 9, 9, 9, 9, 9, 9])
xk = np.array([[8, 9, 8, 7, 5, 2, 9],[7, 8, 7, 5, 7, 3, 8],[9, 7, 9, 6, 6, 4, 7],[6, 8, 8, 8, 4, 3, 6],[8, 6, 6, 9, 8, 3, 8]])# 比较数列 xk 应以列为单位, 故转置
degree = gray_correlation(x0, xk.T)
print(degree)# OUTPUT: [0.71313131 0.61424774 0.68020215 0.5986346  0.68266821]

灰色预测模型

import logging
import warningsimport matplotlib.pyplot as plt
import numpy as np
import pandas as pdwarnings.filterwarnings('ignore')
logging.basicConfig(format='%(message)s', level=logging.INFO)
LOGGER = logging.getLogger(__name__)

三种灰色数列的计算

# 灰积分: 累加数列
integrade = np.cumsum(seq)# 灰微分: 差分数列
diff = np.diff(seq)def gray_poly(seq, alpha=0.5):''' return: 灰多项式 (加权邻值生成数列)'''part_1 = alpha * seq[1:]part_2 = (1 - alpha) * seq[:-1]return part_1 + part_2

模型建立步骤:

  1. 记时间序列 x 的长度为 n,计算级比序列:m_t = \frac{x_{t+1}}{x_{t}}, t\in [1, n-1]
  2. 可容覆盖区间:(e^{-\frac{2}{n+1}}, e^{\frac{2}{n+1}}),若 m_t 均在该区间内,则级比检验成功
  3. 灰导数 diff:时间序列 -> 累加数列 -> 差分数列
  4. 白化背景值 white:时间序列 -> 累加数列 -> 灰多项式
  5. 求解灰微分方程:diff + a · white = b,得到 a 和 b
  6. 白化模型预测函数:\hat{x_t}=(x_1-\frac{b}{a}) \cdot (e^{-a \cdot (t-1)}-e^{-a \cdot (t-2)}), t \in [1, \infty ]
  7. 相对残差:e_t=\frac{|\hat{x_t}-x_t|}{x_t},均小于 0.1 则认为达到较高要求,均小于 0.2 则认为达到一般要求
  8. 级比偏差:e_k=|1-\frac{1-0.5a}{1+0.5a} m_t|,均小于 0.1 则认为达到较高要求,均小于 0.2 则认为达到一般要求

灰色预测模型一步到位代码如下:

def gray_model(seq, alpha=0.5, decimals=4, show=False):''' 灰色预测模型建立seq: 原始序列alpha: 灰多项式权值decimals: 数值精度show: 绘制真实值和预测值的对比图return: 灰色预测模型, 模型信息'''seq = seq.reshape(-1)length = len(seq)index = np.arange(1, length + 1, 1)# 创建数据存储表单model_info = pd.DataFrame(index=index, columns=['真实值', '模型值', '相对误差', '级比偏差'])model_info['真实值'] = seq# 级比: x(k-1) / x(k)mag_ratio = seq[:-1] / seq[1:]mr_right = round(mag_ratio.max(), decimals)mr_left = round(mag_ratio.min(), decimals)# 级比检验的区间边界left = round(np.exp(- 2 / (length + 1)), decimals)right = round(np.exp(2 / (length + 1)), decimals)# 级比检验: 检验数列级比是否都落在可容覆盖区间LOGGER.info('\n'.join(['级比检验:', f'MR ∈ [{mr_left}, {mr_right}]',f'Border ∈ [{left}, {right}]', '']))assert mr_left >= left and mr_right <= right, '序列未通过级比检验, 可通过平移变换改善'# 灰积分: 累加数列integrade = np.cumsum(seq)# 灰微分: 差分数列diff = np.diff(integrade)# 灰多项式: 加权邻值生成数列white = alpha * integrade[1:] + (1 - alpha) * integrade[:-1]# 求解灰微分方程: diff + a * white = bhidden = np.stack([-white, np.ones(white.shape)], axis=0)# shape: [2, n] × [n, 2] × [2, n] × [n, ] -> [2, ]a, b = (np.linalg.inv(hidden @ hidden.T) @ hidden @ diff)LOGGER.info('\n'.join([f'发展灰度: {a}', f'内生控制灰度: {b}']))c2 = b / ac1 = seq[0] - c2def inte_pred(time):''' 白化模型预测函数time: 序列首个值对应的时间为 1'''assert np.all(time >= 1)return c1 * (np.exp(- a * (time - 1)) - np.exp(- a * (time - 2)))LOGGER.info(f'预测方程: x(t) = {round(c1, decimals)}·[e^({-round(a, decimals)}(t-1)) - e^({-round(a, decimals)}(t-2))]\n')# 得到白化模型预测值pred = inte_pred(index)model_info['模型值'] = np.round(pred, decimals)# 计算得到误差信息model_info['相对误差'] = np.round(np.abs((seq - pred) / seq), decimals)model_info['级比偏差'] = np.concatenate([np.zeros(1), np.round(np.abs(1 - (1 - 0.5 * a) / (1 + 0.5 * a) * mag_ratio), decimals)])# 相对残差 / 级比偏差: < 0.1 达到较高要求, < 0.2 达到一般要求for label in ['相对误差', '级比偏差']:error = model_info[label]if np.all(error < 0.1):message = 'Excelent'elif np.all(error < 0.2):message = 'Common'else:raise AssertionError(f'{label}: Fail {error.max()}')LOGGER.info(f'{label}: {message}')# 输出模型信息LOGGER.info('')LOGGER.info(model_info)if show:# 绘制真实值和预测值的对比图plt.plot(index, model_info['真实值'], c='deepskyblue', label='true')plt.scatter(index, model_info['模型值'], c='orange', label='pred', marker='p')plt.legend()plt.show()return inte_pred, model_info

求解示例:


http://chatgpt.dhexx.cn/article/TPcRnFsL.shtml

相关文章

备战数学建模15-灰色关联分析与灰色预测模型

目录 一、灰色系统理论与灰色关联分析 1-灰色预测的概念 2-灰色关联度与优势分析 3-灰色关联分析案例分析 4-灰色生成数列 二、灰色预测模型 1-灰色模型GM 2-灰色模型GM的建模步骤 3-灰色预测经典案例1 4-灰色预测模型经典案例2 一、灰色系统理论与灰色关联分析 1-灰…

C语言:关键字----switch、case、default(开关语句)

C语言&#xff1a;基础开发----目录 C语言&#xff1a;关键字—32个(分类说明) 有32个关键字详细说明&#xff0c;还有跳转链接&#xff01; 一、开关语句----介绍 开关语句&#xff0c;包括以下四种关键字&#xff1a; switch&#xff1a;开关语句case&#xff1a; 开关语句…

C语言关键字auto,case,default,switch应该如何使用

前言&#xff1a;本文章主要用于个人复习&#xff0c;追求简洁&#xff0c;感谢大家的参考、交流和搬运&#xff0c;后续可能会继续修改和完善。 因为是个人复习&#xff0c;会有部分压缩和省略。 一、auto 1.c语言中&#xff0c;关键字auto用于声明一个变量为自动变量&#x…

C语言-switch-case语句与多分支结构

一、switch-case语句 1. switch语句中的每个语句段中都使用break语句 switch-case语句的一般形式为&#xff1a; switch (表达式){case 常量表达式1: 语句段1;break;case 常量表达式2:语句段2;break;...case 常量表达式n:语句段n;break;default:语句段n1;break;}这是switch-c…

C语言——switch case 语句判断学生成绩

C语言——switch case 语句判断学生成绩 switch case 讲解: switch&#xff08;&#xff09;&#xff0c;在括号里输入所定义的变量&#xff0c;接着在&#xff08;&#xff09;后面输入一个{}大括号&#xff0c;把每一个分支语句放在大括号中。 switch()写法: int main()…

C语言--switch case 语句,case 后没有语句

背景&#xff1a;在看 wireshark 的解析协议部分的源码时&#xff0c;发现很多的 switch case 语句&#xff0c;case 后没有语句 的情况&#xff0c;随处可见的这种情况&#xff0c;产生疑惑&#xff0c;报文解析就是很好的例子。 例如&#xff1a;wireshark-3.2.17/epan/diss…

补充switch语句的内容和逗号运算符(C语言case后没有break的switch语句,会继续执行后面的语句再退出)

补充switch语句的内容和逗号运算符 C语言case后没有break的switch语句&#xff0c;会继续执行后面的语句再退出补充逗号运算符 C语言case后没有break的switch语句&#xff0c;会继续执行后面的语句再退出 对于switch语句&#xff0c;我们在使用的时候都会注意使用的规范&#…

c语言 case break,C语言中switch...case语句中break的重要性

在C语言中switch...case语句是经常用到的&#xff0c;下面我介绍一下在使用该语句时候需要注意的一个细节问题。话不多说&#xff0c;直接举例子&#xff1a; 例子1&#xff1a; switch(fruit) { case 1:printf("apple"); break; case 2:printf("banana");…

C语言CASE语句嵌套,C语言中switch case语句的嵌套

给一个含有嵌套的switch case的一段完整代码&#xff1a; #include int main() { int n1; int m2; switch(n) { case 1: m; case 2: n; case 3: switch(n) { case 1: n; case 2: m; n; break; } case 4: m; break; default: break; } printf("%d %d",m,n); return 0…

c语言 switch案例,c语言switch case语句使用例子

c语言switch case语句使用例子 发布时间&#xff1a;2020-04-23 11:48:53 来源&#xff1a;亿速云 阅读&#xff1a;421 作者&#xff1a;小新 这篇文章主要为大家详细介绍了c语言switch case语句使用例子&#xff0c;文中示例代码介绍的非常详细&#xff0c;具有一定的参考价值…

c语言的case语句怎么用,c语言的switchcase语句用法

凡是使用过的人都会有同2113样的感觉—5261—C语言的使用灵活这个特点既是优点又是4102缺点&#xff0c; 因为对1653精通C语言的用户来讲&#xff0c; 灵活就意味着编程可以无拘无束&#xff0c; 甚至随心所欲&#xff1b; 但对初学者或者是尚未摸着规律的用户来说&#xff0c;…

case是c语言变量名吗,case是什么意思_c语言中case是什么意思

c语言中case是什么意思 是程序的入口,一般结合switch使用 举个例子: int a=2; switch(a){ case 1:prinf("1");break; case 2:prinf("2");break; default:prinf("3"); } 就表示根据a的值进行判断,a的值与 case后面的哪个值相等,就执行哪个cas…

【C语言】case 关键字

&#x1f6a9;write in front&#x1f6a9; &#x1f50e;大家好&#xff0c;我是謓泽&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f3c5;2021年度博客之星物联网与嵌入式开发TOP5&#xff5…

c语言库函数总结----math.h库

思维导图大纲 前言 上回总结了string.h常用的字符串操作函数,这次总结一下另外的一个库函数math.h和数字运算有关联的库。 double acos(double x) 函数原型:double acos(double x) 功能:返回以弧度表示的 x 的反余弦。arcos(x);//时间:2019年11月15日 //作者:Kroner //编…

c语言实现库函数

目录 一.strlen函数 1.描述 2.实现 1.计数的方法 2.函数递归的方法 3.指针 - 指针方法 二.strcmp函数 1.描述 2.实现 三.strcpy函数的实现 1.描述 2.实现 四.strcat函数的实现 1.描述 2.实现 五.strstr函数的实现 1.描述 2.实现 1.BF算法实现 2.kmp算法的实现…

C语言 库函数:qsort 详解

目录 1.qsort的介绍与使用方法 2.介绍void*​ 3.举例使用qsort​ 4. qsort的模拟实现&#xff0c;了解其运作原理​ 1.qsort的介绍与使用方法 2.介绍void* 3.举例使用qsort #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include…

C语言库函数查找工具MSDN

一、前言   库函数在我们写程序的时候会在很大程度上提高我们的效率&#xff0c;我知道很多人可能像我一样&#xff0c;很多时候并不是不知道可以用库函数来实现&#xff0c;但就是不知道库函数如何使用&#xff0c;所以今天呢博主就来推荐资源了——C语言库函数查找工具《MS…

文件编程概念(C语言库函数系统调用API)

文件编程&#xff08;文件IO&#xff09; 文件编程就是操作文件&#xff0c;对文件进行打开&#xff0c;关闭&#xff0c;读、写等操作&#xff08;个人理解&#xff09;。之前C语言编写程序运行都是对键盘和显示器进行的&#xff0c;运行程序时会默认打开的三个文件 标准输入流…

c语言库函数大全文库,C语言库函数源代码

C语言库函数源代码 C语言库函数源代码 strstr ( )/* -- C语言库函数源代码 - */ /* 得到s1中第一次包含s2字符串的位置指针。 */ #include stdlib.h char * my_strstr(const char *s1,const char *s2) { if (*s1 0) { if (*s2) return (char *) NULL; return (char *) s1; } …

C语言常用的库函数 (自用)

常用的库函数 1.前言2.内容1.toupper()2.tolower()3.sprintf()4.abs()5.fabs()6.labs()7.scanf()8.itoa() 3.小声bb4.更新日志 1.前言 在刷题过程中&#xff0c;总能看到dl用一些库函数&#xff0c;简化算法&#xff0c;由此萌生慢慢学习整理常用的库函数的想法&#xff0c;本…