层次分析法

模型引出

问题实例

  • 如何让指标在同一数量级,且保证在同一指标下其差距不变?
    归一化处理
    指标数组 $[a b c]$ 归一化处理得到 $[a/(a+b+c),b/(a+b+c),c/(a+b+c)]$
  • 给每一个指标加上权重

基本概念

层次分析法(AHP)是对一些较为复杂、较为模糊的问题作出决策的简易方法,它特别适用于那些难于完全定量分析的问题.

模型原理

目标层

只有一个元素,一般是分析问题的预定目标或者理想结果

准则层

包含为实现目标所涉及的中间元素,它可以由若干个层次组成,包括所需考虑的准则、子准则

措施层

包含为了实现目标可供选择的各种措施、决策方案

基本步骤

  • 建立递阶层次结构模型
    • 目标:微博之星
    • 准则:粉丝数,颜值,作品数量,作品质量
    • 方案:明星ABC
  • 构造出各层次中的所有判断矩阵
    • 对指标的重要性进行两两比较,构造判断矩阵,从而科学求出权重
    • $a^i_j$的意义是第$i$个指标相对于第$j$个指标的重要程度
标度 含义
1 重要性相同
3 稍微重要
5 明显重要
7 强烈重要
9 极端重要
2,4,6,8 相邻判断中值

$a^i_j*a^j_i = 1$

  • 一致性检验
    • $a^i_j=a^k_j*a^i_k$

      避免出现矛盾的情况

    • 一致矩阵:
      • 正互反矩阵 $a^i_j>0并且a^i_j*a^j_i=1$
      • 正互反矩阵满足$a^i_j=a^k_j*a^i_k$称为一致矩阵
      • 步骤
        • 计算一致性指标 CI $CI=\frac{\lambda _{\max}-n}{n-1}$
        • 查找对应得平均一致性指标RIgraph
        • 计算一致性比例$CR=\frac{CI}{RI}<0.1$判断为一致
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
%代码一致性检验
% A=[1 2 3 5;1/2 1 1/2 2;1/3 2 1 1/2;1/5 1/2 2 1];
% A=[1 2 3 5;1/2 1 1/2 2;1/3 2 1 2;1/5 1/2 1/2 1];
A = input('判断矩阵A='); %输入判断矩阵
[n,n] = size(A); %获取A的行和列
%求出最大特征值以及对应的特征向量
[V,D] = eig(A) %V是特征向量 D是特征值构成的对角矩阵
Max_eig = max(max(D)); %先求出每一列的最大值,再求最大值中的最大值
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
  • 求权重后进行评价
    • 算数平均法
      • 各列归一化(每一个元素除以其所在列的和)
      • 将归一化的各列相加(按行求和)
      • 相加后得到的向量中每个元素除以n即可得到权重向量
1
2
3
4
5
6
7
8
9
10
%1.算术平均法计算权重
%输入样例:
% A=[1 2 3 5;1/2 1 1/2 2;1/3 2 1 2;1/5 1/2 1/2 1];
A = input('判断矩阵A='); %输入判断矩阵
ASum = sum(A,1); %将判断矩阵每列求和
[n,n] = size(A); %获取A的行和列,用于对ASum复制,对应位相除归一化
Ar = repmat(ASum,n,1); %复制Asum n行1列为Ar矩阵
Stand_A = A./Ar; %归一化
ASumr = sum(Stand_A,2); %各列相加到同一行
disp(ASumr/n); %将相加后得到的向量每个元素除以n可以得到权重向量
  • 几何平均法
    • 将判断矩阵的元素按行相乘得到一个新的列向量
    • 将新的列向量的每个分量开n次方
    • 对该列向量进行归一化即可得到权重向量
1
2
3
4
5
6
7
8
9
%2.几何平均法计算权重
% A=[1 2 3 5;1/2 1 1/2 2;1/3 2 1 2;1/5 1/2 1/2 1];
clc;
A = input('判断矩阵A='); %输入判断矩阵
[n,n] = size(A); %获取A的行和列
prod_A = prod(A,2); %将A中每一行元素相乘得到一列向量
prod_n_A = prod_A.^(1/n); %将新的向量的每个分量开n次方等价求1/n次方
re_prod_A = prod_n_A./sum(prod_n_A);%归一化处理
disp(re_prod_A); %展示权重结果
  • 特征值法
    • 特征值为n时对应的特征向量刚好为 $k[\frac{a^1_1}{1},\frac{a^1_2}{1},……,\frac{a^1_n}{1}]$
    • 求出最大特征值以及其对应的特征向量
    • 对特征向量进行归一化
1
2
3
4
5
6
7
8
9
10
11
%3.特征值法计算权重
% A=[1 2 3 5;1/2 1 1/2 2;1/3 2 1 2;1/5 1/2 1/2 1];
clc;
A = input('判断矩阵A='); %输入判断矩阵
[n,n] = size(A); %获取A的行和列
%求出最大特征值以及对应的特征向量
[V,D] = eig(A); %V是特征向量 D是特征值构成的对角矩阵
Max_eig = max(max(D)); %先求出每一列的最大值,再求最大值中的最大值
[r,c] = find(Max_eig == D,1);%使用find()函数找出最大特征值对应的特征向量
%对特征向量进行归一化得到所需权重
disp(V(:,c)./sum(V(:,c)));

Matlab

基本使用

命令行的内容会暂时储存在工作区

1. 快捷键

  • 新建脚本: ctrl+N
  • 运行脚本:F5
  • 注释:ctrl+R
  • 取消注释:ctrl+T
  • 实时脚本
    • 进入或退出实时脚本的代码区域:Alt

      实时脚本的代码块可以单独运行

    • 插入分节符:ctrl+alt+Enter

2. 命令

  • clear:清空变量区内容
  • clc:清空命令行窗口的内容
  • 输入矩阵时同一行矩阵用空格或者逗号隔开,不同列用;隔开
  • 打印变量disp(<变量名>)
  • 打印字符串disp(‘<字符串>’)
  • sum(B)按列求和
  • sum(B,2)按行求和
  • repmat(B,n,1)按行复制n次按列复制1次
  • ./点乘 执行对应元素的运算
  • 字符串拼接 disp(‘a等于’ num2str(a))