目录
层次分析法(AHP):
解决评价列问题三个方面:
评价类问题权重表格:
一致矩阵
一致性检验(用到高代知识)
一致矩阵计算权重
若判断矩阵为一致矩阵:
矩阵为非一致矩阵
方法1算术平均法求权重:
方法二几何平均法求权重:
方法3特征值法求权重
得出结果
层次分析法做题步骤:
层次分析法局限性
代码讲解
代码可以优化的地方
模型拓展
层次分析法主要用于解决评价类问题(例如:选择哪种方案更好、哪位员工、运动员等表现得更优秀【确定评价指标、形成评价体系】)
例如选择某个学校:
指标权重 | 华科 | 武大 | |
学习氛围 | 0.4 | 0.7 | 0.3 |
就业前景 | 0.3 | 0.5 | 0.5 |
男女比例 | 0.2 | 0.3 | 0.7 |
校园景色 | 0.1 | 0.25 | 0.75 |
华科最终得分:0.515
0.7 * 0.4 * + 0.5 * 0.3 + 0.3 * 0.2 + 0.25 * 0.1
武大最终得分:0.485
0.3 * 0.4 + 0.5 * 0.3 + 0.7 * 0.2 + 0.75 * 0.1
那如何得出指标权重?(层次分析法思想登场)
有多个指标的时候,我们一次性考虑五个指标之间的关系,往往考虑不周,为了更加准确的得出五个指标的权重,我们采用两两比较的方法,最终根据两两比较的结果推算出权重。这时就用到了下方的重要程度表(重要程度也可以理解为满意度)
标度 | 含义 |
1 | 表示两个个因素相比,具有同样重要性 |
3 | 表示两个因素相比,一个因素比另一个因素稍微重要 |
5 | 表示两个因素相比,一个因素比另一个因素明显重要 |
7 | 表示两个因素相比,一个因素比另一个因素强烈重要 |
9 | 表示两个因素相比,一个因素比另一个因素极端重要 |
2,4,6,8 | 上述两相邻判断的中值 |
倒数 | A和B相比如果标度为3,那么B和A相比就是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 |
标度 | 含义 |
1 | 同样重要性 |
3 | 稍微重要 |
5 | 明显重要 |
7 | 强烈重要 |
9 | 极端重要 |
2,4,6,8 | 上述两相邻判断的中值 |
倒数 | A和B相比如果标度为3,那么B和A相比就是1/3 |
上述左表中的数据部分是一个5 * 5的方阵,我们计为A,对应元素为
方阵特点:
(1)表示的意义是,与指标j相比,i的重要程度。
(2)当i = j时,两个指标相同,因此同等重要记为1,这就解释了主对角线元素为1.
(3) > 0 且满足 * = 1(我们称满足这一条件的矩阵为正互反矩阵)
实际上这个矩阵就是层次分析法中的判断矩阵
同样的我们可以得到如下表格
一个可能出现问题的地方:
此时引入一个概念——一致矩阵(绝对一致是不太好实现的,我们要把一致性控制在一个程度内)
若矩阵中每个元素 > 0 且满足 * = 1 ,则我们称该矩阵为正互反矩阵。 在层次分析法中,我们构造的判断矩阵均是正互反矩阵。 若正互反矩阵满足,则我们称其为一致矩阵。推导如下:
特点:各行(各列)成倍数关系【判断一致矩阵方法】,只要各行(各列)成倍数关系就是一致矩阵
例如下图:图中一致矩阵 , 以此类推都满足倍数关系
在使用判断矩阵求权重之前,必须对其进行一致性检验,若不一致程度太大,判断矩阵失效
下面给出两个矩阵,左表为不一致矩阵,右表为一致矩阵
可见这两者的区别有a13从5变成了4,呢么如何判断5和4的差距大不大呢?这是就需要用到一致性检验。
原理:检验我们构造的判断矩阵和一致矩阵是否有太大的差别
引理1:
A为n阶方阵,且r(A) = 1,则A有一个特征值为tr(A),其余特征值均为0
因为一致矩阵有一个特征值为n,所以一致矩阵的秩一定为1
由引理可知:一致矩阵有一个特征值为n,其余特征值均为0.
引理2:
n阶正互反矩阵A为一致矩阵时当且仅当最大特征值,且当正互反矩阵A非一致时,一定满足
如下图,我们设要检验的变量为a,由右表知当判断矩阵越不一致的时,最大特征值与n相差就越大(检验矩阵与一致矩阵相差大不大其实就是检验最大特征值与n相差大不大)
一致性检验步骤:
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 |
至于一致性指标RI是怎么计算来的,为什么这样构造CI以及为什么一0.1为划分依据并不需要了解透彻,实际做题中不需要知道为什么。
例如:
有由此图可知,苏杭在景色方面重要程度为1,北戴河在景色方面重要程度为1/2,桂林在景色方面重要程度为1/4.
注意,权重处理一定要进行归一化理:
苏杭 = 1/(1+0.5+0.25)
北戴河= 0.5/(1+0.5+0.25)
桂林= 0.25/(1+0.5+0.25)
因为是一致性矩阵,所以用第一列和用其他列计算结果是一样的
数学描述 :
例如:
归一化:
苏杭 = 1/(1+0.5+0.2) = 0.5882
北戴河 = 0.5/(1+0.5+0.2) = 0.2941
桂林 = 0.2/(1+0.5+0.2) = 0.1177
同样的方法将整个表格归一化
步骤(和方法一步骤大致相同):
数学描述
一致矩阵有一个特征值n,其余特征值均为0.
另外,我们很容易得到,特征值为n时,对应的特征向量刚好为(k!=0),这一特征向量刚好就是一致矩阵的第一列。
步骤
计算 出各个表格的权重后,得到如下表格
通过Excel计算得出各个景点的的得分(F4锁定单元格)
使用SmartArt画层次结构图 ,使用亿图图示画层次结构图
(1)评价的决策层不能太多,太多的话n会很大,判断矩阵和一致矩阵差异可能会很大
(2)如果决策层中指标的数据是已知的,就不能用层次分析法了
%% 注意:在论文写作中,应该先对判断矩阵进行一致性检验,然后再计算权重,因为只有判断矩阵通过了一致性检验,其权重才是有意义的。
%% 在下面的代码中,我们先计算了权重,然后再进行了一致性检验,这是为了顺应计算过程,事实上在逻辑上是说不过去的。
%% 因此大家自己写论文中如果用到了层次分析法,一定要先对判断矩阵进行一致性检验。
%% 而且要说明的是,只有非一致矩阵的判断矩阵才需要进行一致性检验。
%% 如果你的判断矩阵本身就是一个一致矩阵,那么就没有必要进行一致性检验。
%% 输入判断矩阵
clear;clc
disp('请输入判断矩阵A: ')
%1、输入前可以判断A的维度是否大于1或是否为方阵
%
% 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(:))哦~【max(D)得到每一列的最大值】
% 那么怎么找到最大特征值所在的位置了? 需要用到find函数,它可以用来返回向量或者矩阵中不为0的元素的位置索引。
% 那么问题来了,我们要得到最大特征值的位置,就需要将包含所有特征值的这个对角矩阵D中,不等于最大特征值的位置全变为0
% 这时候可以用到矩阵与常数的大小判断运算
D == Max_eig
[r,c] = find(D == Max_eig , 1)%【D == Max_eig(判断语句),返回一个逻辑及矩阵,将最大特征值所在位置变为1,其余位置为0】
% 找到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【RI为已知表】
%当n=2时,该表一定是一致矩阵,但是因为RI为0.此时计算CR时分母为0,按照步骤一致性检验时会显示不通过,所以我们可以把RI表中的前两位改为很接近0的正数(0.00001)
CR=CI/RI(n);%RI(n)代表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
%输入之前可以先判断一下输入是否正确
disp('请输入判断矩阵A')
A=input('A=');% 这里输入的就是我们的判断矩阵,其为n阶方阵(行数和列数相同)
% 在开始下面正式的步骤之前,我们有必要检验下A是否因为粗心而输入有误
ERROR = 0; % 默认输入是没有错误的
%(1)检查矩阵A的维数是否不大于1或不是方阵
[r,c]=size(A);
%size(A)函数是用来求矩阵的大小的,返回一个行向量,第一个元素是矩阵的行数,第二个元素是矩阵的列数
%[r,c]=size(A) %将矩阵A的行数返回到第一个输出变量r,将矩阵的列数返回到第二个输出变量c
if r ~= c || r <= 1
% 注意哦,不等号是 ~= (~是键盘Tab上面那个键,要和Shift键同时按才会出来),别和C语言里面的!=搞混了
% ||表示逻辑运算符‘或’(在键盘Enter上面,也要和Shift键一起按) 逻辑运算符且是 && (&读and,连接符号,是and的缩写。 )
ERROR = 1;
end
%(2)检验是否为正互反矩阵 a_ij > 0 且 a_ij * a_ji = 1
if ERROR == 0
[n,n] = size(A);
% 因为我们的判断矩阵A是一个非零方阵,所以这里的r和c相同,我们可以就用同一个字母n表示
% 判断是否有元素小于0
% for i = 1:n
% for j = 1:n
% if A(i,j)<=0
% ERROR = 2;
% end
% end
% end
if sum(sum(A <= 0)) > 0%用逻辑矩阵的方法更方便,逻辑矩阵中元素要么全为0,要么有若干个1
ERROR = 2;
end
end
%顺便检验n是否超过了15,因为RI向量为15维
if ERROR == 0
if n > 15
ERROR = 3;
end
end
if ERROR == 0
% 判断 a_ij * a_ji = 1 是否成立
if sum(sum(A' .* A ~= ones(n))) > 0
ERROR = 4;
end
% A' 表示求出 A 的转置矩阵,即将a_ij和a_ji互换位置
% ones(n)函数生成一个n*n的全为1的方阵, zeros(n)函数生成一个n*n的全为0的方阵
% ones(m,n)函数生成一个m*n的全为1的矩阵
% MATLAB在矩阵的运算中,“/”号和“*”号代表矩阵之间的乘法与除法,对应元素之间的乘除法需要使用“./”和“.*”
% 如果a_ij * a_ji = 1 满足, 那么A和A'对应元素相乘应该为1
end
if ERROR == 0
% % % % % % % % % % % % %方法1: 算术平均法求权重% % % % % % % % % % % % %
.....
% % % % % % % % % % % % %方法2: 几何平均法求权重% % % % % % % % % % % % %
.....
% % % % % % % % % % % % %方法3: 特征值法求权重% % % % % % % % % % % % %
.....
% % % % % % % % % % % % %计算一致性比例CR的环节% % % % % % % % % % % % %
.....
elseif ERROR == 1
disp('请检查矩阵A的维数是否不大于1或不是方阵')
elseif ERROR == 2
disp('请检查矩阵A中有元素小于等于0')
elseif ERROR == 3
disp('A的维数n超过了15,请减少准则层的数量')
elseif ERROR == 4
disp('请检查矩阵A中存在i、j不满足A_ij * A_ji = 1')
end
字太多了,不想写了