评价类——熵权法(Entropy Weight Method, EWM),完全客观评价

目录

  • [一、 熵权法赋权代码说明](#一、 熵权法赋权代码说明)
    • [1.1 介绍](#1.1 介绍)
  • [二、 手把手教你运行代码](#二、 手把手教你运行代码)
    • [2.1 数据示例](#2.1 数据示例)
    • [2.2 ==可直接运行代码==](#2.2 ==可直接运行代码==)
    • [2.3 shangquanfa_eg_Sheet1.csv数据可视化](#2.3 shangquanfa_eg_Sheet1.csv数据可视化)
    • [2.4 代码运行过程截屏](#2.4 代码运行过程截屏)
    • [2.5 代码运行结果截屏](#2.5 代码运行结果截屏)
    • [2.6 对熵权法的结果分析](#2.6 对熵权法的结果分析)
  • [三、 提供的代码如何修改?](#三、 提供的代码如何修改?)
  • [四、 为什么确定极小化指标?](#四、 为什么确定极小化指标?)
    • [4.1 极小化和极大化的归一化原理](#4.1 极小化和极大化的归一化原理)
      • [1. 极大化指标的归一化](#1. 极大化指标的归一化)
      • [2. 极小化指标的归一化](#2. 极小化指标的归一化)
      • [3. 归一化的目的和意义](#3. 归一化的目的和意义)
  • 四、熵权法的原理
    • [4.1 熵权法简介](#4.1 熵权法简介)
    • [4.2 熵权法的原理](#4.2 熵权法的原理)
      • [4.2.1 信息熵的计算公式](#4.2.1 信息熵的计算公式)

一、 熵权法赋权代码说明

1.1 介绍

熵权法(Entropy Weight Method, EWM)是一种客观赋权的方法,用于多指标决策分析。
我知道大家对原理不感兴趣,原理我放在最后,写论文的同学可以复制,但是记得改一改,否则查重率过不去。
代码可以直接运行,大家参考我的教程。

二、 手把手教你运行代码

接下来,我给大家提供一个示例数据,以这个数据教大家如何使用下述代码。

2.1 数据示例

假设你的数据存储在 data.csv 文件中,格式如下:

编号 影响因素1 影响因素2 影响因素3
A 70 8000 30
B 90 7000 50
C 60 7500 40

首先将你的数据整理为这种格式,然后查看影响因素,对某个值越大约好的不用管,只需要找出影响因素越小越好的值(因为两者归一化的方法不一样),假如影响因素1和2 是越小越好,那么记住,影响因素在除了第一列以外,从0开始编号属于第1和2列,记住``和2
接下来给你提供代码,教你如何操作代码。

2.2 可直接运行代码

python 复制代码
import pandas as pd
import numpy as np


def entropy_weight_method(csv_file, minimize_cols=None):
    # 读取 CSV 文件
    data = pd.read_csv(csv_file)

    # 取出指标数据(假设数据的第一列是样本编号,后面的列是指标)
    samples = data.iloc[:, 0]  # 样本编号
    values = data.iloc[:, 1:].values  # 指标数据
    num_samples, num_indicators = values.shape

    # 如果没有指定极小化列,则默认为空列表
    if minimize_cols is None:
        minimize_cols = []

    # 标准化数据
    def normalize(matrix, minimize_cols):
        matrix_norm = np.zeros_like(matrix, dtype=float)
        for i in range(matrix.shape[1]):
            min_val = np.min(matrix[:, i])
            max_val = np.max(matrix[:, i])
            # 对极大化指标进行标准化
            if i not in minimize_cols:
                matrix_norm[:, i] = (matrix[:, i] - min_val) / (max_val - min_val)
            # 对极小化指标进行标准化
            else:
                matrix_norm[:, i] = (max_val - matrix[:, i]) / (max_val - min_val)
        return matrix_norm

    # 标准化数据
    normalized_data = normalize(values, minimize_cols)

    # 计算指标比重
    indicator_sum = np.sum(normalized_data, axis=0)
    proportion_matrix = normalized_data / indicator_sum

    # 计算信息熵
    def calculate_entropy(matrix):
        epsilon = 1e-10  # 防止对数计算中的零
        p = matrix + epsilon
        entropy = -np.sum(p * np.log(p), axis=0) / np.log(matrix.shape[0])
        return entropy

    entropy = calculate_entropy(proportion_matrix)

    # 计算熵权
    def calculate_weights(entropy):
        d = 1 - entropy
        weights = d / np.sum(d)
        return weights

    weights = calculate_weights(entropy)

    # 计算综合得分
    scores = np.dot(normalized_data, weights)

    # 将结果保存到 CSV 文件
    result = pd.DataFrame({
        'Sample': samples,
        'Score': scores
    })
    result.to_csv('weighted_scores.csv', index=False, encoding='utf-8')

    return weights, scores


# 用法
csv_file = 'shangquanfa_eg_Sheet1.csv'  # 假设数据存储在 data.csv 文件中

# 指定极小化的指标列索引(从0开始计数,假设第二列和第三列是极小化指标)
minimize_cols = [0, 1]  # 比如这里的列索引根据你的数据来设置
# minimize_cols = []  # 无极小化因素则启用这行代码
weights, scores = entropy_weight_method(csv_file, minimize_cols)

print("权重:", weights)
print("综合得分:", scores)

**首先注意的有3点,
1.你的数据文件必须经过我的转换,参考我的这篇播客:文件格式转换:EXCEL和CSV文件格式互相转换
对需要使用熵权法的数据进行转换,并且转换以后对csv文件不可以在进行操作,否则会报错字符编码错误。
2.找到这行代码minimize_cols = [0, 1] ,在里面填入1,2(注意英文半角)(原因我前文有说明,仔细看)

修改后minimize_cols = [1, 2](如果没有极小化,就是全部的影响因素越大越好,你就改为minimize_cols = []空列表)
3.csv_file = 'shangquanfa_eg_Sheet1.csv' 中,shangquanfa_eg_Sheet1.csv是你的csv文件的路径及名字,最终按顺序输出权重和综合得分。
运行代码:

2.3 shangquanfa_eg_Sheet1.csv数据可视化

2.4 代码运行过程截屏

2.5 代码运行结果截屏

2.6 对熵权法的结果分析

从结果:

权重: [0.36719405 0.31640297 0.31640297]

综合得分: [0.43880099 0.68359703 0.31640297]

可以看出:影响因素1、影响因素2、影响因素3的权重分别是:0.36719405 、0.31640297、 0.31640297,最终计算得出A、B、C三地的得分依次为:0.43880099 、0.68359703、 0.31640297,可知B地最佳。

三、 提供的代码如何修改?

**首先注意的有3点,
1.你的数据文件必须经过我的转换,参考我的这篇播客:文件格式转换:EXCEL和CSV文件格式互相转换
对需要使用熵权法的数据进行转换,并且转换以后对csv文件不可以在进行操作,否则会报错字符编码错误。
2.找到这行代码minimize_cols = [0, 1] ,在里面填入1,2(注意英文半角)(原因我前文有说明,仔细看)

修改后minimize_cols = [1, 2](如果没有极小化,就是全部的影响因素越大越好,你就改为minimize_cols = []空列表)
3.csv_file = 'shangquanfa_eg_Sheet1.csv' 中,shangquanfa_eg_Sheet1.csv是你的csv文件的路径及名字,最终按顺序输出权重和综合得分。

四、 为什么确定极小化指标?

看极小化和极大化的归一化过程你就懂了,过程如下:

4.1 极小化和极大化的归一化原理

在多指标决策分析中,不同的指标对决策的影响方向可能不同,有些指标是极大化指标 (即指标值越大越好),而有些指标是极小化指标 (即指标值越小越好)。为了将不同量纲和方向的指标转化到一个可比的尺度上,需要进行归一化处理,即将不同指标的值转换到相同的范围(通常为 [0, 1] 区间)。这样就可以在同一尺度上进行比较和计算。

1. 极大化指标的归一化

极大化指标是指指标的值越大越好,例如利润、效率、得分等。在归一化时,希望将指标值较大的样本归一化到更高的数值。归一化公式如下:

r i j = x i j − x min ⁡ ( j ) x max ⁡ ( j ) − x min ⁡ ( j ) r_{ij} = \frac{x_{ij} - x_{\min(j)}}{x_{\max(j)} - x_{\min(j)}} rij=xmax(j)−xmin(j)xij−xmin(j)

其中:

  • r i j r_{ij} rij 是第 i i i 个样本在第 j j j 个指标下的归一化值。
  • x i j x_{ij} xij 是第 i i i 个样本在第 j j j 个指标下的原始值。
  • x min ⁡ ( j ) x_{\min(j)} xmin(j) 是第 j j j 个指标的最小值。
  • x max ⁡ ( j ) x_{\max(j)} xmax(j) 是第 j j j 个指标的最大值。
归一化公式解释
  • 当 x i j = x max ⁡ ( j ) x_{ij} = x_{\max(j)} xij=xmax(j) 时, r i j = 1 r_{ij} = 1 rij=1,表示该样本在该指标下的表现最好。
  • 当 x i j = x min ⁡ ( j ) x_{ij} = x_{\min(j)} xij=xmin(j) 时, r i j = 0 r_{ij} = 0 rij=0,表示该样本在该指标下的表现最差。
  • 如果 x i j x_{ij} xij 介于 x min ⁡ ( j ) x_{\min(j)} xmin(j) 和 x max ⁡ ( j ) x_{\max(j)} xmax(j) 之间, r i j r_{ij} rij 的值位于 0 和 1 之间。

2. 极小化指标的归一化

极小化指标是指指标的值越小越好,例如成本、污染物排放量、损失等。在归一化时,希望将指标值较小的样本归一化到更高的数值。归一化公式如下:

r i j = x max ⁡ ( j ) − x i j x max ⁡ ( j ) − x min ⁡ ( j ) r_{ij} = \frac{x_{\max(j)} - x_{ij}}{x_{\max(j)} - x_{\min(j)}} rij=xmax(j)−xmin(j)xmax(j)−xij

其中:

  • r i j r_{ij} rij 是第 i i i 个样本在第 j j j 个指标下的归一化值。
  • x i j x_{ij} xij 是第 i i i 个样本在第 j j j 个指标下的原始值。
  • x min ⁡ ( j ) x_{\min(j)} xmin(j) 是第 j j j 个指标的最小值。
  • x max ⁡ ( j ) x_{\max(j)} xmax(j) 是第 j j j 个指标的最大值。
归一化公式解释
  • 当 x i j = x min ⁡ ( j ) x_{ij} = x_{\min(j)} xij=xmin(j) 时, r i j = 1 r_{ij} = 1 rij=1,表示该样本在该指标下的表现最好。
  • 当 x i j = x max ⁡ ( j ) x_{ij} = x_{\max(j)} xij=xmax(j) 时, r i j = 0 r_{ij} = 0 rij=0,表示该样本在该指标下的表现最差。
  • 如果 x i j x_{ij} xij 介于 x min ⁡ ( j ) x_{\min(j)} xmin(j) 和 x max ⁡ ( j ) x_{\max(j)} xmax(j) 之间, r i j r_{ij} rij的值位于 0 和 1 之间。

3. 归一化的目的和意义

  • 统一量纲:将不同量纲的指标统一到同一数值范围(通常为 [0, 1]),便于综合计算和比较。
  • 消除单位影响:通过归一化处理,消除不同单位对分析结果的影响。
  • 明确方向:根据指标的性质(极大化或极小化)调整数据方向,使得所有指标的优化目标一致(即越大越好)。

四、熵权法的原理

4.1 熵权法简介

熵权法(Entropy Weight Method, EWM)是一种客观赋权的方法,常用于多指标决策分析中。熵权法的基本思想是通过计算各指标的信息熵来衡量其在决策中的不确定性程度。指标的信息熵越大,说明该指标的信息越分散,差异性越小,对决策的影响程度越低;相反,信息熵越小,说明该指标的信息越集中,差异性越大,对决策的影响程度越高。

熵权法的优势在于它可以根据数据本身的分布情况,客观地确定各指标的权重,避免了人为主观赋权的干扰。

4.2 熵权法的原理

熵(Entropy)是信息论中的一个重要概念,用于度量系统的不确定性程度。在决策分析中,熵被用来表示指标值的离散程度。具体来说,信息熵越大,表明该指标的分布越均匀,对决策的贡献程度越小。因此,熵权法通过计算各指标的信息熵来确定其在决策中的权重。

4.2.1 信息熵的计算公式

给定一个指标 j j j,其在 n n n 个样本上的值为 x i j x_{ij} xij,熵权法的计算步骤如下:

  1. 标准化处理

    对原始数据进行标准化,消除量纲的影响。常用的标准化方法为极小化和极大化处理:

    r i j = x i j − x min ⁡ ( j ) x max ⁡ ( j ) − x min ⁡ ( j ) r_{ij} = \frac{x_{ij} - x_{\min(j)}}{x_{\max(j)} - x_{\min(j)}} rij=xmax(j)−xmin(j)xij−xmin(j)

    其中:

    • x i j x_{ij} xij是第 i i i个样本在第 j j j个指标上的值。
    • x min ⁡ ( j ) x_{\min(j)} xmin(j) 是第 j j j 个指标的最小值。
    • x max ⁡ ( j ) x_{\max(j)} xmax(j) 是第 j j j个指标的最大值。

    经过标准化后,所有数据都被归一化到 [0, 1] 区间。

  2. 计算各指标的比重

    计算每个样本在每个指标下的比重(比例系数):

    p i j = r i j ∑ i = 1 n r i j p_{ij} = \frac{r_{ij}}{\sum_{i=1}^{n} r_{ij}} pij=∑i=1nrijrij

    其中,$ p i j p_{ij} pij 表示第 i i i 个样本在第 j j j 个指标下的比重。

  3. 计算信息熵

    利用信息熵公式计算每个指标的信息熵:

    e j = − k ∑ i = 1 n p i j ln ⁡ ( p i j ) e_j = -k \sum_{i=1}^{n} p_{ij} \ln(p_{ij}) ej=−ki=1∑npijln(pij)

    其中:

    • e j e_j ej 是第 j j j 个指标的信息熵。
    • k = 1 ln ⁡ ( n ) k = \frac{1}{\ln(n)} k=ln(n)1 是一个常数,用于标准化熵值。
    • n n n是样本的数量。
    • 当 p i j = 0 p_{ij} = 0 pij=0 时,定义 p i j ln ⁡ ( p i j ) = 0 p_{ij} \ln(p_{ij}) = 0 pijln(pij)=0。
  4. 计算熵权

    根据信息熵计算每个指标的权重:

    w j = 1 − e j m − ∑ j = 1 m e j w_j = \frac{1 - e_j}{m - \sum_{j=1}^{m} e_j} wj=m−∑j=1mej1−ej

    其中:

    • w j w_j wj 是第 j j j 个指标的权重。
    • m m m 是指标的数量。
  5. 计算综合得分

    使用计算出的权重,计算每个样本的综合得分:

    S i = ∑ j = 1 m w j ⋅ r i j S_i = \sum_{j=1}^{m} w_j \cdot r_{ij} Si=j=1∑mwj⋅rij

    其中:

    • S i S_i Si 是第 i i i 个样本的综合得分。
    • r i j r_{ij} rij 是第 i i i 个样本在第 j j j 个指标下的标准化值。
相关推荐
此生只爱蛋7 分钟前
【手撕排序2】快速排序
c语言·c++·算法·排序算法
用户6915811416536 分钟前
Ascend Extension for PyTorch的源码解析
人工智能
Chef_Chen37 分钟前
从0开始学习机器学习--Day13--神经网络如何处理复杂非线性函数
神经网络·学习·机器学习
咕咕吖38 分钟前
对称二叉树(力扣101)
算法·leetcode·职场和发展
Troc_wangpeng38 分钟前
R language 关于二维平面直角坐标系的制作
开发语言·机器学习
努力的家伙是不讨厌的40 分钟前
解析json导出csv或者直接入库
开发语言·python·json
-Nemophilist-1 小时前
机器学习与深度学习-1-线性回归从零开始实现
深度学习·机器学习·线性回归
云空1 小时前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite
九圣残炎1 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
lulu_gh_yu1 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法