熵权法数据公式推导python代码实现熵权法综合评价、风险评分法
熵权法是一种基于信息熵的客观赋权方法,其数学公式和计算步骤如下:
-
数据标准化处理(消除量纲影响):
- 正向指标:\(x_{ij}' = \frac{x_{ij} - \min(x_j)}{\max(x_j) - \min(x_j)}\)
- 负向指标:\(x_{ij}' = \frac{\max(x_j) - x_{ij}}{\max(x_j) - \min(x_j)}\)
-
计算信息熵:
\(E_j = -\frac{1}{\ln(n)} \sum_{i=1}^n p_{ij} \ln(p_{ij})\)
其中 \(p_{ij} = \frac{x_{ij}'}{\sum_{i=1}^n x_{ij}'}\) -
计算权重:
\(w_j = \frac{1 - E_j}{\sum_{j=1}^m (1 - E_j)}\) -
计算综合得分(示例):
假设有3个评价对象和2个指标的数据:| 对象 | 指标1 | 指标2 | |------|-------|-------| | A | 80 | 70 | | B | 90 | 60 | | C | 70 | 90 |计算过程:
- 标准化后(假设均为正向指标):
| 对象 | 指标1 | 指标2 | |------|-------|-------| | A | 0.5 | 0.33 | | B | 1.0 | 0.0 | | C | 0.0 | 1.0 | - 计算熵值(假设\(E_1=0.9\), \(E_2=0.8\)):
- 权重:\(w_1=\frac{1-0.9}{(1-0.9)+(1-0.8)}=0.33\), \(w_2=0.67\)
- 最终得分:
\(S_A=0.5×0.33+0.33×0.67=0.39\)
\(S_B=1.0×0.33+0.0×0.67=0.33\)
\(S_C=0.0×0.33+1.0×0.67=0.67\)
- 标准化后(假设均为正向指标):
5.python代码实现:
import numpy as np
from sklearn.preprocessing import MinMaxScaler
def entropy_weight(data, positive_cols=None):
"""
熵权法实现
:param data: 原始数据矩阵(n_samples, n_features)
:param positive_cols: 正向指标列索引列表(默认全为正向)
:return: (权重向量, 综合得分)
"""
# 数据标准化处理
scaler = MinMaxScaler(feature_range=(0.002, 0.998)) # 避免0值
X = np.array(data)
if positive_cols is None:
X_norm = scaler.fit_transform(X)
else:
# 创建掩码区分正负向指标
mask = np.zeros(X.shape[1], dtype=bool)
mask[positive_cols] = True
# 正向指标直接标准化
X_pos = scaler.fit_transform(X[:, mask])
# 负向指标反向标准化
X_neg = 1 - scaler.fit_transform(X[:, ~mask])
# 合并结果
X_norm = np.zeros_like(X)
X_norm[:, mask] = X_pos
X_norm[:, ~mask] = X_neg
print(X_norm)
# 计算比重矩阵
p = X_norm / np.sum(X_norm, axis=0, keepdims=True)
# 计算信息熵
k = 1 / np.log(X.shape[0])
entropy = -k * np.sum(p * np.log(p), axis=0)
# 计算权重
weights = (1 - entropy) / np.sum(1 - entropy)
# 计算综合得分
scores = np.dot(X_norm, weights)*100
return weights, scores
if __name__ == '__main__':
# 示例数据:3个样本,2个指标(指标1和指标2)
# data = [
# [80, 70], # 对象A
# [90, 60], # 对象B
# [70, 90] # 对象C
# ]
data = np.array([
[800, 10.0, 40, 60],
[500, 8.0, 30, 45],
[100, 4.0, 20, 70]
])
# 计算权重和得分(假设均为正向指标)
weights, scores = entropy_weight(data)
print("各指标权重:", np.round(weights, 4))
print("综合得分:", np.round(scores, 4))
自动化学习。

浙公网安备 33010602011771号