草庐IT

【建模算法】层次分析法(Python实现)

果州做题家 2023-04-04 原文

【建模算法】层次分析法(Python实现)

01 算法用途

在很多情况下,我们对事物评价,应该要多维度评价。多维度评价之后我们要如何把它们合并成一个指标用于比较事物的好坏呢,这时候需要对各个指标赋权, 层次分析法就是用来赋权重的了。
这个方法主观性比较强,在数据集比较小,实在不好比较的时候可以用这个方法,如果有别的选择还是尽量不要用这个算法比较好。可以看下以往建模获奖论文,此算法的出现频率还是挺高的,所以存在即有它存在的道理。

02 建模案例

小美要选男朋友了,现有小明、小李两个人选,到底该选谁呢?现在小美要从四个指标去选择,分别是身高、颜值、学历、性格。小美对他们各个指标的评分如下:

这也太难抉择了吧!!

03 原理解析

step1:小美查阅图书资料,选择依据如下:

step2:小美开始构造判断矩阵

小美的主观判断:

1.身高与颜值相比,身高稍重要

2.身高与学历相比,同样重要

3.身高和性格相比,性格稍重要

4.颜值和学历相比,学历介于相同重要和稍微重要之间

5.颜值和性格相比,性格明显重要

6.性格和学历相比,性格稍重

身高颜值学历性格
身高1311/3
颜值1/311/21/5
学历1211/3
性格3531

小美终于得到了判断矩阵。

step3:翻阅图书,小美找到检验标准

对判断矩阵的一致性检验的步骤如下:

  • 计算一致性指标CI

    查找相应的平均随机一致性指标RI,对n=1,…,9,Satty给出了RI的值如下表所示:

RI是通过随机方法构造500个样本矩阵,随机地从1~9及其例数中抽取数字构造正反矩阵,求最大特征根的平均值 λ m a x \lambda_{max} λmax并定义
R I = λ m a x − n n − 1 RI=\frac{\lambda_{max}-n}{n-1} RI=n1λmaxn

  • 计算一致性比例CR
    C R = C I R I CR=\frac{CI}{RI} CR=RICI
    当 CR<0.10时,一致性接受,否则该矩阵应该适当修改参数

step4 :计算权重以及得分

  • 得到最大特征值对应特征向量

T = [ t 1 t 2 . . . t n ] T=[t_1\quad t_2\quad ...\quad t_n] T=[t1t2...tn]

  • 得到权重向量

W = [ w 1 w 2 . . . w n ] w i = t i ∑ i = 1 n t i W=[w_1\quad w_2\quad ... \quad w_n]\\ w_i=\frac{t_i}{\displaystyle \sum^n_{i=1}t_i} W=[w1w2...wn]wi=i=1ntiti

  • 小美对男嘉宾的评分为P,最后得分S

S = P × W S=P\times W S=P×W

真相大白,小明是最佳选择~得分如下

Python源码

#层次分析法完整代码:
import numpy as np

#计算特征向量和最大特征值
a=np.array([[1,3,1,1/3],[1/3,1,1/2,1/5],[1,2,1,1/3],[3,5,3,1]])   #a为自己构造的输入判别矩阵
w=np.linalg.eig(a)   #np.linalg.eig(matri)返回特征值和特征向量
tzz=np.max(w[0])   #最大特征值
t=np.argwhere(w[0]==tzz) #寻找最大特征值所在的行和列
tzx=w[1][::-1,t[0]]    #最大特征值对应的特征向量

#一致性检验
RILIST=[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]
n=a.shape[0]
RI=RILIST[n]
CI=(tzz-n)/(n-1)
CR=CI/RI
print(CR)
print("通过一致性检验") if CR<0.1 else print("没有通过一致性检验")

P=np.array([[8,7,6,8],[7,8,8,7]])  #每一行代表一个对象的指标评分
#赋权重
quan=np.zeros((n,1));
quan=tzx/sum(tzx)
Q=quan

#显示出所有评分对象的评分值
score=np.dot(P,Q)    #矩阵乘法
for i in range(len(score)):
    print('对象{:}得分={:}'.format(i+1,score[i,0].real))

有关【建模算法】层次分析法(Python实现)的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - 建模收藏夹 - 2

    我希望将Favorite模型添加到我的User和Link模型。业务逻辑用户可以有多个链接(即可以添加多个链接)用户可以收藏多个链接(他们自己的或其他用户的)一个链接可以被多个用户收藏,但只有一个所有者我对如何为这种关联建模以及在模型就位后如何创建用户收藏夹感到困惑?classUser 最佳答案 下面的数据模型怎么样:classUser:destroyhas_many:favorite_links,:through=>:favorites,:source=>:linkendclassLink:destroyhas_many:favor

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  5. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  6. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  7. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  8. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  9. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐