灰色关联分析法 (附代码)

可参考司守奎《数学建模算法与应用》P384,概念+例题+代码
——————————————————————————————

1、概述

灰色关联分析是指对一个系统发展变化态势的定量描述和比较的方法,其基本思想是通过确定参考数据列和若干个比较数据列的几何形状相似程度来判断其联系是否紧密,它反映了曲线间的关联程度。

简介:

灰色系统理论是由著名学者邓聚龙教授首创的一种系统科学理论(Grey Theory),其中的灰色关联分析是根据各因素变化曲线几何形状的相似程度,来判断因素之间关联程度的方法。此方法通过对动态过程发展态势的量化分析,完成对系统内时间序列有关统计数据几何关系的比较,求出参考数列与各比较数列之间的灰色关联度。与参考数列关联度越大的比较数列,其发展方向和速率与参考数列越接近,与参考数列的关系越紧密。灰色关联分析方法要求样本容量可以少到4个,对数据无规律同样适用,不会出现量化结果与定性分析结果不符的情况。其基本思想是将评价指标原始观测数进行无量纲化处理,计算关联系数、关联度以及根据关联度的大小对待评指标进行排序。灰色关联度的应用涉及社会科学和自然科学的各个领域,尤其在社会经济领域,如国民经济各部门投资收益、区域经济优势分析、产业结构调整等方面,都取得较好的应用效果。

★ 灰色关联度分析法是一种多因素统计分析方法,它是以各因素的样本数据为依据用灰色关联度来描述因素间关系的强弱、大小和次序,若样本数据反映出的两因素变化的态势(方向、大小和速度等)基本一致,则它们之间的关联度较大;反之,关联度较小。

核心步骤:
【1】确定比较对象(评价对象)(就是数据,并且需要进行规范化处理,就是标准化处理,见下面例题的表格数据)和参考数列(评价标准,一般该列数列都是1,就是最优的的情况)
【2】确定各个指标权重,可用层次分析确定
【3】计算灰色关联系数
【4】计算灰色加权关联度
【5】评价分析

★ 必看案例:对中国经济增长影响因素进行分析
(重点关注给的5个解题步骤!)

2、代码复现

①司守奎 P 384

② C++实现

#include<iostream>
#include<cmath>
#define M 6	  //此处可进行行列数的修改
#define N 7
using namespace std;

int main()
{
	//maxtrix of M N
	double chushi[M][N];
	double biaozhunhua[M][N];
	cout << "input the matrix:\n"; //输入矩阵
	for (int i = 0;i < M;i++)
		for (int j = 0;j < N;j++)
			cin >> chushi[i][j];
	for (int i = 0;i < M;i++)
	{
		double Max = -1.0, Min = 10000;
		for (int j = 0;j < N;j++)
		{
			if (chushi[i][j] > Max) Max = chushi[i][j];	//得到每行的最大值和最小值作为上下界
			if (chushi[i][j] < Min) Min = chushi[i][j];
		}
		double jizhun = Max - Min;
		for (int j = 0;j < N;j++)
			biaozhunhua[i][j] = (chushi[i][j] - Min + 0.001) / (jizhun + 0.001);	//得到标准化矩阵,+0.01是为了防止除以0的情况
	}
	cout << endl;
	//下面进行两级最小差与两级最大差的计算
	//double liangji_max = -1, liangji_min = 10000;	//初始化
	double temp_max = -1, temp_min = 10000;	//存放每行的一级最大值和一级最小值
	for (int i = 0;i < M;i++)
	{
		//两两比较得出每行的一级最大值与一级最小值
		double liangji_max = -1, liangji_min = 10000;	//初始化
		for (int j = 0;j < N;j++)
		{
			for (int k = 0;k < N;k++) {
				if (k == j) continue;
				double t = fabs(biaozhunhua[i][j] - biaozhunhua[i][k]);
				if (t > liangji_max) liangji_max = t;
				if (t < liangji_min) liangji_min = t;
			}
		}
		//赋值记录
		temp_max = liangji_max;
		if(liangji_min)
			temp_min = liangji_min;
	}
	//cout << temp_max << ' ' << temp_min << endl;
	//上面已经计算得出两级最大值和两级最小值
	double rho = 0.5;
	double fenzi = temp_min + rho * temp_max;
	double guanlianxishu[M][N];
	//下面依次计算每组数据的关联系数
	for(int i = 0;i < M;i++)
	{
		for (int j = 0;j < N;j++)
		{
			double t = fabs(biaozhunhua[i][j] - 1.0);
			double fenmu = t + rho * temp_max;
			guanlianxishu[i][j] = fenzi / fenmu;
		}
	}
	double weight[M] = { 0.29782,0.18947,0.24612,0.34625,0.1667,0.25383 };	//权重自己改(层次分析法)
	double guanliandu[N];	//最终关联度
	for (int i = 0;i < N;i++)	//对于每一列,计算其关联度
	{
		double sum = 0;
		for (int j = 0;j < M;j++)
			sum += weight[j] * guanlianxishu[j][i];
		guanliandu[i] = sum;
	}
	cout << "1到7号飞机对应的最终关联度分别为:\n";
	for (int i = 0;i < N;i++) cout << guanliandu[i] << ' ';
	cout << endl;
	//system("pause");
	return 0;
}

3、Python实现+可视化

Python实现 灰色关联分析 与结果可视化

  • 10
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值