熵权法数据公式推导python代码实现熵权法综合评价、风险评分法

熵权法是一种基于信息熵的客观赋权方法,其数学公式和计算步骤如下:

  1. 数据标准化处理(消除量纲影响):

    • 正向指标:\(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)}\)
  2. 计算信息熵
    \(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}'}\)

  3. 计算权重
    \(w_j = \frac{1 - E_j}{\sum_{j=1}^m (1 - E_j)}\)

  4. 计算综合得分(示例):
    假设有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))
posted @ 2025-07-31 22:49  ARYOUOK  阅读(169)  评论(0)    收藏  举报