🌈🌈🌈往期精选内容:
💖【数学建模】层次分析法(AHP):从理论到实战的全面解析_层次分析法计-优快云博客
💖【数学建模】图论模型:从Dijkstra算法到最小费用最大流实战-优快云博客
💖【数学建模】主成分分析(PCA)详解:从理论到实践的全面指南-优快云博客
💖【数学建模】数据拟合与插值技术全解析:从线性插值到Logistic模型实战优快云博客
💖【数学建模】熵权法——基于2021全国大学生数学建模C题供应商评价数学建模实战-优快云博客
💖MNIST手写数字识别——基于PyTorch的MLP模型的Python代码-优快云博客
TOPSIS算法全解析:从数学原理到医疗器械采购决策应用
💖 引言
在面对多标准多目标决策问题时,如何从众多备选方案中选择出最优解是一个关键挑战。TOPSIS
法(Technique for Order Preference by Similarity to Ideal Solution
),即逼近理想解排序法,作为一种直观且有效的决策分析工具,为决策提供了全新的视角。它通过巧妙地构建理想解和负理想解,将各方案与这两个极端解的相对接近程度作为排序依据,从而精准地筛选出最优方案。
这种方法在医疗、教育、工业等诸多领域都有着广泛的应用,例如在医疗领域帮助医院选择最适合的医疗器械供应商,在教育领域辅助学校挑选最优质的教学资源等。相较于层次分析法(AHP
),TOPSIS
法在数据驱动型问题中展现出独特的优势,它能够充分利用原始数据的信息,精确反映各评价方案之间的差距,为我们解决复杂的决策问题提供了有力的支持。
📚 一、TOPSIS算法
🚀 1.1 概念定义
TOPSIS
法是一种基于“优劣解距离”的排序方法。它的核心思想是,通过计算各备选方案与理想解(最优解)和负理想解(最劣解)的距离,来确定各方案的优劣顺序。理想解是指各指标都达到最佳值的虚拟解,而负理想解则是各指标都达到最差值的虚拟解。各方案与理想解越接近,与负理想解越远离,则该方案越优。
🚀 1.2 应用场景
TOPSIS
法适用于多方案、多指标的决策问题,尤其在以下场景中表现出色:
- 评价指标较多且类型各异(包含极大型、极小型、中间型、区间型等)
- 数据较为完整且稳定,能够准确反映各方案的特性
- 需要对方案进行全面、综合的评价,而不仅仅依赖于单一指标
🚀 1.3 使用条件
在使用TOPSIS
法之前,需要满足以下条件:
- 各评价指标的数据必须是可量化的
- 指标之间应具有一定的独立性,避免高度相关性对结果的影响
- 决策问题应具有明确的目标和有限的备选方案
📚二、数学原理
🚀2.1、数据处理
📄2.1.1数据正向化
在数据分析中,不同指标的方向性各不相同:有些指标的值越高越有利,有些则越低越好,还有一些指标的最佳值位于某个特定范围或接近某个中间值。为了便于统一评价,我们需要对这些指标进行正向化处理,将它们都转化为越高越好的形式,类似于考试成绩的高低。根据这些特性,指标可以分为以下四类:
指标名称 | 指标特点 | 例子 |
---|---|---|
极大型(效益型)指标 | 越大(多)越好 | 成绩、GDP增速、企业利润 |
极小型(成本型)指标 | 越小(少)越好 | 费用、坏品率、污染程度 |
中间型指标 | 越接近某个值越好 | 水质量评估时的PH值 |
区间型指标 | 落在某个区间最好 | 体温、水中植物性营养物量 |
将原始决策矩阵 X = ( x i j ) m × n X=(x_{ij})_{m×n} X=(xij)m×n转换为同趋势化矩阵:
- 极小型指标:
x ′ = max ( x ) − x x' = \max(x) - x x′=max(x)−x
- 中间型指标:
x ′ = 1 − ∣ x − x b e s t ∣ max ∣ x − x b e s t ∣ x' = 1 - \frac{|x - x_{best}|}{\max|x - x_{best}|} x′=1−max∣x−xbest∣∣x−xbest∣
- 区间型指标:分段线性变换在
TOPSIS
方法中,区间型指标的处理需要将其转换为极大型指标。假设区间型指标的最佳区间为 [ a , b ] [a, b] [a,b],对于每个指标值 x i x_i xi,正向化公式如下:
M = max { a − min { x i } , max { x i } − b } M = \max\left\{a - \min\{x_i\}, \max\{x_i\} - b\right\} M=max{a−min{xi},max{xi}−b}
x ~ i = { 1 − a − x i M , x i < a 1 , a ≤ x i ≤ b 1 − x i − b M , x i > b \tilde{x}_i = \begin{cases} 1 - \frac{a - x_i}{M} & , x_i < a \\ 1 & , a \leq x_i \leq b \\ 1 - \frac{x_i - b}{M} & , x_i > b \end{cases} x~i=⎩ ⎨ ⎧1−Ma−xi11−Mxi−b,xi<a,a≤xi≤b,xi>b
其中, M M M 是区间外的最大偏离距离, x ~ i \tilde{x}_i x~i是正向化后的指标值。这个公式将区间型指标转换为极大型指标,使得在区间内的指标值为1,区间外的指标值根据偏离程度进行折减。
例:
体温(转换前) | 体温(转换后) |
---|---|
35.2 | 0.4286 |
35.8 | 0.8571 |
36.6 | 1 |
37.1 | 0.9286 |
37.8 | 0.4286 |
38.4 | 0 |
a = 36 , b = 37 a = 36, \quad b = 37 a=36,b=37
M = max { 36 − 35.2 , 38.4 − 37 } = 1.4 M = \max\{36 - 35.2, \ 38.4 - 37\} = 1.4 M=max{36−35.2, 38.4−37}=1.4
总结:以上方法只是指标转换的其中一种方法,还有许多可以转换的数学方法,可以进行指标的转换。
📄2.1.1数据标准化
为了消除不同指标量纲的影响,需要对正向化矩阵进行标准化处理。常用的标准化方法有max-min
标准化和``Z-score`标准化。Z-score标准化公式为:
x
i
j
′
=
x
i
j
−
μ
j
σ
j
{x_{ij}^{\prime}=\frac{x_{ij}-\mu_j}{\sigma_j}}
xij′=σjxij−μj
也可以采用向量归一化:
z
i
j
=
x
i
j
∑
i
=
1
m
x
i
j
2
z_{ij} = \frac{x_{ij}}{\sqrt{\sum_{i=1}^m x_{ij}^2}}
zij=∑i=1mxij2xij
可根据情况合理选择合适的标准化方法。
🚀2.2、确定理想解
-
理想最优解: Z + = [ max z 1 j , max z 2 j , . . . , max z n j ] Z^+ = [\max z_{1j}, \max z_{2j}, ..., \max z_{nj}] Z+=[maxz1j,maxz2j,...,maxznj]
-
理想最劣解解: Z − = [ min z 1 j , min z 2 j , . . . , min z n j ] Z^- = [\min z_{1j}, \min z_{2j}, ..., \min z_{nj}] Z−=[minz1j,minz2j,...,minznj]
理想最优解、理想最劣解,意思就是每一个评价指标中最好的,和最坏的数值情况。
🚀2.3、计算距离评分
C i = D i − D i + + D i − C_i = \frac{D_i^-}{D_i^+ + D_i^-} Ci=Di++Di−Di−
其中对于第
i
i
i个方案
z
i
z_{i}
zi,计算它与最优解的距离:
D
i
+
=
∑
j
=
1
n
(
z
i
j
−
Z
j
+
)
2
D_i^+=\sqrt{\sum_{j=1}^n (z_{ij}-Z_j^+)^2}
Di+=j=1∑n(zij−Zj+)2
与最劣解的距离:
D
i
−
=
∑
j
=
1
n
(
z
i
j
−
Z
j
−
)
2
D_i^-=\sqrt{\sum_{j=1}^n (z_{ij}-Z_j^-)^2}
Di−=j=1∑n(zij−Zj−)2
🚀2.4、计算方案评分
初始得分计算公式为:
S
i
=
D
i
−
D
i
+
+
D
i
−
S_{i} = \frac{D_{i}^{-}}{D_{i}^{+} + D_{i}^{-}}
Si=Di++Di−Di−
S i S_{i} Si为初始得分的列向量,再进行列归一化后(将每个元素除以该列之和)就是评价方案间的比重结果了。
注意事项:TOPSIS
的所有权重默认是相同的,可以结合熵权法,层次分析法,CRITIC
权重法等赋权法结合使用为一些权重赋予不同的权重,来进一步优化决策。具体案例例如熵权法加TOPSIS
,细心的才可以看出在哪里使用了。可以参考往期💖【数学建模】熵权法——基于2021全国大学生数学建模C题供应商评价数学建模实战-优快云博客
📚 三、案例分析:医疗器械采购决策
🚀3.1 案例说明
假设一家医院正在选择最佳的医疗器械,有三种设备可供选择:A、B和C。医院需要根据以下四个指标来选择最佳设备:
- 成本:越低越好(极小型指标)
- 疗效:越高越好(极大型指标)
- 维护次数:越少越好(极小型指标)
- pH适应性:在6.5-7.5之间为最佳(区间型指标)
决策矩阵(3种医疗器械,4个指标):
设备 | 成本(↓) | 疗效(↑) | 维护次数(↓) | pH适应性(区间6.5-7.5) |
---|---|---|---|---|
A | 85 | 92 | 8 | 6.8 |
B | 78 | 88 | 6 | 7.7 |
C | 95 | 95 | 9 | 6.2 |
🚀 3.2 结果展示
计算结果:
🚀 3.3 Python代码实现
import numpy as np
import pandas as pd
def topsis(data, weights, indicator_types):
# 数据预处理
norm_data = data.copy()
for col in range(data.shape[1]):
if indicator_types[col] == 'min':
# 极小型指标转换为极大型指标
max_val = np.max(data[:, col])
min_val = np.min(data[:, col])
# 使用线性转换公式:(max - x) / (max - min)
norm_data[:, col] = (max_val - data[:, col]) / (max_val - min_val)
elif indicator_types[col] == 'range':
# 区间型指标转换为极大型指标
low, high = 6.5, 7.5 # 区间范围
dist_low = low - np.min(data[:, col]) # 区间下限与最小值的距离
dist_high = np.max(data[:, col]) - high # 区间上限与最大值的距离
# 使用分段函数进行转换
'''np.where的基本功能,它是一个条件判断函数,可以根据条件返回不同的值。它的语法是np.where(condition, x, y),
意思是:如果条件condition为真,就返回x,否则返回y。
这个函数的设计本身是支持嵌套的,因为它的返回值可以是一个新的表达式,而这个表达式又可以包含另一个np.where'''
norm_data[:, col] = np.where(
(data[:, col] >= low) & (data[:, col] <= high), 1, # 在区间内值为1
np.where(data[:, col] < low,
1 - (low - data[:, col]) / dist_low, # 小于下限时,按比例递减
1 - (data[:, col] - high) / dist_high)) # 大于上限时,按比例递减
# 标准化与加权
# 计算标准化矩阵,消除不同指标量纲的影响
norm_matrix = norm_data / np.linalg.norm(norm_data, axis=0)
# 对标准化后的数据进行加权处理
weighted_matrix = norm_matrix * weights
# 计算理想解
# 理想解是各指标的最优值
Z_pos = np.max(weighted_matrix, axis=0)
# 负理想解是各指标的最差值
Z_neg = np.min(weighted_matrix, axis=0)
# 欧式距离计算
# 计算各方案与理想解的欧氏距离
D_pos = np.sqrt(((weighted_matrix - Z_pos)**2).sum(axis=1))
# 计算各方案与负理想解的欧氏距离
D_neg = np.sqrt(((weighted_matrix - Z_neg)**2).sum(axis=1))
# 综合得分
# 根据公式计算综合得分:D_neg / (D_pos + D_neg)
scores = D_neg / (D_pos + D_neg)
return D_pos, D_neg, scores
# 示例调用
data = np.array([[85, 92, 8, 6.8], [78, 88, 6, 7.7], [95, 95, 9, 6.2]])
weights = [0.3, 0.4, 0.2, 0.1]
indicator_types = ['min', 'max', 'min', 'range']
D_pos, D_neg, scores = topsis(data, weights, indicator_types)
# 创建DataFrame展示结果
results = pd.DataFrame({
'设备': ['A', 'B', 'C'],
'综合得分': np.round(scores, 3),
'到理想解的距离': np.round(D_pos, 3),
'到负理想解的距离': np.round(D_neg, 3)
})
# 按综合得分降序排列
results = results.sort_values(by='综合得分', ascending=False)
results['排名'] = range(1, len(results) + 1)
display(results)
通过TOPSIS
法,可以综合考虑这些指标,计算出每个设备的综合得分,并根据得分进行排序。最终,设备B以最高的综合得分被选为最佳医疗器械。