其主要用于解决评价类问题(例如:选择哪种方案最好、哪位运动员或者员工表现的更优秀)
一个很典型的层次分析法案例:
确定评价目标:
高考完后小明想要去旅游,有三个目的地供他选择:
- 苏杭
- 北戴河
- 桂林
确定评价准则:
假如小明要选择目的地,他同时考虑以下的条件,我们称为评价准则:
- 景色
- 花费
- 居住
- 饮食
- 交通
确定评价准则的判断矩阵:
在这之前,我们要介绍一下重要程度表:
当两个条件互相比较时,谁比谁重要,可以用这张表的数值(1~9)来进行打分。
我们要依次确定这个五个条件的权重以便小明选择目的地,假如我们问小明:
博主 :”小明,你觉得这五个条件对你来说对于选择目的地来说更重要啊?“
小明:”一次让我来说的话可能不太好判断,每个我感觉都挺重要啊。。。“
于是我们就会遇到这样的问题,但条件很多时,我们就不好一下子直接说出哪一个条件对于目的地的选择更加重要(或者说在小明心中的权重)。所以这个时候我们可以构造一个表格来两两比较:
观察以上表格,分成三个部分:
- 对角线以上
拿景色与花费做例子,景色相比与花费,小明觉得景色对于他来说要求不是那么高,反而会更在意花费,所以景色相对于花费的值是1/2
- 对角线
由于表格的对角线是条件与自己相比,所以值为1(同等重要)
- 对角线以下
既然对角线以上是景色比花费,那么对角线就是花费比景色,正好相反
所以我们看到,对角线以下的是对角线以上的倒数,由于有五个评价准则,所以一共要两两比较:
次就可以填满整张表。
下面是结果:
总结:上面的上面这个表是一个5 X 5的方阵,我们记为A
,对应的元素为:
这个方阵有如下特点:
-
aij
的意思是i
与指标𝑗
相比,𝑖
的程度 - 当
𝑖 = 𝑗
时,两个指标相同,因此同等重要记为1,这就解释了主对角线元素为1。 -
𝑎ij> 0
且满足𝑎ij X 𝑎ji = 1
(我们称满足这一条件的矩阵为正互反矩阵)
上面这个矩阵就是层次分析法中的判断矩阵,得到了判断矩阵,就可以计算出权重了
确定目标的判断矩阵:
既然评价准则之间有判断矩阵,在小明心中,对于景色来说,苏杭,北戴河,桂林之间可能也有不同的分数,他可能觉得在景色方面,桂林更胜一筹,那么桂林的分数就要比其它两个的分数要高,那这样单单就景色来说,苏杭,北戴河,桂林之间就要两两之间进行比较,其它的条件也是同样如此,于是我们可以类比以上的表格:
- 景色:
- 花费
- 居住
- 饮食
- 交通
一致矩阵的概念
由于以上表格都是我们问,小明答,有很强的主观意愿,所以这张表表格很可能出错,下面我们就来看一个错误的例子:
如上图所示,出现了不一致的现象,那么我们来看一个一致的矩阵:
我们观察这个矩阵,它的各行各列成比例,我们称这个矩阵为一致矩阵,我们可以用数学符号来表达:
所以,综上所述:各行(各列)之间成倍数关系的矩阵为一致矩阵。
总结:
- 矩阵中每个元素都大于0且对角线元素为1的矩阵我们成为正互反矩阵
- 在层次分析法中,我们构造的判断矩阵都是正互反矩阵
- 若正互反矩阵满足各行各列成比例,我们称为一致矩阵
所以,我们得到的判断矩阵一定是正互反矩阵,由于跟实际情况中可变的因素有很多,所以我们的正互反矩阵在现实生活中很难满足各行各列成比例,所以也就很难让正互反矩阵成为一致矩阵,但是我们可以对正互反矩阵进行一致性检验,让它在一定的范围误差内,在此误差内我们可以看作其满足一致性矩阵的条件,所以我们在得到了判断矩阵(正互反矩阵)后要进行一致性检验
对判断矩阵进行一致性检验:
原理: 检验我们构造的判断矩阵和一致矩阵是否有太大的差别。
一致性检验的步骤:
- 计算判断矩阵的特征值:
如果特征值中有虚数,则比较的是特征值的模长。
这个由于计算较为繁琐,我们可以交给MATLAB完成,使用eig命令既可以计算特征值,也可以计算特征向量。
当最大特征值等于矩阵阶数的时候,我们的正互反矩阵才为一致矩阵:
当最大特征值与n相差越大时,我们得到的矩阵越不一致。
- 计算一致性指标
CI
: - 查找对应的平均随机一致性指标
RI
:
注:在实际运用中,n很少超过10,如果指标的个数大于10,则可考虑建立 二级指标体系,或使用我们以后要学习的模糊综合评价模型。
- 计算一致性比例
CR
: - 对一致性比例
CR
进行判断:
如果CR<0.1
,则判断矩阵的一致性可以接受。
如果CR>0.1
,则要对判断矩阵进行修正。
计算判断矩阵的权重:
计算权重有三种方法:
算数平均法求权重:
步骤:
- 将判断矩阵按照列归一化(每一个元素除以其所在列的和)
我们看一个例子:
第一列:
第二列:
第三列:
于是我们得到以下表格: - 将归一化的各行相加:
相加后我们得到以下表格:
- 除以
n
得到最后的权重
几何平均法求权重:
步骤:
- 将
A
的元素按照行相乘得到一个新的列向量
在MATLAB中使用prod(A,2)命令即可以对一行进行相乘
A =
1.0000 2.0000 5.0000
0.5000 1.0000 2.0000
0.2000 0.5000 1.0000
使用prod(A,2)
命令:
>> prod(A,2)
ans =
10.0000
1.0000
0.1000
- 将新的向量的每个分量开
n
次方
>> ans.^(1/3)
ans =
2.1544
1.0000
0.4642
- 对该列向量进行归一化即可得到权重向量
结果:
注: 权重和应为1,这里由于四舍五入所以会有可以忽略的差距。
特征值法求权重:
步骤:
1.在MATLAB
中使用eig
命令求特征值和特征向量:
A =
1.0000 2.0000 5.0000
0.5000 1.0000 2.0000
0.2000 0.5000 1.0000
>> [v,r] = eig(A)
v =
-0.8902 + 0.0000i -0.8902 + 0.0000i -0.8902 + 0.0000i
-0.4132 + 0.0000i 0.2066 + 0.3578i 0.2066 - 0.3578i
-0.1918 + 0.0000i 0.0959 - 0.1661i 0.0959 + 0.1661i
r =
3.0055 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i
0.0000 + 0.0000i -0.0028 + 0.1290i 0.0000 + 0.0000i
0.0000 + 0.0000i 0.0000 + 0.0000i -0.0028 - 0.1290i
找出最大特征值为3.0055
2. 对求出的特征向量进行归一化即可得到我们的权重:
最大特征值对应的特征向量
-0.8902 + 0.0000i
-0.4132 + 0.0000i
-0.1918 + 0.0000i
归一化:
0.5954
0.2764
0.1283
三种方法计算的权重结果:
将计算结果填入权重表,得到:
计算评价准则的权重:
- 得到评价准则的判断矩阵:
- 用三种方法计算权重:
- 填入表格:
求出其它评价准则对应的权重:
汇总结果得到权重矩阵:
根据权重表格计算每个目标的得分:
类似我们求出:
结果:
因此最佳的旅游景点是桂林
总结:
1.建立层次结构:
2.构造准则层之间判断矩阵:
3.构造方案层之间判断矩阵:
4.对以上每个判断矩阵进行一致性检验(通过后才能计算权重):
5.通过检验后根据权重矩阵计算得分,并进行排序
三种方法计算权重:
注意事项:
- 一致矩阵不需要进行一致性检验,只有非一致矩阵的判断矩阵才需要进行一致性检验
- 在论文写作中,应该先进行一致性检验,通过检验后再计算权重,以上讲解的只是为了顺应计算过程。
- 特征值可用
MATLAB
进行计算,如果特征值中有虚数,则比较的是特征值的模长。 - 如果
CR > 0.1
,我们可以往一致矩阵上调整(这个就看你自己了,反正评委也不知道是吧~) - 平均随机一致性指标
RI
的表格中n
最多是15
层次分析法的一些局限性:
- 评价的准则层
n
不能太多(一般不超过十个),太多的话n
(最多是15)会很大,判断矩阵和一致矩阵差异可能会很大。
代码(含有详细注释):
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
可以参考的矩阵:
将以下五个矩阵依次输入以上代码中就可以直接求出各种结果
评价准则:
[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]
景色:
[1,2,5;
1/2,1,2;
1/5,1/2,1;]
花费:
[1,1/3,1/8;
3,1,1/3;
8,3,1;]
居住:
[1,1,3;
1,1,3;
1/3,1/3,1;]
饮食:
[1,3,4;
1/3,1,1;
1/4,1,1;]
交通 :
[1,1,1/4;
1,1,1/4;
4,4,1;]