一、引言在进行综合评价的过程中权重的确定确实是很重要的,对最终的结果会起着决定性的影响。现在大多数采用的都是主客观结合的组合赋权法。主观赋权用的最多的是AHP,客观赋权用的多的是熵值法、粗糙集的方法,正如楼主所讲的,客观赋权完全依赖于样本数据,当样本数据变化时,权重也会发生变化,从统计规律来讲,随着样本容量的增加,权重的变化应该越来越小,最终趋于一个稳定的值,但在我们实际的评价过程中不可能让样本数达到足够大,因此我们实际还是要把整个评价系统看作是一个不确定性的系统,运用已知的信息来最大限度的挖掘系统的规律,所以我们在有限样本下求出的只能是近似值。主观权重方法简单,但人为因素太强;客观权重又过于依赖样本,这两种方法都存在着信息的损失,采用组合赋权就是最大限度的减少信息的损失,使赋权的结果尽可能的与实际结果接近。现在组合赋权的核心问题在于如何确定两种方法的权重分配,目前这方面的研究比较多,但个人认为大部分方法的数学推导过于繁琐,应用性比较差,基本上不具备可操作性,至于如何准确的
进行组合赋权,现在似乎还没有一套很好的方法。 二、主观赋权:层次分析法AHP2.1 优缺点优点:它完全依靠主观评价做出方案的优劣排序,所需数据量少,决策花费的时间很短。从整体上看,AHP在复杂决策过程中引入定量分析,并充分利用决策者在两两比较中给出的偏好信息进行分析与决策支持,既有效地吸收了定性分析的结果,又发挥了定量分析的优势,从而使决策过程具有很强的条理性和科学性,特别适合在社会经济系统的决策分析中使用。 缺点:用AHP进行决策主观成分很大。当决策者的判断过多地受其主观偏好影响,而产生某种对客观规律的歪曲时,AHP的结果显然就靠不住了。 适用范围:尤其适合于人的定性判断起重要作用的、对决策结果难于直接准确计量的场合。要使AHP的决策结论尽可能符合客观规律,决策者必须对所面临的问题有比较深入和全面的认识。另外,当遇到因素众多,规模较大的评价问题时,该模型容易出现问题,它要求评价者对问题的本质、包含的要素及其相互之间的逻辑关系能掌握得十分透彻,否则评价结果就不可靠和准确。 改进方法: (1) 成对比较矩阵可以采用德尔菲法获得。 (2) 如果评价指标个数过多(一般超过9个),利用层次分析法所得到的权重就有一定的偏差,继而组合评价模型的结果就不再可靠。可以根据评价对象的实际情况和特点,利用一定的方法,将各原始指标分层和归类,使得每层各类中的指标数少于9个。 2.2 基本步骤步骤一、建立递阶层次结构模型:目的层,准则层,方案层- X- K8 S9 c) C5 ^
步骤二、构造出各层次中的所有判断矩阵;判断矩阵为两两指标重要性的判断,一般判别矩阵构造如下。
0 `, p$ K* w/ R* J1 X+ R( Z: S( U+ k! y$ A2 @
3 v5 i7 Q- W Y- \0 F9 o* T" a步骤三:层次单排序及一致性检验;
6 X: x+ S: p- R; o+ U
( X/ _+ j$ U3 m9 Q' q- z步骤四:层次总排序及一致性检验整套算法实际上是用了两次重要性权重。 准则层,从准则的重要性矩阵(nxn矩阵)中,抽取重要性权重。它的现实意义是 每个准则的重要程度,也就是步骤三。 方案层,对每个准则,m个方案都有个mxm矩阵(总共是n个mxm矩阵)。也就是说,对每个准则,都可以算出m个方案的重要性权重。 然后n个重要性权重组合起来,与准则层的重要性权重相乘。就得到了每个方案的重要性权重,也就是层次总排序。 2.3 程序实现
; X; F0 Z: K7 N6 q: G3 }class AHP:
" `, v4 Z$ ]7 ]2 D/ I def __init__(self, criteria, b):
5 W7 l7 |" h7 n self.RI = (0, 0, 0.58, 0.9, 1.12, 1.24, 1.32, 1.41, 1.45, 1.49): L; A5 A0 P& a1 }% H$ I u/ @
self.criteria = criteria6 Y5 j6 }7 m6 @9 F$ G9 F2 T" c
self.b = b0 d- ^# `5 V2 k. B" `. h# _! o
self.num_criteria = criteria.shape[0]
1 k5 i) y& S1 P P8 ]( M self.num_project = b[0].shape[0]
/ H! @: i* {+ A r# E0 z7 |- B8 M1 n
def cal_weights(self, input_matrix):2 b9 z4 T6 |/ Y" X' d/ j
input_matrix = np.array(input_matrix)! C7 {- k3 @ ]$ `/ m
n, n1 = input_matrix.shape
, b1 ~. y! {9 r assert n == n1, '不是一个方阵'
2 N r0 {0 m) v9 v! |3 w9 Q6 j2 _- T for i in range(n):# K# h& l8 @+ J t
for j in range(n): W2 e# w; P6 U4 x) H
if np.abs(input_matrix[i, j] * input_matrix[j, i] - 1) > 1e-7:! q# T6 {) O# @5 v
raise ValueError('不是反互对称矩阵')4 A1 h p; f* K* p' A- ?) G
: v$ C0 d9 R. t. s, [2 j. B1 ] eigenvalues, eigenvectors = np.linalg.eig(input_matrix)% Y6 ^+ f6 ]5 l% @; y3 p: y6 B/ f
, o1 g3 m" B o4 p) }( Q& j
max_idx = np.argmax(eigenvalues)$ I7 d( i4 ^+ S5 C t% S% Q2 M
max_eigen = eigenvalues[max_idx].real
, I$ F/ Z2 g- G {1 i6 U. Z eigen = eigenvectors[:, max_idx].real
$ ?. B2 ]0 G# T `5 r2 y/ s eigen = eigen / eigen.sum()
& n4 {9 Q- N8 k0 H3 D& J+ l& U' |; O
if n > 9:
6 `8 m2 _8 l! k3 s CR = None0 K4 U1 s3 d6 M0 n
warnings.warn('无法判断一致性')2 f% S$ F7 a8 K+ l) e4 t% P8 s
else:
5 a q9 d+ ~2 G, \; X4 H: P' f CI = (max_eigen - n) / (n - 1)
7 V$ u( d) \7 |) r" ? CR = CI / self.RI[n]. g$ _- Q+ l% p8 h- M% s- E2 I
return max_eigen, CR, eigen/ x& g, h9 s$ M! c$ H" B
# e; J( S1 k1 M! g/ ` def run(self):+ Q/ H' I3 X. L* o
max_eigen, CR, criteria_eigen = self.cal_weights(self.criteria)
( n& |* `- |: W4 Z( J print('准则层:最大特征值{:<5f},CR={:<5f},检验{}通过'.format(max_eigen, CR, '' if CR < 0.1 else '不'))
5 ], Z. { N# w. z print('准则层权重={}\n'.format(criteria_eigen))
, v; K% V1 c G- M, W0 e* r0 m& t8 s) Y0 C# E( _% t: f
max_eigen_list, CR_list, eigen_list = [], [], []
& h( }) E$ B3 x, Q; _) M: a9 d& V for i in self.b:
# U4 c$ J" d% O( m( q3 u7 J) {1 \ max_eigen, CR, eigen = self.cal_weights(i)' d# {: y/ H7 o2 d% F- Q' y
max_eigen_list.append(max_eigen)
( `' n4 A0 I* i: |9 {6 h8 { CR_list.append(CR)
% @% j. p. g) e9 i1 H5 ]- A8 `8 n; b eigen_list.append(eigen)5 f& X" t" U6 J) Z) f
' l6 B* }/ d- G7 S t- {* g8 {
pd_print = pd.DataFrame(eigen_list,
" F+ g% ]% f% Q! e) x8 H0 k index=['准则' + str(i) for i in range(self.num_criteria)],
% h9 i! D, M: {9 y columns=['方案' + str(i) for i in range(self.num_project)],7 _# F* _9 S _
)
4 _1 A& }1 d; C+ O/ a; k pd_print.loc[:, '最大特征值'] = max_eigen_list# G) ^ F+ U% a
pd_print.loc[:, 'CR'] = CR_list
/ r" k4 d) ^" h# ? pd_print.loc[:, '一致性检验'] = pd_print.loc[:, 'CR'] < 0.1 b6 s! U. |) t: Z
print('方案层')
; W2 w0 `* A, P& b7 t print(pd_print)
8 G$ e3 C1 E1 J1 ^! F0 v* p& L* j) z$ q# W2 l5 L
# 目标层* Q$ S8 R* _# C: J+ l
obj = np.dot(criteria_eigen.reshape(1, -1), np.array(eigen_list))
; X* K* `, O C; y( A; ~ print('\n目标层', obj)4 `' n% g' ~3 K8 F2 x
print('最优选择是方案{}'.format(np.argmax(obj)))$ L+ O& H$ b( V, z# d
return obj
. r# j r: L8 k5 L! {
7 m t2 T- E# H/ S" O( T二、客观赋权因子分析、熵权法等,不再赘述,见yys - v# m9 P( w5 T' G
三、组合赋权常见的主要有:方差最大化赋权法、最佳协调赋权法、组合目标规划法,组合最小二乘法。
7 `- }$ j" X4 v
2 @- F3 n8 U8 ^' F# E4 B) B5 o& u7 W( q# a8 Q& } k# k
|