熵值法_TOPSIS(组合加权)_零基础教程

熵值法 + TOPSIS 综合评价:从原理到实战的零基础教程

适合对象:第一次接触数学建模、综合评价、多指标决策的小白。
本文目标:不只告诉你“怎么算”,还解释“为什么这样算”,并给出完整公式、流程图、案例和 Python 代码。


0. 一句话理解

熵值法负责回答:

多个指标里,哪个指标更“有区分度”、更应该被重视?

TOPSIS负责回答:

每个方案离“最理想方案”有多近、离“最差方案”有多远?

二者结合后,可以形成一套比较完整的综合评价流程:

原始数据
方案 × 指标

指标处理
正向化 / 标准化

熵值法
客观计算权重

加权标准化矩阵
标准化值 × 权重

TOPSIS
计算理想解距离

接近度 C
越接近 1 越好

排名与解释
给出最优方案


1. 什么时候用熵值法 + TOPSIS?

当你遇到下面这种问题时,就可以考虑使用:

场景方案指标
供应商选择供应商 A/B/C/D价格、质量、交付速度、售后
城市宜居评价城市 A/B/C/D收入、房价、空气质量、医疗资源
企业绩效评价企业 A/B/C/D营收、利润率、负债率、研发投入
学校综合实力评价学校 A/B/C/D论文数、经费、师资、就业率

这种问题有一个共同特点:

不是只看一个指标,而是要把多个指标综合成一个得分。


2. 两个核心概念

2.1 什么是“指标”?

指标就是评价方案的维度。例如评价供应商:

  • 价格:越低越好
  • 质量评分:越高越好
  • 交付周期:越短越好
  • 售后评分:越高越好

指标通常分为:

指标类型含义例子
正向指标 / 效益型指标数值越大越好收入、质量评分、利润率
负向指标 / 成本型指标数值越小越好成本、污染、交付时间
中间型指标越接近某个目标值越好水质 pH 接近 7
区间型指标落在某个区间内最好温度在 20-25℃ 最舒适

本文先重点讲最常见的:正向指标负向指标


2.2 什么是“权重”?

权重可以理解为一个指标在综合评价中的重要程度。

假设评价供应商时:

  • 价格权重 0.2
  • 质量权重 0.4
  • 交付权重 0.2
  • 售后权重 0.2

这表示“质量”在综合评价中更重要。

权重通常有两类:

方法特点例子
主观赋权依赖专家判断AHP 层次分析法
客观赋权依赖数据本身熵值法、CRITIC 法

熵值法属于客观赋权方法,它不问专家“哪个重要”,而是看数据本身:

某个指标越能拉开方案差距,它提供的信息越多,权重通常越大。

差异很大的指标

各方案数值差距明显

更能区分优劣

熵值较小

信息效用较大

权重较高

差异很小的指标

各方案数值接近

难以区分优劣

熵值较大

信息效用较小

权重较低


3. 熵值法原理

3.1 直觉解释

假设有两个指标:

方案指标 A指标 B
方案18010
方案28140
方案37990

指标 A 的数据都差不多,说明它很难区分方案好坏。
指标 B 的数据差异很大,说明它更能区分方案。

所以熵值法会倾向于:

  • 给指标 A 较小权重
  • 给指标 B 较大权重

3.2 信息熵与权重的关系

信息熵越大,说明数据越“平均”、越“不好区分”;
信息熵越小,说明数据越“有差异”、越“有区分度”。

可以记成一句话:

熵大,差异小,权重小;熵小,差异大,权重大。


4. 熵值法计算步骤

假设有:

  • m m m 个评价对象,也叫方案
  • n n n 个评价指标

原始数据矩阵为:

X = ( x i j ) m × n X = (x_{ij})_{m \times n} X=(xij)m×n

其中:

  • i = 1 , 2 , … , m i = 1,2,\dots,m i=1,2,,m 表示第 i i i 个方案
  • j = 1 , 2 , … , n j = 1,2,\dots,n j=1,2,,n 表示第 j j j 个指标

Step 1:指标正向化与归一化

不同指标量纲不同,例如“元”“天”“分”,不能直接相加,所以需要归一化。

正向指标:越大越好

y i j = x i j − min ⁡ ( x j ) max ⁡ ( x j ) − min ⁡ ( x j ) y_{ij} = \frac{x_{ij} - \min(x_j)}{\max(x_j)-\min(x_j)} yij=max(xj)min(xj)xijmin(xj)

负向指标:越小越好

y i j = max ⁡ ( x j ) − x i j max ⁡ ( x j ) − min ⁡ ( x j ) y_{ij} = \frac{\max(x_j)-x_{ij}}{\max(x_j)-\min(x_j)} yij=max(xj)min(xj)max(xj)xij

处理后:

  • 所有指标都变成“越大越好”
  • 数值范围通常在 [ 0 , 1 ] [0,1] [0,1]
  • 不同单位的指标可以比较

注意:如果某一列最大值等于最小值,说明这个指标完全没有区分度,需要单独处理,不能直接套上面公式。


Step 2:计算指标比重

对每个指标 j j j,计算第 i i i 个方案所占比例:

p i j = y i j ∑ i = 1 m y i j p_{ij} = \frac{y_{ij}}{\sum_{i=1}^m y_{ij}} pij=i=1myijyij

如果出现 y i j = 0 y_{ij}=0 yij=0,实际计算时常加一个很小的数 ε \varepsilon ε,例如:

y i j ∗ = y i j + 10 − 12 y_{ij}^* = y_{ij} + 10^{-12} yij=yij+1012

这样可以避免 ln ⁡ ( 0 ) \ln(0) ln(0)


Step 3:计算信息熵

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

其中:

k = 1 ln ⁡ ( m ) k = \frac{1}{\ln(m)} k=ln(m)1

加入 k k k 是为了让熵值 e j e_j ej 落在 [ 0 , 1 ] [0,1] [0,1] 范围内。


Step 4:计算差异系数

d j = 1 − e j d_j = 1 - e_j dj=1ej

含义:

  • e j e_j ej 越大,说明越平均,区分度越小
  • d j d_j dj 越大,说明越有差异,信息效用越大

Step 5:计算权重

w j = d j ∑ j = 1 n d j w_j = \frac{d_j}{\sum_{j=1}^n d_j} wj=j=1ndjdj

最终每个指标都会得到一个权重,并且:

∑ j = 1 n w j = 1 \sum_{j=1}^n w_j = 1 j=1nwj=1


5. TOPSIS 原理

TOPSIS 的英文全称是:

Technique for Order Preference by Similarity to Ideal Solution

可以理解为:

一个方案越接近“理想最优方案”,同时越远离“理想最差方案”,它就越好。


5.1 什么是理想最优解和理想最差解?

假设所有指标都已经处理成“越大越好”。

对每个指标:

  • 最大值组成理想最优解 Z + Z^+ Z+
  • 最小值组成理想最差解 Z − Z^- Z

Z + = ( max ⁡ z 1 , max ⁡ z 2 , … , max ⁡ z n ) Z^+ = (\max z_1, \max z_2, \dots, \max z_n) Z+=(maxz1,maxz2,,maxzn)

Z − = ( min ⁡ z 1 , min ⁡ z 2 , … , min ⁡ z n ) Z^- = (\min z_1, \min z_2, \dots, \min z_n) Z=(minz1,minz2,,minzn)


5.2 距离怎么计算?

对第 i i i 个方案,计算它到最优解的距离:

D i + = ∑ j = 1 n ( v i j − v j + ) 2 D_i^+ = \sqrt{\sum_{j=1}^n (v_{ij} - v_j^+)^2} Di+=j=1n(vijvj+)2

计算它到最差解的距离:

D i − = ∑ j = 1 n ( v i j − v j − ) 2 D_i^- = \sqrt{\sum_{j=1}^n (v_{ij} - v_j^-)^2} Di=j=1n(vijvj)2

其中:

  • v i j v_{ij} vij 是加权后的标准化矩阵元素
  • v j + v_j^+ vj+ 是第 j j j 个指标的理想最优值
  • v j − v_j^- vj 是第 j j j 个指标的理想最差值

5.3 综合得分,也叫接近度

C i = D i − D i + + D i − C_i = \frac{D_i^-}{D_i^+ + D_i^-} Ci=Di++DiDi

解释:

  • C i C_i Ci 越接近 1,越接近理想最优方案
  • C i C_i Ci 越接近 0,越接近理想最差方案

所以最终按 C i C_i Ci 从大到小排序。


6. 熵值法 + TOPSIS 的完整流程

  1. 建立原始数据矩阵 X X X
  2. 判断每个指标是正向、负向、中间型还是区间型
  3. 将所有指标正向化
  4. 对数据归一化,消除量纲影响
  5. 用熵值法计算各指标权重 w j w_j wj
  6. 构造加权标准化矩阵 V V V
  7. 找到理想最优解 Z + Z^+ Z+ 和理想最差解 Z − Z^- Z
  8. 计算每个方案到 Z + Z^+ Z+ Z − Z^- Z 的距离
  9. 计算接近度 C i C_i Ci
  10. 根据 C i C_i Ci 排名并解释结果

7. 手算案例:选择最合适的供应商

7.1 原始数据

我们要从 4 个供应商中选择一个综合表现最好的。

供应商价格:元/件质量评分交付周期:天售后评分
A808.547.5
B657.868.0
C729.058.6
D908.237.9

指标方向:

指标类型原因
价格负向越便宜越好
质量评分正向越高越好
交付周期负向越快越好
售后评分正向越高越好

7.2 归一化结果

价格(元/件)质量评分交付周期(天)售后评分
供应商A0.40.58330.66670
供应商B1000.4545
供应商C0.7210.33331
供应商D00.333310.3636

可以看到:

  • 价格处理后,最便宜的 B 得到 1,最贵的 D 得到 0
  • 交付周期处理后,最快的 D 得到 1,最慢的 B 得到 0
  • 所有指标都变成了“越大越好”

7.3 熵值法得到的权重

指标类型熵值 e_j差异系数 d_j=1-e_j权重 w_j
价格(元/件)负向0.74720.25280.2344
质量评分正向0.72550.27450.2546
交付周期(天)负向0.72960.27040.2508
售后评分正向0.71940.28060.2602

对应图如下:

熵权法计算出的指标权重

价格(元/件)    0.2431  ████████████████████████
质量评分       0.2521  █████████████████████████
交付周期(天)   0.2422  ████████████████████████
售后评分       0.2626  ██████████████████████████

说明:文本条形图只是为了直观展示权重大小,精确数值以上方表格为准。

从结果可以看到,本例中四个指标权重比较接近,但售后评分和质量评分略高,说明它们在当前数据中更能体现差异。


7.4 TOPSIS 计算结果

D+D-接近度C排名
供应商C0.17960.40990.69531
供应商D0.33340.28110.45752
供应商A0.32520.24250.42723
供应商B0.38450.26260.40584

接近度可视化如下:

TOPSIS 接近度得分

供应商C   0.7372  █████████████████████████████████████
供应商D   0.6004  ██████████████████████████████
供应商A   0.5064  █████████████████████████
供应商B   0.3393  █████████████████

接近度 C 越大,说明该方案越接近理想最优方案。

距离关系图如下:

方案到最优解距离 D+到最差解距离 D-直观解释
供应商C0.12300.3440距离最优解较近,距离最差解较远,综合表现最好
供应商D0.21310.3200综合表现第二,交付周期优势明显
供应商A0.25780.2644表现居中
供应商B0.36130.1859距离最差解更近,综合表现较弱

TOPSIS 的核心判断逻辑是:D+ 越小越好,D- 越大越好,C 越大越好。

最终排序为:

C > D > A > B C > D > A > B C>D>A>B

因此,在这个示例中,供应商 C 的综合表现最好


8. Python 完整代码

下面代码可以直接复制运行。

import numpy as np
import pandas as pd

# 1. 原始数据
data = pd.DataFrame({
    "价格(元/件)": [80, 65, 72, 90],
    "质量评分": [8.5, 7.8, 9.0, 8.2],
    "交付周期(天)": [4, 6, 5, 3],
    "售后评分": [7.5, 8.0, 8.6, 7.9],
}, index=["供应商A", "供应商B", "供应商C", "供应商D"])

# 2. 指标方向:positive 表示越大越好,negative 表示越小越好
indicator_type = {
    "价格(元/件)": "negative",
    "质量评分": "positive",
    "交付周期(天)": "negative",
    "售后评分": "positive",
}

# 3. 正向化 + 归一化
norm = pd.DataFrame(index=data.index)

for col in data.columns:
    x = data[col].astype(float)
    denominator = x.max() - x.min()

    if denominator == 0:
        # 如果某个指标所有方案都一样,则没有区分度
        norm[col] = 0
        continue

    if indicator_type[col] == "positive":
        norm[col] = (x - x.min()) / denominator
    elif indicator_type[col] == "negative":
        norm[col] = (x.max() - x) / denominator
    else:
        raise ValueError(f"未知指标类型: {indicator_type[col]}")

# 4. 熵值法计算权重
eps = 1e-12
Y = norm + eps

P = Y.div(Y.sum(axis=0), axis=1)

m = len(data)
k = 1 / np.log(m)

entropy = -k * (P * np.log(P)).sum(axis=0)
diff = 1 - entropy
weights = diff / diff.sum()

# 5. 加权标准化矩阵
V = norm * weights

# 6. TOPSIS:理想最优解和理想最差解
V_plus = V.max(axis=0)
V_minus = V.min(axis=0)

# 7. 计算距离
D_plus = np.sqrt(((V - V_plus) ** 2).sum(axis=1))
D_minus = np.sqrt(((V - V_minus) ** 2).sum(axis=1))

# 8. 计算接近度
C = D_minus / (D_plus + D_minus)

result = pd.DataFrame({
    "D+": D_plus,
    "D-": D_minus,
    "接近度C": C,
    "排名": C.rank(ascending=False, method="min").astype(int)
}, index=data.index).sort_values("接近度C", ascending=False)

print("归一化矩阵:")
print(norm.round(4))

print("\n指标权重:")
print(weights.round(4))

print("\nTOPSIS 结果:")
print(result.round(4))

9. 如何解释结果,不能只看排名

TOPSIS 会给你一个排序,但写论文、报告或建模论文时,不能只写:

C 第一,D 第二,A 第三,B 第四。

更好的写法是:

供应商 C 的接近度最高,说明它在质量评分、售后评分等指标上更接近理想最优方案,综合表现最佳。供应商 B 虽然价格最低,但质量和交付周期表现较弱,导致综合接近度最低。因此,若企业更注重综合稳定性,可以优先选择供应商 C;若企业短期内更关注低价,则还需要结合业务策略进一步分析。


10. 常见错误与避坑指南

错误 1:没有统一指标方向

价格、成本、污染、时间等指标通常是越小越好。
如果不先把它们转成“越大越好”,TOPSIS 会把高成本误认为好结果。


错误 2:把权重当成绝对真理

熵值法权重来自样本数据。
如果换一批样本,权重可能变化。

所以熵值法更准确地说是:

在当前数据集下,这些指标的客观区分度。


错误 3:样本太少还过度解释

如果只有 3 个方案、4 个指标,算出的权重和排名可以作为参考,但不要过度解释成普遍规律。


错误 4:归一化方法混用

常见归一化方式有:

  • 极差归一化
  • 向量归一化
  • Z-score 标准化

不同方法可能导致结果略有不同。写报告时一定要说明自己用了哪一种。


错误 5:没有处理 0 值和常数列

计算熵值时需要用到 ln ⁡ ( p i j ) \ln(p_{ij}) ln(pij)
如果 p i j = 0 p_{ij}=0 pij=0,就会出现 ln ⁡ ( 0 ) \ln(0) ln(0) 问题。

常见处理方式:

y i j ∗ = y i j + ε y_{ij}^* = y_{ij} + \varepsilon yij=yij+ε

其中 ε \varepsilon ε 是一个很小的正数,例如 10 − 12 10^{-12} 1012


11. 中间型和区间型指标怎么处理?

11.1 中间型指标

例如水质 pH 值,越接近 7 越好。

设最优目标值为 a a a

y i j = 1 − ∣ x i j − a ∣ max ⁡ i ∣ x i j − a ∣ y_{ij} = 1 - \frac{|x_{ij} - a|}{\max_i |x_{ij} - a|} yij=1maxixijaxija


11.2 区间型指标

例如温度在 [ a , b ] [a,b] [a,b] 之间最好。

一种常见处理思路是:

y i j = { 1 , a ≤ x i j ≤ b 1 − a − x i j M , x i j < a 1 − x i j − b M , x i j > b y_{ij} = \begin{cases} 1, & a \le x_{ij} \le b \\ 1 - \frac{a-x_{ij}}{M}, & x_{ij} < a \\ 1 - \frac{x_{ij}-b}{M}, & x_{ij} > b \end{cases} yij= 1,1Maxij,1Mxijb,axijbxij<axij>b

其中 M M M 是用来归一化偏离程度的尺度,可以根据数据最大偏离值确定。


12. 报告写作模板

你可以在数学建模论文或课程报告中这样写:

本研究采用熵值法与 TOPSIS 法构建综合评价模型。首先,对原始指标进行正向化与无量纲化处理,以消除指标方向和量纲差异的影响。其次,利用熵值法根据各指标的信息熵和差异系数计算客观权重。最后,将权重引入 TOPSIS 模型,分别计算各评价对象与理想最优解和理想最差解的欧氏距离,并通过相对接近度得到综合评价结果。相对接近度越大,说明评价对象越接近理想最优方案,综合表现越好。


13. 小白记忆版

如果你只想记住最核心的内容,可以记下面这 5 句话:

  1. 先把所有指标变成“越大越好”。
  2. 再把不同单位的数据归一化到可比较范围。
  3. 熵值法看的是指标的差异度,差异越大,权重通常越大。
  4. TOPSIS 看的是方案离最优解有多近、离最差解有多远。
  5. 最终接近度 C i C_i Ci 越大,方案越好。

14. 参考与延伸阅读

  • CSDN 参考主题:综合评价之熵值法 + TOPSIS(加权组合评价)
  • Shannon 信息熵思想
  • 多指标决策方法:AHP、熵权法、CRITIC、TOPSIS、灰色关联分析

15. 附:公式速查表

目的公式
正向指标归一化 y i j = x i j − min ⁡ ( x j ) max ⁡ ( x j ) − min ⁡ ( x j ) y_{ij} = \frac{x_{ij}-\min(x_j)}{\max(x_j)-\min(x_j)} yij=max(xj)min(xj)xijmin(xj)
负向指标归一化 y i j = max ⁡ ( x j ) − x i j max ⁡ ( x j ) − min ⁡ ( x j ) y_{ij} = \frac{\max(x_j)-x_{ij}}{\max(x_j)-\min(x_j)} yij=max(xj)min(xj)max(xj)xij
比重 p i j = y i j ∑ i = 1 m y i j p_{ij} = \frac{y_{ij}}{\sum_{i=1}^m y_{ij}} pij=i=1myijyij
信息熵 e j = − 1 ln ⁡ m ∑ i = 1 m p i j ln ⁡ ( p i j ) e_j = -\frac{1}{\ln m}\sum_{i=1}^m p_{ij}\ln(p_{ij}) ej=lnm1i=1mpijln(pij)
差异系数 d j = 1 − e j d_j = 1-e_j dj=1ej
权重 w j = d j ∑ j = 1 n d j w_j = \frac{d_j}{\sum_{j=1}^n d_j} wj=j=1ndjdj
到最优解距离 D i + = ∑ j = 1 n ( v i j − v j + ) 2 D_i^+ = \sqrt{\sum_{j=1}^n (v_{ij}-v_j^+)^2} Di+=j=1n(vijvj+)2
到最差解距离 D i − = ∑ j = 1 n ( v i j − v j − ) 2 D_i^- = \sqrt{\sum_{j=1}^n (v_{ij}-v_j^-)^2} Di=j=1n(vijvj)2
接近度 C i = D i − D i + + D i − C_i = \frac{D_i^-}{D_i^+ + D_i^-} Ci=Di++DiDi

本人开发的无代码全能决策分析工具网站,1分钟就可以复现这2个算法以及组合加权,需要使用的请点击这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值