系统分析:
一般的抽象系统,如社会系统,经济系统,农业系统,生态系统,教育系统等都包含有许多种因素,多种因素共同作用的结果决定了该系统的发展态势。人们常常希望知道在众多的因素中,哪些是主要因素,哪些是次要因素;哪些因素对系统发展影响大,哪些因素对系统发展影响小;那些因素对系统发展起推动作用需强化发展;那些因素对系统发展起阻碍作用需加以抑制;……这些都是系统分析中人们普遍关心的问题。例如,粮食生产系统,人们希望提高粮食总产量,而影响粮食总产量的因素是多方面的,有播种面积以及水利,化肥,土壤,种子,劳力,气候,耕作技术和政策环境等。为了实现少投入多产出,并取得良好的经济效益,社会效益和生态效益,就必须进行系统分析。
灰色关联分析原理:灰色关联分析(Grey Relational Analysis)是一种用于研究变量之间关联性的方法,特别适用于样本数据较少、样本特征缺失或数据质量不高的情况下。它是由灰色系统理论发展而来,旨在分析和描述变量之间的关联程度。
在灰色关联分析中,首先将各个变量的数据进行数值化,常采用标准化或归一化的方法,将变量的取值范围转化为[0, 1]之间。然后,通过计算变量之间的关联度,确定它们之间的关联程度。
灰色关联分析的步骤主要包括以下几个方面:
1.数据标准化:将原始数据进行标准化处理,通常采用归一化或标准化方法,使得各个变量具有相同的数值范围。
2.构建关联系数矩阵:计算各个变量之间的关联系数,一般采用灰色关联度或灰色斜率关联度。关联系数表示了变量之间的相对关联程度。
3.确定关联度序列:根据计算得到的关联系数,确定关联度序列,即将各个变量按照关联度的大小排序。
4.确定关联度权重:根据关联度序列,计算关联度权重,即各个变量在总关联系数中的贡献比例。
5.计算灰色关联度:通过将各个变量的关联系数与关联度权重相乘,并进行累加,计算出灰色关联度。灰色关联度可以反映变量之间的关联程度。
通过灰色关联度的计算,可以得到各个变量之间的关联情况,进而进行数据分析和决策支持。灰色关联分析常被应用于多个领域,包括经济、管理、环境、工程等,用于评估指标之间的关联强度、寻找关键因素等。
需要注意的是,灰色关联分析的结果是相对的,不具备精确的定量意义,应结合实际问题和其他分析方法进行综合评估和判断。
例题以及Excel的实操:在excel中选择数据-插入-推荐图标-修改信息。
2.确定分析数列:
母序列:能反映系统特征值的数据序列,类似于因变量Y,此处记为X0
子序列:有影响系统行为的因素组成的数据序列。类似于自变量x,此处记为(x1,x2……xm)
3.对变量进行预处理:
目的:去量纲,缩小变量范围简化计算。
4.计算子序列中各个指标与母序列的关联系数
先求每子列元素与母列之间差的绝对值,在求出矩阵中所有元素的最小值a和最大值b。且取分辨系数p/rho=0.5
5.求灰色关联度:
公式:每列子序列与母序列关联系数的均值。
MATLAB代码实现:
参考代码:
%% 灰色关联分析用于系统分析例题的讲解
clear;clc
load gdp.mat % 导入数据 一个6*4的矩阵
% 不会导入数据的同学可以看看第二讲topsis模型,我们也可以自己在工作区新建变量,并把Excel的数据粘贴过来
% 注意Matlab的当前文件夹一定要切换到有数据文件的这个文件夹内
Mean = mean(gdp); % 求出每一列的均值以供后续的数据预处理
gdp = gdp ./ repmat(Mean,size(gdp,1),1); %size(gdp,1)=6, repmat(Mean,6,1)可以将矩阵进行复制,复制为和gdp同等大小,然后使用点除(对应元素相除),这些在第一讲层次分析法都讲过
disp('预处理后的矩阵为:'); disp(gdp)
Y = gdp(:,1); % 母序列
X = gdp(:,2:end); % 子序列
absX0_Xi = abs(X - repmat(Y,1,size(X,2))) % 计算|X0-Xi|矩阵(在这里我们把X0定义为了Y)
a = min(min(absX0_Xi)) % 计算两级最小差a
b = max(max(absX0_Xi)) % 计算两级最大差b
rho = 0.5; % 分辨系数取0.5
gamma = (a+rho*b) ./ (absX0_Xi + rho*b) % 计算子序列中各个指标与母序列的关联系数
disp('子序列中各个指标的灰色关联度分别为:')
disp(mean(gamma))
MATLAB代码实现:
这里的代码和博主之前TOPSIS算法一文:数学建模——TOPSIS法_Wei&Yan的博客-CSDN博客
前面的操作都一致,只是在最后添加上了灰色相关分析的方法
步骤:
母序列:取每一行的max构成一个列向量
子序列:预处理后的矩阵
3.计算灰色关联度
先求每个元素与母序列差的绝对值矩阵,再求两级最大/小差。
4.求权重:每列的均值/每列均值的和
5.求得分:(矩阵中每个元素*其所在列的权重)的矩阵的列和。(得到一个)
参考代码:
这里只参考了主函数加上带有灰色相关分析的代码,其他自定义函数可参考博主原来的文章TOPSIS算法:数学建模——TOPSIS法_Wei&Yan的博客-CSDN博客
%% 灰色关联分析用于综合评价模型例题的讲解
clear;clc
load data_water_quality.mat
% 不会导入数据的同学可以看看第二讲topsis模型,我们也可以自己在工作区新建变量,并把Excel的数据粘贴过来
% 注意Matlab的当前文件夹一定要切换到有数据文件的这个文件夹内
%% 判断是否需要正向化
[n,m] = size(X);
disp(['共有' num2str(n) '个评价对象, ' num2str(m) '个评价指标'])
Judge = input(['这' num2str(m) '个指标是否需要经过正向化处理,需要请输入1 ,不需要输入0: ']); %1
if Judge == 1
Position = input('请输入需要正向化处理的指标所在的列,例如第2、3、6三列需要处理,那么你需要输入[2,3,6]: '); %[2,3,4]
disp('请输入需要处理的这些列的指 标类型(1:极小型, 2:中间型, 3:区间型) ')
Type = input('例如:第2列是极小型,第3列是区间型,第6列是中间型,就输入[1,3,2]: '); %[2,1,3]
% 注意,Position和Type是两个同维度的行向量
for i = 1 : size(Position,2) %这里需要对这些列分别处理,因此我们需要知道一共要处理的次数,即循环的次数
X(:,Position(i)) = Positivization(X(:,Position(i)),Type(i),Position(i));
% Positivization是我们自己定义的函数,其作用是进行正向化,其一共接收三个参数
% 第一个参数是要正向化处理的那一列向量 X(:,Position(i)) 回顾上一讲的知识,X(:,n)表示取第n列的全部元素
% 第二个参数是对应的这一列的指标类型(1:极小型, 2:中间型, 3:区间型)
% 第三个参数是告诉函数我们正在处理的是原始矩阵中的哪一列
% 该函数有一个返回值,它返回正向化之后的指标,我们可以将其直接赋值给我们原始要处理的那一列向量
end
disp('正向化后的矩阵 X = ')
disp(X)
end
%% 对正向化后的矩阵进行预处理
Mean = mean(X); % 求出每一列的均值以供后续的数据预处理
Z = X ./ repmat(Mean,size(X,1),1);
disp('预处理后的矩阵为:'); disp(Z)
%% 构造母序列和子序列
Y = max(Z,[],2); % 母序列为虚拟的,用每一行的最大值构成的列向量表示母序列
X = Z; % 子序列就是预处理后的数据矩阵
%% 计算得分
absX0_Xi = abs(X - repmat(Y,1,size(X,2))) % 计算|X0-Xi|矩阵
a = min(min(absX0_Xi)) % 计算两级最小差a
b = max(max(absX0_Xi)) % 计算两级最大差b
rho = 0.5; % 分辨系数取0.5
gamma = (a+rho*b) ./ (absX0_Xi + rho*b) % 计算子序列中各个指标与母序列的关联系数
weight = mean(gamma) / sum(mean(gamma)); % 利用子序列中各个指标的灰色关联度计算权重
score = sum(X .* repmat(weight,size(X,1),1),2); % 未归一化的得分
stand_S = score / sum(score); % 归一化后的得分
[sorted_S,index] = sort(stand_S ,'descend') % 进行排序