例 10.2 (续例 10.1)利用层次分析法对 10 个学生进行评价排序。
用层次分析法进行评价,实际上就是求指标变量 的 权重向量
就会
首先给出指标 重要性的两两比较判断矩阵。
C = [ [1.,2.,4.,4.,4.,6.,6.,6.],[1/2,1.,2.,2.,2.,3.,3.,3.],
[1/4,1/2,1.,1.,1.,1.,2.,2.],[1/4, 1/2, 1., 1., 1., 1., 2., 2.],
[1/4, 1/2, 1., 1., 1., 1., 2., 2.],[1/6,1/3,1.,1.,1.,1.,2.,2.],
[1/6,1/3,1/2,1/2,1/2,1/2,1.,1.],[1/6, 1/3, 1/2, 1/2, 1/2, 1/2, 1., 1.]]
(1)计算得到矩阵C 的最大特征值为 = 8.0615 , 归一化 特征向量 :
v= [0.36194866 0.18097433 0.0914154 0.0914154 0.0914154 0.08393238 0.04944921 0.04944921]
(2)判断矩阵的一致性指标
对 n = 1, ,9 ,Saaty 给出的平均随机一致性指标 RI 的值如表 所示。
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
RI | 0 | 0 | 0.58 | 0.90 | 1.12 | 1.24 | 1.32 | 1.41 | 1.45 |
一致性指标是什么意思? 一定要符合一些传递性 , 比如 A 比 B 漂亮 ,B 比C 漂亮 , 那么 C 如果比A 漂亮就不一致了。
取评价的权重 ,则评价函数 为
第i 个评价对象的评价值为 :
。
用MATLAB计算时 ,MATLAB程序如下:
数据
链接:https://pan.baidu.com/s/1xyyKyDkSd6xGzFu-Qu-E_w
提取码:tzjq
clc, clear
a = load('data3.txt') ;
c=[1 2 4 4 4 6 6 6;
1/2 1 2 2 2 3 3 3 ;
1/4 1/2 1 1 1 1 2 2;
1/4 1/2 1 1 1 1 2 2 ;
1/4 1/2 1 1 1 1 2 2;
1/6 1/3 1 1 1 1 2 2;
1/6 1/3 1/2 1/2 1/2 1/2 1 1;
1/6 1/3 1/2 1/2 1/2 1/2 1 1];
[w,lamda]=eigs(c,1); %求最大特征值及对应的特征向量 [ 特征向量, 特征值 ]
CI = (lamda-8)/7 ; % 计算一致性指标
CR = CI /1.41 ; % 计算一致性比例
w = w/sum(w) ; % 特征向量归一化
f = a*w ;
[sf ,ind1] = sort(f,'descend') ;
python :
import numpy as np
import pandas as pd
# A = [[1/1,2/1,5/1,3/1],[1/2,1/1,3/1,1/2],
# [1/5,1/3,1/1,1/4],[1/3,2/1,4/1,1/1]]
A = [ [1.,2.,4.,4.,4.,6.,6.,6.],[1/2,1.,2.,2.,2.,3.,3.,3.],
[1/4,1/2,1.,1.,1.,1.,2.,2.],[1/4, 1/2, 1., 1., 1., 1., 2., 2.],
[1/4, 1/2, 1., 1., 1., 1., 2., 2.],[1/6,1/3,1.,1.,1.,1.,2.,2.],
[1/6,1/3,1/2,1/2,1/2,1/2,1.,1.],[1/6, 1/3, 1/2, 1/2, 1/2, 1/2, 1., 1.]]
Arr = np.array(A)
n = Arr.shape[0]
V,D = np.linalg.eig(A)
D = D.real
V = V.real
D = D.tolist()
V = V.tolist()
# 求出特征值 和 特征向量
print("特征值 : \n" , V)
print("特征向量 :\n" , D)
#
# # 最大特征值 lambda 及其位置
lamda = np.max(V)
#
loca = V.index(lamda) #最大特征值位置
#
CI = (lamda-n)/(n-1)
CR = CI /0.9
print(CR)
D = np.array(D)
# print(D[:,loca])
W = D[:,loca]
w = W/np.sum(W,axis=0)
print( "w : \n " , w)
w = np.array(w).reshape(8,1)
a = pd.read_excel("data1.xlsx").values[:,1:]
print(a)
print(type(a))
print(type(w))
f = np.dot(a,w)
# 评分
print(f)
print(f.shape)
print(f.argsort(axis=0))