层次分析法(AHP)

理论

简介

  层次分析法(The Analytic Hierarchy Process即AHP)是由美国运筹学家、匹兹堡大学教授T.L.Saaty于20世纪70年代创立的一种系统分析与决策的综合评价方法,是在充分研究了人类思维过程的基础上提出来的,它较合理地解决了定性问题定量化的处理过程。
  AHP的主要特点是通过建立递阶层次结构,把人类的判断转化到若干因素两两之间重要度的比较上,从而把难于量化的定性判断转化为可操作的重要度的比较上面。在许多情况下,决策者可以直接使用AHP进行决策.极大地提高了决策的有效性、可靠性和可行性,但其本质是一种思维方式,它把复杂问题分解成多个组成因素,又将这些因素按支配关系分别形成递阶层次结构,通过两两比较的方法确定决策方案相对重要度的总排序。整个过程体现了人类决策思维的基本特征,即分解、判断、综合,克服了其他方法回避决策者主观判断的缺点。


适用范围

  1. 遇到确定评价指标、形成评价体系,这个就是评价类问题。
  2. 评价类问题可以用打分解决。
  3. 评价类问题(例如:选择哪种方案最好、哪位运
    动员或者员工表现的更优秀)。

层次分析法步骤

  1. 分析系统中各因素之间的关系,建立系统的递阶层次结构
  2. 对于同一层次的各元素关于上一层次中某一准则的重要性进行两两比较,构造两两比较矩阵(判断矩阵)。
  3. 由判断矩阵计算被比较元素对于该准则的相对权重,并进行一致性检验(检验通过权重才能用)。
  4. 根据权重矩阵计算得分,并进行排序。

注意:如果你用到了层次分析法,那么层次结构图要放在你的建模论文中哦。


思考

  1. 我们评价的目标是什么?
  2. 我们未来达到这个目标有哪几种可以选择的方案
  3. 评价的标准或者说是准则是什么?(我们根据什么东西或者法则来评价好坏)

前两个问题的答案是显而易见的,第三个问题的答案我们可以根据题目中的背景材料、常识以及网上搜集的参考资料进行结合,从中来筛选出最合适的指标。


一致性检验

原理:检验我们构造的判断矩阵和一致矩阵是否有太大的差别。

  • 计算一致性指标$CI$
    $$
    C I=\frac{\lambda_{\max }-n}{n-1}
    $$
  • 查找对应的平均随机一致性指标$RI$
$n$ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
$RI$ 0 0 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

注意:在实际运用中,$n$很少超过10,如果指标的个数大于10,则可以考虑建立二级指标体系,或使用模糊综合评价模型。
$RI$我们只需要会查表即可

  • 计算一致性比例$CR$

$$
C R=\frac{C I}{R I}
$$

如果$CR<0.1$,则可以认为判断矩阵的一致性可以接受;否则需要对判断矩阵进行修正。

特征值可用$Matlab$软件进行计算,如果特征值中有虚数,则比较的是特征值的模长。

注:

  1. 一致矩阵不需要进行一致性检验,只有非一致矩阵的判断矩阵才需要进行一致性检验;
  2. 在论文写作中,应该先进行一致性检验,通过检验后再计算权重。

代码

1

%% 注意:在论文写作中,应该先对判断矩阵进行一致性检验,然后再计算权重,因为只有判断矩阵通过了一致性检验,其权重才是有意义的。
%% 在下面的代码中,我们先计算了权重,然后再进行了一致性检验,这是为了顺应计算过程,事实上在逻辑上是说不过去的。
%% 因此大家自己写论文中如果用到了层次分析法,一定要先对判断矩阵进行一致性检验。
%% 而且要说明的是,只有非一致矩阵的判断矩阵才需要进行一致性检验。
%% 如果你的判断矩阵本身就是一个一致矩阵,那么就没有必要进行一致性检验。

disp('请输入判断矩阵A')
A=input('A=');
[n,n] = size(A);
% % % % % % % % % % % % %方法1: 算术平均法求权重% % % % % % % % % % % % %
Sum_A = sum(A);
SUM_A = repmat(Sum_A,n,1);
Stand_A = A ./ SUM_A;

disp('算术平均法求权重的结果为:');
disp(sum(Stand_A,2)./n)
% % % % % % % % % % % % %方法2: 几何平均法求权重% % % % % % % % % % % % %
Prduct_A = prod(A,2);
Prduct_n_A = Prduct_A .^ (1/n);
disp('几何平均法求权重的结果为:');
disp(Prduct_n_A ./ sum(Prduct_n_A))
% % % % % % % % % % % % %方法3: 特征值法求权重% % % % % % % % % % % % %
[V,D] = eig(A);
Max_eig = max(max(D));
[r,c]=find(D == Max_eig , 1);
disp('特征值法求权重的结果为:');
disp( V(:,c) ./ sum(V(:,c)) )
% % % % % % % % % % % % %下面是计算一致性比例CR的环节% % % % % % % % % % % % %
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

2

%% 注意:在论文写作中,应该先对判断矩阵进行一致性检验,然后再计算权重,因为只有判断矩阵通过了一致性检验,其权重才是有意义的。
%% 在下面的代码中,我们先计算了权重,然后再进行了一致性检验,这是为了顺应计算过程,事实上在逻辑上是说不过去的。
%% 因此大家自己写论文中如果用到了层次分析法,一定要先对判断矩阵进行一致性检验。
%% 而且要说明的是,只有非一致矩阵的判断矩阵才需要进行一致性检验。
%% 如果你的判断矩阵本身就是一个一致矩阵,那么就没有必要进行一致性检验。

%% 输入判断矩阵
clear;clc
disp('请输入判断矩阵A: ')
% A = input('判断矩阵A=')
A =[1 1 4 1/3 3;
 1 1 4 1/3 3;
 1/4 1/4 1 1/3 1/2;
 3 3 3 1 3;
 1/3 1/3 2 1/3 1]
% matlab矩阵有两种写法,可以直接写到一行:
% [1 1 4 1/3 3;1 1 4 1/3 3;1/4 1/4 1 1/3 1/2;3 3 3 1 3;1/3 1/3 2 1/3 1]
% 也可以写成多行:
[1 1 4 1/3 3;
 1 1 4 1/3 3;
 1/4 1/4 1 1/3 1/2;
 3 3 3 1 3;
 1/3 1/3 2 1/3 1]
% 两行之间以分号结尾(最后一行的分号可加可不加),同行元素之间以空格(或者逗号)分开。

%% 方法1:算术平均法求权重
% 第一步:将判断矩阵按照列归一化(每一个元素除以其所在列的和)
Sum_A = sum(A)

[n,n] = size(A)  % 也可以写成n = size(A,1)
% 因为我们的判断矩阵A是一个方阵,所以这里的r和c相同,我们可以就用同一个字母n表示
SUM_A = repmat(Sum_A,n,1)   %repeat matrix的缩写
% 另外一种替代的方法如下:
    SUM_A = [];
    for i = 1:n   %循环哦,这一行后面不能加冒号(和Python不同),这里表示循环n次
        SUM_A = [SUM_A; Sum_A]
    end
clc;A
SUM_A
Stand_A = A ./ SUM_A
% 这里我们直接将两个矩阵对应的元素相除即可

% 第二步:将归一化的各列相加(按行求和)
sum(Stand_A,2)

% 第三步:将相加后得到的向量中每个元素除以n即可得到权重向量
disp('算术平均法求权重的结果为:');
disp(sum(Stand_A,2) / n)
% 首先对标准化后的矩阵按照行求和,得到一个列向量
% 然后再将这个列向量的每个元素同时除以n即可(注意这里也可以用./哦)

%% 方法2:几何平均法求权重
% 第一步:将A的元素按照行相乘得到一个新的列向量
clc;A
Prduct_A = prod(A,2)
% prod函数和sum函数类似,一个用于乘,一个用于加  dim = 2 维度是行

% 第二步:将新的向量的每个分量开n次方
Prduct_n_A = Prduct_A .^ (1/n)
% 这里对每个元素进行乘方操作,因此要加.号哦。  ^符号表示乘方哦  这里是开n次方,所以我们等价求1/n次方

% 第三步:对该列向量进行归一化即可得到权重向量
% 将这个列向量中的每一个元素除以这一个向量的和即可
disp('几何平均法求权重的结果为:');
disp(Prduct_n_A ./ sum(Prduct_n_A))

%% 方法3:特征值法求权重
% 第一步:求出矩阵A的最大特征值以及其对应的特征向量
clc
[V,D] = eig(A)    %V是特征向量, D是由特征值构成的对角矩阵(除了对角线元素外,其余位置元素全为0)
Max_eig = max(max(D)) %也可以写成max(D(:))哦~
% 那么怎么找到最大特征值所在的位置了? 需要用到find函数,它可以用来返回向量或者矩阵中不为0的元素的位置索引。
% 那么问题来了,我们要得到最大特征值的位置,就需要将包含所有特征值的这个对角矩阵D中,不等于最大特征值的位置全变为0
% 这时候可以用到矩阵与常数的大小判断运算
D == Max_eig
[r,c] = find(D == Max_eig , 1)
% 找到D中第一个与最大特征值相等的元素的位置,记录它的行和列。

% 第二步:对求出的特征向量进行归一化即可得到我们的权重
V(:,c)
disp('特征值法求权重的结果为:');
disp( V(:,c) ./ sum(V(:,c)) )
% 我们先根据上面找到的最大特征值的列数c找到对应的特征向量,然后再进行标准化。

%% 计算一致性比例CR
clc
CI = (Max_eig - n) / (n-1);
RI=[0 0 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
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

权重计算

算数平均法求权重

  1. 将判断矩阵按照列归一化(每一个元素除以其所在列的和)
  2. 将归一化的各列相加(按行求和)
  3. 将相加后得到的向量中每个元素除以n即可得到权重向量

假设判断矩阵
$$
A=\left[\begin{array}{cccc}a{11} & a{12} & \cdots & a{1 n} \a{21} & a{22} & \cdots & a{2 n} \vdots & \vdots & \ddots & \vdots \a{n 1} & a{n 2} & \cdots & a{n n}\end{array}\right]
$$,
那么算数平均法求得的权重向量$\omega
{i}=\frac{1}{n} \sum{j=1}^{n} \frac{a{i j}}{\sum{k=1}^{n} a{k j}}(\omega \text { 读作omega })(i=1,2, \cdots, n)$

几何平均法求权重

  1. 将$A$的元素按照行相乘得到一个新的列向量
  2. 将新的向量的每个分量开$n$次方
  3. 对该列向量进行归一化即可得到权重向量

假设判断矩阵$A=\left[\begin{array}{cccc}a{11} & a{12} & \cdots & a{1 n} \a{21} & a{22} & \cdots & a{2 n} \vdots & \vdots & \ddots & \vdots \a{n 1} & a{n 2} & \cdots & a{n n}\end{array}\right]$,
那么几何平均法求权重向量$\omega
{i}=\frac{\left(\prod{j=1}^{n} a{i j}\right)^{\frac{1}{n}}}{\sum{k=1}^{n}\left(\prod{j=1}^{n} a_{k j}\right)^{\frac{1}{n}}}, \quad(i=1,2, \cdots, n)$

特征值法求权重

一致矩阵有一个特征值为$n$,其余特征值均为0.
另外,我们很容易得到,特征值为$n$时,对应的特征向量刚好为$k\left[\frac{1}{a{11}}, \frac{1}{a{12}}, \cdots, \frac{1}{a_{1 n}}\right]^{T}(k \neq 0)$这一特征向量刚好就是一致矩阵的第一列。

注意,权重一定要进行归一化处理

层次分析法的一些局限性

  1. 评价的决策层不能太多,太多的话$n$会很大,判断矩阵和一致矩阵差异可能会很大。
  2. 如果决策层中指标的数据是已知的,那么我们如何利用这些数据来使得评价的更加准确呢?

例子


问题

  填好志愿后,小明同学想出去旅游。在查阅了网上的攻略后, 他初步选择了苏杭、北戴河和桂林三地之一作为目标景点。请你确定评价指标、形成评价体系来为小明同学选择最佳的方案。


思考

  • 我们评价的目标是什么?

为小明同学选择最佳的旅游景点。

  • 我们未来达到这个目标有哪几种可以选择的方案?

三种,分别是去苏杭、去北戴河和去桂林。

  • 评价的标准或者说是准则是什么?(我们根据什么东西或者法则来评价好坏)

题目没给相关数据支撑,需要我们确定。

假如我们查询资料后选择了以下五个指标:

  1. 景点景色
  2. 旅游花费
  3. 居住环境
  4. 饮食情况
  5. 交通便利程度

权重确定的方法

  • 直接问权重

直接问权重的弊端:
 这样的回答往往比较片面和不周全,在确定影响某因素的诸因子在该因素中所占的比重时,遇到的主要困难是这些比重常常不易定量化。此外,当影响某因素的因子较多时,直接考虑各因子对该因素有多大程度的影响时,常常会因考虑不周全、顾此失彼而使决策者提出与他实际认为的重要性程度不相一致的数据,甚至有可能提出一组隐含矛盾的数据。

  • 分治思想

一次性考虑这五个指标之间的关系,往往考虑不周。两个两个指标进行比较,最终根据两两比较的结果来推算出权重。

  • 层次分析思想

用1-9表示重要程度(见下表)

标度 含义
1 表示两个因素相比,具有同样重要性
3 表示两个因素相比,一个因素比另一个因素稍微重要
5 表示两个因素相比,一个因素比另一个因素明显重要
7 表示两个因素相比,一个因素比另一个因素强烈重要
9 表示两个因素相比,一个因素比另一个因素极端重要
2,4,6,8 上述两相邻判断的中值
倒数 A和B相比如果标度为3,那么B和A相比就是$\frac{1}{3}$

注:这里的重要性有时候解释为满意度更方便理解

根据两两重要程度的比较(共回答了次$C_{5}^{2}$次)填好如下图的表

景色 花费 居住 饮食 交通
景色 1 1/2 4 3 3
花费 2 1 7 5 5
居住 1/4 1/7 1 1/2 1/3
饮食 1/3 1/5 2 1 1
交通 1/3 1/5 3 1 1

层次分析法的这张表示交给“专家”来填的。

总结:上面的这个表是$5\times 5$的方阵,我们记为$A$,对应的元素为$a_{ij}$这个方阵有如下特点:

  1. $a_{ij}$表示的意义是,与指标$j$相比,$i$的重要程度。
  2. 当$i=j$时,两个指标相同,因此同等重要记为1,这就解释了主对角线元素为1
  3. $a{ij}>0$且满足$a{ij}\times a_{ji}=1$(我们称满足这一条件的矩阵为正互反矩阵)

上述这个矩阵就是层次分析法中的判断矩阵

得到了上述的判断矩阵,我们就可以计算出指标的权重了


计算方案的得分(权重)

通过对“专家”的询问填写方案的判断矩阵如下图

2

3

注意:判断矩阵中的元素只能是1至9和它们的倒数,有些文章中填入了其他的数(例如3/2、5/4),这是不可以的。

可能出现的问题

4

由此我们引入一致矩阵

$a{i j}=\frac{i \text { 的重要程度 }}{j \text { 的重要程度 }}, a{j k}=\frac{j \text { 的重要程度 }}{k \text { 的重要程度 }}a{i k}=\frac{i \text { 的重要程度 }}{k \text { 的重要程度 }}=a{i j} \times a_{j k}$

一致矩阵的重要特点各行(各列)之间成倍数关系
在层次分析法中,我们构造的判断矩阵均是正互反矩阵。
注意:在使用判断矩阵求权重之前,必须对其进行一致性检验


1

同颜色的单元格的和为1,它们表示的针对某一因素所占的权重(或得分)。

  以往的论文利用层次分析法解决实际问题时,都是采用其中某一种方法求权重,而不同的计算方法可能会导致结果有所偏差。为了保证结果的稳健性,本文采用了三种方法分别求出了权重后计算平均值,再根据得到的权重矩阵计算各方案的得分,并进行排序和综合分析,这样避免了采用单一方法所产生的偏差,得出的结论将更全面、更有效。


文章作者: Mr.Zhang
文章标题: 层次分析法(AHP)
文章链接: https://www.codewing.cn/index.php/69/ahp/
版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议。转载请注明来自Ying's Blog!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇