大家好,欢迎来到IT知识分享网。
目录
层次分析法(AHP):
层次分析法主要用于解决评价类问题(例如:选择哪种方案更好、哪位员工、运动员等表现得更优秀【确定评价指标、形成评价体系】)
解决评价列问题三个方面:
- 我们评价的目标是什么?(分析题目)
- 我们为了达到这个目标有哪几种可选择方案?(分析题目)
- 评价的准则或指标是什么?(题目中的背景材料、常识、参考文献以及搜索)
评价类问题权重表格:
- 分析问题得出评判问题的子标
- 分别给不同子标赋予权重(权重和要为1)
- 给不同方案对应不同子标给予打分(不同方案对于每个子标打分和要为1)
例如选择某个学校:
指标权重 | 华科 | 武大 | |
学习氛围 | 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.
另外,易知,特征值为n时,对应的特征向量为
引理2:
n阶正互反矩阵A为一致矩阵时当且仅当最大特征值,且当正互反矩阵A非一致时,一定满足
如下图,我们设要检验的变量为a,由右表知当判断矩阵越不一致的时,最大特征值与n相差就越大(检验矩阵与一致矩阵相差大不大其实就是检验最大特征值与n相差大不大)
一致性检验步骤:
- 计算一致性指标CI
- 查找对应的平均随机一致性指标RI
注:在实际应用中,n很少超过10,若指标个数超过10,则可以考虑建立二级指标体系
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 - 计算一致性比例CR
,如果CR<0.1,则可以认为矩阵的一致性可以接受;否则需要对判断矩阵进行修正(手动往倍数方面改)
至于一致性指标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算术平均法求权重:
- 将判断矩阵按照列归一化(每一个元素除以其所在列的和后得到的新的判断矩阵)
- 将归一化后的矩阵按行求和得到一个列向量
- 将第二部中的列向量中的每个元素除以n即可得到权重向量
数学描述 :
例如:
归一化:
苏杭 = 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
同样的方法将整个表格归一化
方法二几何平均法求权重:
步骤(和方法一步骤大致相同):
- 将A的元素按照行相乘得到一个新的列向量
- 将新的向量的每个分量开n次方
- 对该列向量进行归一化即可得到权重向量
数学描述
方法3特征值法求权重
一致矩阵有一个特征值n,其余特征值均为0.
另外,我们很容易得到,特征值为n时,对应的特征向量刚好为(k!=0),这一特征向量刚好就是一致矩阵的第一列。
步骤
- 求出矩阵A的最大特征值以及对应的特征向量
- 对求出的特征向量进行归一化即可得到我们的权重
得出结果
计算 出各个表格的权重后,得到如下表格
通过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
模型拓展
字太多了,不想写了
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/124443.html