文章目录
- 前言
- 一、用途
- 二、基本思路
- 三、具体步骤
- 1.得到关系矩阵(判断矩阵)
- 2.求得指标自身的权重
- 3.一次性检验
- 最后
- 四、个人体会
- 五、附页(AHPMatlab代码)
前言
闲来无事,写一下文章为生活加点料。本文简述了本人对于传统、简单的评价类模型之一的层次分析法(AHP)模型的理解和看法。利用高考生综合各个因素选择高校的例子,结合Matlab实现AHP模型,当然,利用Python也是同样的可行。(文章中出现的高校信息是本人学习过程中模拟的数据,毫无实际意义,仅为学习所用。)
以下是本篇文章正文内容,下面案例可供参考
一、用途
可用来评价、分析以及选择有多个影响因素的多个决策、目标或者方案等。从而选出“最优解”。如下:
图片出自《层次分析法在太阳镜产品质量评价中的应用》。
二、基本思路
下面将按着流程图的各个步骤对AHP进行剖析。
三、具体步骤
1.得到关系矩阵(判断矩阵)
即先确定各个指标(影响因素自身)的判断矩阵和各个影响因素与各个目标(方案、决策等)的判断矩阵。
- 各个指标(影响因素自身)的判断矩阵
- 各个影响因素与各个目标(方案、决策等)的判断矩阵。
2.求得指标自身的权重
求得权重的方法主要有3种:算术平均法、几何平均法以及特征值法。(出处不同叫法可能会有所差异)
- 算术平均法
- 即具体公式如下所示:
- 几何平均法
- 即具体公式如下所示:
- 特征值法
对所求的最大特征值所对应的特征向量即是未归一化的权重向量,对该特征向量进行归一化处理,即可得各个指标的权重。
相对于三种方法,我本人较为喜欢用第三种方法,因为Matlab已经提供了现有的函数来求得矩阵的特征向量与特征值。(如:eig(A) function)
但出于结果的稳健性,可以利用三种方法分别求出权重,再加以求平均即可。
eg:
3.一次性检验
一次性检验,是为了说明你所使用的判断矩阵以及得到的权重是否合理、科学。为了保证结果的正确性,应该在每一个判断矩阵进行一次性检验。
具体方法如下:
- 计算一次性指标CI
其中式中的 λ 为判断矩阵的特征值。 - 查表得到一致性指标RI
3) 计算得到一致性比例CR
如果CR<0.10,则该判断矩阵的一致性是可以接受的。否则,这说明判断矩阵数据不合理,得需要修改。
eg:
最后
总结各组权重信息,计算出各个目标(决策、或者方案等)的最后得分,从而得出“最优解”:
四、个人体会
虽然说AHP是一种经典的、相对科学的决策、评判算法,但是不免还存在这许多的不足:
例如:
填写判断矩阵时过于主观(一般判断矩阵的填写都是向专家咨询),从而导致所得结果很大程度会受决策者的主观影响。
此次就是会发现层次分析法并没有引用过多的数据,我认为这也是它的一大弊病,缺乏数据的支持。
但是不免也是一种经典的算法,学习一下也无妨。多学无害。
那…那那怎么才能解决AHP的这些不足呢?笔者在这里想到了结合AHP或者熵权法的TOPSIS算法,我们下次再聊叭!!!=3=
五、附页(AHPMatlab代码)
A=input('A=');
[n,m] = size(A);
Sum_A = sum(A);
SUM_A = repmat(Sum_A,n,1);
Stand_A = A ./ SUM_A;
disp('算术平均法求权重的结果为:');
disp(sum(Stand_A,2)./n)
Prduct_A = prod(A,2);
Prduct_n_A = Prduct_A .^ (1/n);
disp('几何平均法求权重的结果为:');
disp(Prduct_n_A ./ sum(Prduct_n_A))
[V,D] = eig(A);
Max_eig = max(max(D));
[r,c]=find(D == Max_eig , 1);
disp('特征值法求权重的结果为:');
disp( V(:,c) ./ sum(V(:,c)) )
CI = (Max_eig - n) / (n-1);
RI=[0 0.0001 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59]; %注意哦,这里的RI最多支持 n = 15
% 这里n=2时,一定是一致矩阵,所以CI = 0,我们为了避免分母为0,将这里的第二个元素改为了很接近0的正数
CR=CI/RI(n);
disp('一致性指标CI=');disp(CI);
disp('一致性比例CR=');disp(CR);
if CR<0.10
disp('因为CR<0.10,所以该判断矩阵A的一致性可以接受!');
else
disp('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!');
end