层次分析法(matlab实现)

1.层次分析法(AHP)

在决策理论中,层次分析法是一种以数学心理学 为基础,组织和分析复杂决策的结构化技术,它代表了一种量化决策标准权重的准确方法,通过成对比较,利用个别专家的经验来估计因素的相对大小

2.算法用途

在很多情况下,我们对事物的评价,应该多维度的进行评价。多维度评价之后我们要如何把它们合并成一个指标用于比较事物的好坏?这时候需要对各个指标赋权,层次分析法就是用来赋权重的,这个方法个体主观性较强,在数据集比较小,实在不好比较的时候可以选择这种方法

3.算法简述

这个算法是一个多指标综合评价算法,这种算法一般会有两个用途:

  • 指标定权

我们可以在没有数据支撑的情况下可以根据每个人对重视程度不一样而给各个指标指定权重

  • 量化方案选择

我们在旅游的时候,可能会面临去哪的难题,我们会假设有几套方案,例如:杭州、三亚、成都,而每个地方的都可以综合以上的4个因素,给这些方案计算出一个量化得分,然后我们就可以根据它们各自的得分得出我们心里的最优选择

4.AHP层次分析过程

在分析一个现象或者问题之前,首先将现象或问题根据它们的性质分解成有关因素,并根据它们之间的关系分类而形成一个多层次的结构模型,然后通过经验或者专家,来判断和衡量底层因素对高层因素的相对重要性,并根据重要性的程度得出权重排序,进而可以量化分析比较。

层次分析法的核心是将影响因素层次化和数据化,它把一个抽象的现象或问题由难到易的予以分解,易于对复杂问题进行直观的判断并做出决策。层次分析法具有将复杂问题简单化且计算简单等优点,应用都十分广泛,诸如在人员素质评估、多方案比较、科学成果评比和工作成效评价等多领域多方面都有运用

一般的层次分析法分为三层:

  • 目标层(分析目的)
  • 准则层(分析因素)
  • 方案层(分析种类)

注意:一致性检验的含义用于确定构建构建的判断矩阵是否存在逻辑问题

类似于A对于B是3,就说明A比B重要,A对于C是1/3,就说明C比A重要,那么如果B对于C是2的话,就说明B比C重要,但是根据上述的逻辑,这样就犯了逻辑性的错误,理应是C比B重要

4.1 构建层次评价模型

我们应该在分析前先确认整个决策事件的目标层、准则层、方案层

4.2构造判断矩阵

构造判断矩阵就是通过各要素之间相互两两比较,并确定各准则层对目标的权重

|---------|--------------------|
| 标度 | 含义 |
| 1 | 表示两个元素相比,具有同样的重要性 |
| 3 | 表示两个元素相比,前者比后者稍重要 |
| 5 | 表示两个元素相比,前者比后者明显重要 |
| 7 | 表示两个元素相比,前者比后者极其重要 |
| 9 | 表示两个元素相比,前者比后者强烈重要 |
| 2,4,6,8 | 表示上述相邻判断的中间值 |
| 1~9的倒数 | 表示相应两因素交换次序比较的重要性 |

判断矩阵满足:

我们可以对于准则A,可以构造一个:

我们就可以根据我们对这些因素的一个客观认识去得到这个完整的判断矩阵

4.3 层次单排序与一致性检验

4.3.1层次单排序

所谓的层次排序法就是根据我们构成的判别矩阵,求解各个指标的权重

方法一:方根法

  1. 计算每行乘积得到m次方,得到一个m维向量
  2. 将向量标准即为权重向量,即得到权重

方法二:和法

  1. 先将矩阵的每列进行标准化
  2. 将标准化后的各元素按行求和
  3. 将求和结果进行标准化

4.3.2 求解最大特征值与CI值

设 n 阶判断矩阵为 B,则可用以下方法求出其最大的特征根 :BW=λW, 其中,W 是 B 的特征向量。 在层次分析法中, 我们用以下的一致性指标 CI 来检验判断的一致性指标 (Consistency Index):

CI=0表示判断矩阵完全一致,CI越大,判断矩阵的不一致性程度越严重

当得出权重矩阵后,我们可以计算最大特征根,其公式为:

其中n为维度数,AW为判断矩阵标准化后的权重,然后按行的累加值

4.3.3 根据CI、RI值求解CR值,判断其一致性是否通过

情况如下:

  • CR<0.1时,矩阵A的一致性程度被认为在容许的范围内
  • CR>=0.1时,我们应该考虑对矩阵A进行修正

4.3.4 层次总排序与一致性检验

计算某一层所有因素对于最高层(目标层)相对重要性的权值,称为层次总排序

案例分析:

matlab源码:

Matlab 复制代码
%层次分析法
%P是指标评分 B是判别矩阵
function level(P,A)
%求出判别矩阵的行列数
[n,~]=size(A);
%求出该矩阵的特征向量与特征值
[V,D]=eig(A)
tzz=max(max(D))%找出最大的特征值
c1=D(1,:)==tzz%找出最大的特征值的位置
tzx=V(:,c1)%最大特征值对应的特征向量
%赋权重
quan=zeros(n,1)
%得到权重向量
for i=1:n
    quan(i,1)=tzx(i,1)/sum(tzx);
end
Q=quan
%--------------------------------一致性检验---------------------------------
%计算一致性指标CI
CI=(tzz-n)/(n-1)
%平均随机一致性指标RI
RI=[0,0,0.58,0.9,1.12,1.24,1.32,1.41,1.45,1.49,1.52,1.54,1.56,1.58,1.59];
%判断是否通过一致性
CR=CI/RI(1,n)
if CR>=0.1
    fprintf('没有通过一致性\n');
else
    fprintf('通过一致性检验\n');
end
%显示出所有评分对象的评分值
score=P*Q;
for i=1:length(score)
    name=['object_score',num2str(i)];
    eval([name,'=score(i)'])
end
相关推荐
海阔天空_20133 分钟前
Python pyautogui库:自动化操作的强大工具
运维·开发语言·python·青少年编程·自动化
天下皆白_唯我独黑10 分钟前
php 使用qrcode制作二维码图片
开发语言·php
夜雨翦春韭14 分钟前
Java中的动态代理
java·开发语言·aop·动态代理
小远yyds16 分钟前
前端Web用户 token 持久化
开发语言·前端·javascript·vue.js
何曾参静谧28 分钟前
「C/C++」C/C++ 之 变量作用域详解
c语言·开发语言·c++
AI街潜水的八角38 分钟前
基于C++的决策树C4.5机器学习算法(不调包)
c++·算法·决策树·机器学习
q567315231 小时前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
白榆maple1 小时前
(蓝桥杯C/C++)——基础算法(下)
算法
JSU_曾是此间年少1 小时前
数据结构——线性表与链表
数据结构·c++·算法
许野平1 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono