问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

【数学建模】TOPSIS算法全解析:从数学原理到医疗器械采购决策应用

创作时间:
作者:
@小白创作中心

【数学建模】TOPSIS算法全解析:从数学原理到医疗器械采购决策应用

引用
CSDN
1.
https://blog.csdn.net/qq_74303061/article/details/146051563

TOPSIS(逼近理想解排序法)是一种直观且有效的多目标决策分析工具。它通过构建理想解和负理想解,将各方案与这两个极端解的相对接近程度作为排序依据,从而精准地筛选出最优方案。本文将从数学原理到实际应用,全面解析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) - xx′=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_ixi ,正向化公式如下:
    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}xi =⎩⎨⎧ 1−Ma−xi 11−Mxi −b ,xi <a,a≤xi ≤b,xi >b
    其中,M MM是区间外的最大偏离距离,x ~ i \tilde{x}_ix
    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 = 37a=36,b=37
M = max ⁡ { 36 − 35.2 , 38.4 − 37 } = 1.4 M = \max{36 - 35.2, \ 38.4 - 37} = 1.4M=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′ =σj xij −μ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=1m xij2 xij
可根据情况合理选择合适的标准化方法。

🚀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 ii个方案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题供应商评价数学建模实战-CSDN博客

📚 三、案例分析:医疗器械采购决策

🚀3.1 案例说明

假设一家医院正在选择最佳的医疗器械,有三种设备可供选择:A、B和C。医院需要根据以下四个指标来选择最佳设备:

  1. 成本:越低越好(极小型指标)
  2. 疗效:越高越好(极大型指标)
  3. 维护次数:越少越好(极小型指标)
  4. 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以最高的综合得分被选为最佳医疗器械。

📚参考链接

1、TOPSIS(逼近理想解)算法原理详解与代码实现 - 知乎

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号