灰色系统理论由我国著名学者邓聚龙教授于1982提出。灰色关联分析是灰色系统理论的一个分支,应用灰色关联分析方法对受多种因素影响的事物和现象从整体观念出发进行综合评价是一个被广为接受的方法。
一、灰色关联分析法的建模过程
灰色关联分析法的基本思想是根据各比较数列集构成的曲线族与参考数列构成的曲线之间的几何相似程度来确定比较数列集与参考数列之间的关联度,比较数列构成的曲线与参考数列构成的曲线的儿何形状越相似,其关联度越大。
参考数据列应该是一个理想的比较标准,可以以各指标的最优值 (或最劣值)构成参考数据列,也可根据评价目的选择其它参照值。例如,在某多属性综合评价问题中,可将各属性的最优值组成一个参考数列,各个评价方案(对象)构成比较数列集,若关联度越大,该方案(对象)越优,反之越劣。利用灰色关联分析进行综合评价的步骤如下。
1、根据评价目的确定评价指标体系,收集评价数据,确定原始评价矩阵及参考数列。
2、对指标数据进行标准化处理,并记标准化处理后的数据序列为:
对于不同的指标类型(如正向型、逆向型、最优值为给定区间的指标,等等),应采取不同的标准化处理策略。常用的几种标准化处理的方法见http://blog.sina.com.cn/s/blog_b3509cfd0101bsky.html,这里不赘述。
3、对标准化处理的数据序列,逐个计算每个被评价对象指标序列(比较序列)与参考数列对应元素的绝对差值,即:
4、确定
与
。
5、计算每个比较序列与参考数列对应元素的关联系数:
6、计算关联度。
7、依据各观察对象的关联度,得出综合评价结果。如果参考数列由各指标的最优值组成,则关联度越大,该评价对象与理想的比较标准越相似,评价结果越优,反之越劣。
二、灰色关联分析法的Matlab程序实现
首先声明:不失一般性,以下程序假设所有指标均为正向型指标(越大越好)进行标准化处理,在实际应用中需根据具体情况对不同类型的指标进行标准化处理。另外,这里采用熵权法求客观权重,详见:http://blog.sina.com.cn/s/blog_b3509cfd0101bm0f.html。另外,注意程序注释。
--------------------------------------------以下是程序代码-------------------------------------
function GreyRelationDegree(stats) %%
stats是一个m×n的评价矩阵,即m个评价对象、n个评价指标
%% [重要]设置参考数列,即各指标的理想最优值组成的行向量,长度必需要与stats列数一致
optArray=max(stats,[],1);
% 这里设置假设所有指标均为正向型指标,各指标的最大值组成参考数列,在实际应用中根据具体情况进行设置
%% 原始评价矩阵及样本序号
[r,c]=size(stats);
% stats的行数和列数,即评价对象的个数及评价指标的个数
samNo=1:r;
% 样本序号
%% 数据规范化处理,将各指标数据与参考数列一起规范化到0-1之间
% 这里假设全为正向指标,即假设全部指标值越大越好,在实际应用中根据具体情况分别需对不同类型的指标数据进行标准化处理,然后再这里修改相应的代码
stdMatrix=zeros(r+1,c); % 给标准化矩阵分配空间,第一行为参考数列的标准化值,第二行至最后一行为原始评价矩阵的标准化值
optArryAndStat=[optArray;stats];
maxOfCols=max(optArryAndStat);
% 包括参考数列在内的各列的最大值
minOfCols=min(optArryAndStat);
% 包括参考数列在内的各列的最小值
for j=1:c
for i=1:r+1
stdMatrix(i,j)=(optArryAndStat(i,j)-minOfCols(j))./(maxOfCols(j)-minOfCols(j));
% 计算标准化指标值
end
end
%% 计算关联系数
absValue=zeros(r,c);
% 给绝对差值序列分配空间
R_0 = stdMatrix(1,:); % 标准化处理后的参考数列
for i=2:r+1
absValue(i-1,:)=abs(stdMatrix(i,:)-R_0); % 绝对差值序列计算
end
minAbsValueOfCols=min(absValue,[],1);
% absValue每一列的最小值
maxAbsValueOfCols=max(absValue,[],1);
% absValue每一列的最大值
minAbsValue=min(minAbsValueOfCols);
% absValue的最小值
maxAbsValue=max(maxAbsValueOfCols);
% absValue的最大值
defCoeff=0.5;
% 设置分辨系数为0.5
relCoeff=(minAbsValue+defCoeff*maxAbsValue)./(absValue+defCoeff*maxAbsValue);
% 关联系数计算
%% 计算关联度
% 在实际应用中可采用不同的方法确定权重,然后再这里修改相应的代码
weights=EntropyWeight(stdMatrix(2:r,:)); % 权重
P=zeros(r,1);
% 给关联度序列分配空间
for i=1:r
for j=1:c
P(i,1)=relCoeff(i,j)*weights(j); % 关联度计算
end
end
%% 权重可视化
[sortW,IXW]=sort(weights,'descend');
% 权重降序排序,IXW确保对应的指标名称一致
indexes={};
for i=1:c
indexes(i)={strcat('指标',num2str(i))}; % 指标名称为“指标1”、指标“2”……
end
sortIndex=indexes(IXW);
% 排序后与权重对应的指标名称
figure;
subplot(1,2,1);
bar(weights);
xlim([0 c+1]);
% 设置x轴范围
xlabel('指标名称','FontSize',12,'FontWeight','bold');
set(gca,'xtick',1:c);
set(gca,'XTickLabel',indexes,'FontWeight','light');
ylabel('权重','FontSize',12,'FontWeight','bold');
set(gca,'YGrid','on');
for i=1:c
text(i-0.35,weights(i)+0.005,sprintf('%.3f',weights(i)));
end
title('指标权重可视化');
box off;
subplot(1,2,2);
bar(sortW);
xlim([0 c+1]);
% 设置x轴范围
xlabel('指标名称','FontSize',12,'FontWeight','bold');
set(gca,'xtick',1:c);
set(gca,'XTickLabel',sortIndex,'FontWeight','light');
ylabel('权重','FontSize',12,'FontWeight','bold');
set(gca,'YGrid','on');
for i=1:c
text(i-0.35,sortW(i)+0.005,sprintf('%.3f',sortW(i)));
end
title('指标权重可视化(降序排列)');
box off;
%% 关联度分析结果展示
[sortP,IX]=sort(P,'descend'); % 关联度降序排序,IX确保对应的样本序号一致
sortSamNo=samNo(IX);
% 排序后与关联度对应的样本序号
figure;
subplot(2,1,1);
plot(P,'--rs',...
'LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
'MarkerSize',10);
xlim([1 r]);
% 设置x轴范围
xlabel('样本序号','FontSize',12,'FontWeight','bold');
set(gca,'xtick',1:r);
set(gca,'XTickLabel',samNo,'FontWeight','light');
ylabel('关联度','FontSize',12,'FontWeight','bold');
title('XXX事物灰色关联度综合评价结果');
grid on;
subplot(2,1,2);
plot(sortP,'--rs',...
'LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
'MarkerSize',10);
xlim([1 r]);
% 设置x轴范围
xlabel('样本序号','FontSize',10,'FontWeight','bold');
set(gca,'xtick',1:r);
set(gca,'XTickLabel',sortSamNo,'FontWeight','light');
ylabel('关联度','FontSize',10,'FontWeight','bold');
title('XXX事物灰色关联度综合评价结果(降序排列)');
grid on;
hold off;
end
三、程序演示
1、随机生成一个20×5的评价矩阵,即20个评价对象、5个评价指标,matlab命令窗口中输入:test=80+12*randn(20,8);
2、调用灰色关联度函数,命令窗口中输入:GreyRelationDegree(test)
3、程序运行结果如下:
四、参考文献
[1] 刘思峰,党耀国,等. 灰色系统理论及其应用(第5版) [M]. 北京:科学出版社:2010.
[2] 穆瑞,张家泰. 基于灰色关联分析的层次综合评价[J]. 系统工程理论与实践,2008,28(10):125-130.