熵值法 + TOPSIS 综合评价:从原理到实战的零基础教程
适合对象:第一次接触数学建模、综合评价、多指标决策的小白。
本文目标:不只告诉你“怎么算”,还解释“为什么这样算”,并给出完整公式、流程图、案例和 Python 代码。
0. 一句话理解
熵值法负责回答:
多个指标里,哪个指标更“有区分度”、更应该被重视?
TOPSIS负责回答:
每个方案离“最理想方案”有多近、离“最差方案”有多远?
二者结合后,可以形成一套比较完整的综合评价流程:
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 |
|---|---|---|
| 方案1 | 80 | 10 |
| 方案2 | 81 | 40 |
| 方案3 | 79 | 90 |
指标 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)xij−min(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+10−12
这样可以避免 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=1∑mpijln(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=1−ej
含义:
- 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=1∑nwj=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=1∑n(vij−vj+)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=1∑n(vij−vj−)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++Di−Di−
解释:
- C i C_i Ci 越接近 1,越接近理想最优方案
- C i C_i Ci 越接近 0,越接近理想最差方案
所以最终按 C i C_i Ci 从大到小排序。
6. 熵值法 + TOPSIS 的完整流程
- 建立原始数据矩阵 X X X
- 判断每个指标是正向、负向、中间型还是区间型
- 将所有指标正向化
- 对数据归一化,消除量纲影响
- 用熵值法计算各指标权重 w j w_j wj
- 构造加权标准化矩阵 V V V
- 找到理想最优解 Z + Z^+ Z+ 和理想最差解 Z − Z^- Z−
- 计算每个方案到 Z + Z^+ Z+ 和 Z − Z^- Z− 的距离
- 计算接近度 C i C_i Ci
- 根据 C i C_i Ci 排名并解释结果
7. 手算案例:选择最合适的供应商
7.1 原始数据
我们要从 4 个供应商中选择一个综合表现最好的。
| 供应商 | 价格:元/件 | 质量评分 | 交付周期:天 | 售后评分 |
|---|---|---|---|---|
| A | 80 | 8.5 | 4 | 7.5 |
| B | 65 | 7.8 | 6 | 8.0 |
| C | 72 | 9.0 | 5 | 8.6 |
| D | 90 | 8.2 | 3 | 7.9 |
指标方向:
| 指标 | 类型 | 原因 |
|---|---|---|
| 价格 | 负向 | 越便宜越好 |
| 质量评分 | 正向 | 越高越好 |
| 交付周期 | 负向 | 越快越好 |
| 售后评分 | 正向 | 越高越好 |
7.2 归一化结果
| 价格(元/件) | 质量评分 | 交付周期(天) | 售后评分 | |
|---|---|---|---|---|
| 供应商A | 0.4 | 0.5833 | 0.6667 | 0 |
| 供应商B | 1 | 0 | 0 | 0.4545 |
| 供应商C | 0.72 | 1 | 0.3333 | 1 |
| 供应商D | 0 | 0.3333 | 1 | 0.3636 |
可以看到:
- 价格处理后,最便宜的 B 得到 1,最贵的 D 得到 0
- 交付周期处理后,最快的 D 得到 1,最慢的 B 得到 0
- 所有指标都变成了“越大越好”
7.3 熵值法得到的权重
| 指标类型 | 熵值 e_j | 差异系数 d_j=1-e_j | 权重 w_j | |
|---|---|---|---|---|
| 价格(元/件) | 负向 | 0.7472 | 0.2528 | 0.2344 |
| 质量评分 | 正向 | 0.7255 | 0.2745 | 0.2546 |
| 交付周期(天) | 负向 | 0.7296 | 0.2704 | 0.2508 |
| 售后评分 | 正向 | 0.7194 | 0.2806 | 0.2602 |
对应图如下:
熵权法计算出的指标权重
价格(元/件) 0.2431 ████████████████████████
质量评分 0.2521 █████████████████████████
交付周期(天) 0.2422 ████████████████████████
售后评分 0.2626 ██████████████████████████
说明:文本条形图只是为了直观展示权重大小,精确数值以上方表格为准。
从结果可以看到,本例中四个指标权重比较接近,但售后评分和质量评分略高,说明它们在当前数据中更能体现差异。
7.4 TOPSIS 计算结果
| D+ | D- | 接近度C | 排名 | |
|---|---|---|---|---|
| 供应商C | 0.1796 | 0.4099 | 0.6953 | 1 |
| 供应商D | 0.3334 | 0.2811 | 0.4575 | 2 |
| 供应商A | 0.3252 | 0.2425 | 0.4272 | 3 |
| 供应商B | 0.3845 | 0.2626 | 0.4058 | 4 |
接近度可视化如下:
TOPSIS 接近度得分
供应商C 0.7372 █████████████████████████████████████
供应商D 0.6004 ██████████████████████████████
供应商A 0.5064 █████████████████████████
供应商B 0.3393 █████████████████
接近度 C 越大,说明该方案越接近理想最优方案。
距离关系图如下:
| 方案 | 到最优解距离 D+ | 到最差解距离 D- | 直观解释 |
|---|---|---|---|
| 供应商C | 0.1230 | 0.3440 | 距离最优解较近,距离最差解较远,综合表现最好 |
| 供应商D | 0.2131 | 0.3200 | 综合表现第二,交付周期优势明显 |
| 供应商A | 0.2578 | 0.2644 | 表现居中 |
| 供应商B | 0.3613 | 0.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} 10−12。
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=1−maxi∣xij−a∣∣xij−a∣
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,1−Ma−xij,1−Mxij−b,a≤xij≤bxij<axij>b
其中 M M M 是用来归一化偏离程度的尺度,可以根据数据最大偏离值确定。
12. 报告写作模板
你可以在数学建模论文或课程报告中这样写:
本研究采用熵值法与 TOPSIS 法构建综合评价模型。首先,对原始指标进行正向化与无量纲化处理,以消除指标方向和量纲差异的影响。其次,利用熵值法根据各指标的信息熵和差异系数计算客观权重。最后,将权重引入 TOPSIS 模型,分别计算各评价对象与理想最优解和理想最差解的欧氏距离,并通过相对接近度得到综合评价结果。相对接近度越大,说明评价对象越接近理想最优方案,综合表现越好。
13. 小白记忆版
如果你只想记住最核心的内容,可以记下面这 5 句话:
- 先把所有指标变成“越大越好”。
- 再把不同单位的数据归一化到可比较范围。
- 熵值法看的是指标的差异度,差异越大,权重通常越大。
- TOPSIS 看的是方案离最优解有多近、离最差解有多远。
- 最终接近度 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)xij−min(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=−lnm1∑i=1mpijln(pij) |
| 差异系数 | d j = 1 − e j d_j = 1-e_j dj=1−ej |
| 权重 | 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(vij−vj+)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(vij−vj−)2 |
| 接近度 | C i = D i − D i + + D i − C_i = \frac{D_i^-}{D_i^+ + D_i^-} Ci=Di++Di−Di− |
本人开发的无代码全能决策分析工具网站,1分钟就可以复现这2个算法以及组合加权,需要使用的请点击这里

1万+

被折叠的 条评论
为什么被折叠?



