例 10.2 (续例 10.1)利用层次分析法对 10 个学生进行评价排序。

用层次分析法进行评价,实际上就是求指标变量 

层次分析法_特征向量

 的 权重向量 

层次分析法_特征向量_02

 就会首先给出指标 

层次分析法_特征向量

 重要性的两两比较判断矩阵。 

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 的最大特征值为 

层次分析法_归一化_04

 = 8.0615 , 归一化 特征向量 : 

v=  [0.36194866 0.18097433 0.0914154  0.0914154  0.0914154  0.08393238  0.04944921 0.04944921]

(2)判断矩阵的一致性指标

                                 

层次分析法_特征向量_05

 

对 n = 1, ,9 ,Saaty 给出的平均随机一致性指标 RI 的值如表  所示。

平均随机一致性指标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 漂亮就不一致了。

取评价的权重 

层次分析法_特征值_06

  ,则评价函数 为 

层次分析法_特征值_07

  第i 个评价对象的评价值为 :

层次分析法_归一化_08

 。

用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))