熵权法
一种比较客观的,得到权重的方法
依据的原理:指标的变异程度越小,所反映的信息量也越少,其对应的权值也应该越低。
步骤
1.数据标准化
矩阵标准化之后为\(Z\),满足 \[
z_{ij} = \frac{x_{ij}}{\sqrt{\sum_{i=1}^{n} x_{ij}}}
\] 若存在负数,则 \[
\tilde{Z} = \frac{x - \min\{x_{1j}, x_{2j}, ..., x_{nj}\}}{\max\{x_{1j},
x_{2j}, ..., x_{nj}\} - \min\{x_{1j}, x_{2j}, ..., x_{nj}\}}
\\
\tilde{Z} \in (0,1)
\]
2.计算概率矩阵\(P\)
\[
p_{ij} = \frac{z_{ij}}{\sum_{i=1}^{n} z_{ij}}
\]
3.计算熵权
\[
信息熵e_j = -\frac{1}{\ln n} \sum_{i=1}^{n} p_{ij} \ln(p_{ij}) \quad
(j=1,2,...,m)
\\
信息效用值d_j=1-e_j
\\
归一化得到w_j=\frac{d_j}{\sum_{j=1}^{m}d_j} \\
其中 W_j 为第 j 个指标的熵权。
\]
Python代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| import numpy as np
def entropy_weight(X): """ 根据给定的数据矩阵计算熵权。
参数: X (np.array): 数据矩阵,n行(样本)x m列(指标)。
返回: np.array: 每个指标的权重 w。 """ X = np.array(X) if np.any(X < 0): print("数据中存在负数,将使用 Min-Max 标准化方法。") min_vals = X.min(axis=0) max_vals = X.max(axis=0) ranges = max_vals - min_vals ranges[ranges == 0] = 1 Z = (X - min_vals) / ranges else: print("数据中无负数,将使用向量归一化方法。") norm_base = np.sqrt((X**2).sum(axis=0)) norm_base[norm_base == 0] = 1 Z = X / norm_base
Z[Z == 0] = 1e-9
P = Z / Z.sum(axis=0) n, m = X.shape k = -1 / np.log(n) e = (P * np.log(P)).sum(axis=0) * k d = 1 - e w = d / d.sum() return w
if __name__ == '__main__': X = [ [8, 9, 7], [6, 7, 8], [9, 6, 6], [7, 8, 9] ] X_matrix = np.array(X) weights = entropy_weight(X_matrix) print("\n计算得到的各指标权重为:") for i, w in enumerate(weights): print(f"指标 {i+1}: {w:.4f}")
|