在之前我们介绍给层次分析法的基本使用,那么这次在这里我们通过python来对层次分析进行代码编写,并简单回顾一下层次分析法的基本步骤:
算法用途
在很多情况下,我们对事物评价,应该要多维度评价。多维度评价之后我们要如何把它们合并成一个指标用于比较事物的好坏呢,这时候需要对各个指标赋权,层次分析法就是用来赋权重的了。
建模案例
假如现在有个小姑娘小A有两个追求者小明和小李,那她该怎么选择呢?现在小A要从四个指标去选择,分别是身高、颜值、学历、性格。小A对他们各个指标的评分如下:
小明
小李
身高
8
7
颜值
7
8
学历
6
8
性格
8
7
从表面上来看,二者不分伯仲,因此需要借助层次分析算法来对两人进行打分,从中挑选出一个男朋友。
原理分析
步骤一:小A查阅图书资料,选择依据如下
步骤二:小A开始构造判断矩阵
从小A主观判断来说:
1.身高与颜值相比,身高稍重要
2.身高与学历相比,同样重要
3.身高和性格相比,性格稍重要
4.颜值和学历相比,学历介于相同重要和稍微重要之间
5.颜值和性格相比,性格明显重要
6.性格和学历相比,性格稍重
因此可以得出判断矩阵如下:
步骤三:小A通过翻阅图书,找到检验标准:
对判断矩阵的一致性检验的步骤如下:
计算一致性指标CI
查找相应的平均随机一致性指标RI,对n=1,…,9,Satty给出了RI的值如下表所示:
RI是通过随机方法构造500个样本矩阵,随机地从1~9及其例数中抽取数字构造正反矩阵,求最大特征根的平均值并定义:
计算一致性比例CR:
当CR<0.10时,一致性接受,否则该矩阵应该适当修改参数
步骤四:计算权重以及得分
得到最大特征值对应特征向量
得到权重向量
小美对男嘉宾的评分为P,最后得分S
经过一番分析之后,小A得出了对小明和小李的打分如下:
Python代码
#层次分析法完整代码:
importnumpy 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) #矩阵乘法
fori in range(len(score)):
print('对象{:}得分={:}'.format(i+1,score[i,0].real))
BONUS TIME
数学建模资料、视频讲解、历年赛题
后台回复 【校苑】领取
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.