ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

TOPSIS优劣解距离法:从原理到Python实现的多准则决策指南

TOPSIS优劣解距离法:从原理到Python实现的多准则决策指南 1. 从“选谁”到“怎么选”TOPSIS法的现实起点每次做决策尤其是那种需要从一堆选项里挑出“最优”的你是不是也经常头疼比如公司要采购一批服务器有A、B、C、D四家供应商每家的报价、性能、售后、能耗都不一样。老板让你给个推荐你怎么选凭感觉还是给每个指标打个分然后简单加总这些方法要么太主观要么忽略了指标之间的量纲差异和权重关系最后选出来的可能并不是真正“综合最优”的那个。这就是TOPSIS法Technique for Order Preference by Similarity to Ideal Solution优劣解距离法要解决的问题。我第一次在数学建模竞赛里接触到它时就觉得这方法特别“接地气”。它不像一些纯理论模型那么玄乎核心思想非常直观最好的方案应该离想象中的“完美方案”最近同时离想象中的“最差方案”最远。这个“完美方案”和“最差方案”不是我们拍脑袋定的而是根据所有候选方案在每个指标上的表现自动计算出来的理论极值点。举个例子选手机。假设我们只关心“性能跑分”越高越好和“价格”越低越好。那么“理想手机”就是性能跑分最高且价格最低的那台可能现实中不存在“最差手机”就是性能跑分最低且价格最高的那台。TOPSIS法会计算每一款真实手机与这台“理想手机”和“最差手机”的距离然后看它更靠近谁。离理想越近、离最差越远的手机综合得分就越高。这个方法在数学建模、管理决策、工程评估等领域应用极广。因为它不需要假设数据服从特定分布对样本量也没严格要求关键是计算过程清晰结果易于解释。下面我就结合自己多次在数模竞赛和实际项目中使用TOPSIS的经验把它掰开揉碎了讲清楚包括最容易被忽视的权重确定问题——熵权法。2. TOPSIS的核心步骤拆解从原始数据到排名很多人学TOPSIS只记步骤公式却不理解每一步为什么要这么做一旦数据有点“脏”或者指标性质特殊就懵了。我们一步步来我会把每个环节的“坑”和操作细节都点明。2.1 构建初始决策矩阵一切分析的基石假设我们有m个待评价方案比如4款手机n个评价指标比如性能、价格、续航、拍照。第一步就是列出原始数据矩阵我们记为XX [ x_{ij} ] 其中 i1,2,...,m (方案) j1,2,...,n (指标)例如方案性能跑分分价格元续航小时拍照得分分手机A850039996.585手机B920049995.892手机C780029997.278手机D950059995.595这个矩阵X就是我们的起点。但直接用它计算会出问题首先各指标量纲不同分、元、小时数值大小差异巨大价格动辄几千跑分也近万而续航是个位数直接算距离会被大数值指标主导。其次指标方向不同性能是“越大越好”效益型价格是“越小越好”成本型。注意在实际收集数据时务必检查数据的完整性和合理性。遇到缺失值常见的处理方式有删除该方案如果缺失严重、用同一指标的其他方案均值填充、或用插值法估算。我的经验是在数模竞赛中如果缺失不多用均值填充是最稳妥快捷的。2.2 数据标准化消除量纲与方向的影响这一步的目的是把不同量纲、不同方向的指标转化到同一个尺度上并且统一为“越大越好”。常用方法是向量归一化也是TOPSIS最经典的做法。对于矩阵X中的每一个元素x_{ij}其标准化后的值z_{ij}计算公式为z_{ij} x_{ij} / sqrt( sum_{i1}^{m} (x_{ij}^2) )这个公式做了两件事消除量纲分母是每个指标下所有方案值的平方和的平方根它像一个“尺度因子”把该指标下的所有数据都压缩到[0,1]区间附近。相对化处理它衡量的是每个值在该指标总体中的相对大小。计算后我们得到标准化矩阵Z。但请注意这个步骤只消除了量纲并没有改变指标的方向成本型指标如价格经过此处理仍然是数值越小标准化值越小。所以我们需要下一步。2.3 统一指标方向构建加权规范矩阵我们需要将所有指标都转化为“效益型”越大越好。对于成本型指标常用的方法是取倒数或做减法。但在TOPSIS的经典流程里更常见的做法是在标准化之后通过一个变换来统一方向。然而一个更清晰且不易出错的做法是在数据标准化之前先对成本型指标数据进行正向化处理。假设第二个指标“价格”是成本型。我们可以先对其进行正向化x‘_{i2} max(x_{i2}) - x_{i2}或者x’_{i2} 1 / x_{i2}。 前者是“差值法”后者是“倒数法”。倒数法对数值敏感不能为0差值法更稳定。在实际应用中我通常使用差值法。将所有成本型指标正向化后得到的新矩阵X‘中的所有指标就都是效益型了。然后再对这个X’进行上述的向量归一化得到真正的标准化矩阵Z。接下来是赋予权重。不同的指标重要性不同我们需要一个权重向量W [w1, w2, ..., wn]满足sum(wj) 1。将权重应用到标准化矩阵上得到加权规范矩阵Vv_{ij} w_j * z_{ij}矩阵V就是我们进行距离比较的“起跑线”所有方案都在这个加权且统一后的空间里有了自己的新坐标。实操心得权重的确定是TOPSIS应用中最关键也最主观的一环。在数模竞赛中如果题目没有给出明确权重你必须论证你赋权的方法。常见的有1) 专家打分法德尔菲法2) 层次分析法AHP3)熵权法客观赋权。熵权法特别适合与TOPSIS搭配使用我们会在第3章详细讲。2.4 确定理想解与负理想解这是TOPSIS思想的精髓所在。理想解正理想解V^是一个虚拟的方案它由每个指标在加权规范矩阵V中的最大值构成V^ ( max(v_{i1}), max(v_{i2}), ..., max(v_{in}) ) ( v_1^, v_2^, ..., v_n^ )负理想解最劣解V^-同样虚拟由每个指标的最小值构成V^- ( min(v_{i1}), min(v_{i2}), ..., min(v_{in}) ) ( v_1^-, v_2^-, ..., v_n^- )注意因为我们已经将所有指标正向化并标准化了所以这里的max和min直接对应“最好”和“最差”。2.5 计算距离与相对贴近度对于每一个真实方案i计算它到理想解V^的距离S_i^以及到负理想解V^-的距离S_i^-。距离通常采用欧几里得距离n维空间中的直线距离S_i^ sqrt( sum_{j1}^{n} (v_{ij} - v_j^)^2 )S_i^- sqrt( sum_{j1}^{n} (v_{ij} - v_j^-)^2 )最后计算每个方案的相对贴近度C_iC_i S_i^- / (S_i^ S_i^-)这个C_i就是我们的最终得分范围在0到1之间。C_i越接近1说明该方案离理想解越近离负理想解越远综合表现越好。C_i越接近0则相反。根据C_i的大小对所有方案进行排序即可得到优劣顺序。避坑提示计算距离时务必确认你使用的是加权规范矩阵V中的值而不是标准化矩阵Z中的值。权重在这里起到了关键作用忽略了权重就等于默认所有指标同等重要。3. 熵权法让数据自己“说话”确定权重在第二章我们提到了权重的重要性。主观赋权如AHP依赖专家经验在缺乏先验知识或需要强调数据本身规律的场景下客观赋权法更受青睐。熵权法就是一种经典的客观赋权法其核心思想是指标的变异程度越大它所包含的信息量就越多在评价中应赋予更大的权重。3.1 信息熵的基本概念在信息论中熵用来度量系统的无序程度或信息的不确定性。对于一个指标j如果所有方案在该指标上的值都差不多变异小那么这个指标在区分方案优劣方面提供的信息量就少熵值就大权重应减小。反之如果各方案在该指标上差异显著则该指标携带的信息量大熵值小权重应增大。3.2 熵权法计算步骤详解假设我们有标准化后的矩阵Z注意这里用的是向量归一化后的Z且指标已统一为效益型。步骤1计算比重P_{ij}将每一个标准化值z_{ij}转化为比重表征方案i在指标j上的贡献度p_{ij} z_{ij} / sum_{i1}^{m} z_{ij} 其中要求z_{ij} 0。如果存在非正数需要对整个矩阵进行平移如z‘_{ij} z_{ij} min(z_j) 0.0001。步骤2计算第j项指标的熵值e_je_j -k * sum_{i1}^{m} [ p_{ij} * ln(p_{ij}) ]其中k 1 / ln(m)是一个常数用于保证e_j在 [0,1] 区间内。当某个指标下各方案的p_{ij}完全相等时熵值e_j取得最大值1。步骤3计算信息效用值d_jd_j 1 - e_jd_j越大说明该指标的信息效用越大越重要。步骤4计算权重w_j将信息效用值归一化即得到每个指标的熵权w_j d_j / sum_{j1}^{n} d_j至此我们就得到了一组完全由数据本身驱动得出的客观权重W [w1, w2, ..., wn]。将这组权重代入到第二章的2.3节用于构建加权规范矩阵V。经验之谈熵权法非常依赖数据的变异程度。如果某个指标在所有方案上的值几乎一样例如所有手机的“是否支持蓝牙”都是“是”那么该指标的熵权会非常小近乎于0。这是合理的因为一个无法区分方案的指标在评价中本就不应起作用。在数模论文中使用熵权法一定要写出计算过程并分析得到的权重是否合乎常识。有时可以将熵权法与主观赋权法结合如乘法集成得到主客观综合权重。4. TOPSIS的完整计算案例与Python实现理论讲完了我们用一个简化案例串起整个流程并附上可直接运行的Python代码。这样你不仅能看懂还能直接拿来用。4.1 案例四款手机综合评价数据沿用第2章的示例但这里我们明确指标类型和权重方法。方案手机A, B, C, D (m4)指标1.性能跑分效益型 2.价格成本型 3.续航效益型 4.拍照得分效益型原始数据矩阵X[[8500, 3999, 6.5, 85], [9200, 4999, 5.8, 92], [7800, 2999, 7.2, 78], [9500, 5999, 5.5, 95]]计划使用熵权法确定权重然后用TOPSIS排序。4.2 手动计算推导关键环节由于篇幅我们聚焦于关键步骤的理解完整计算可用代码完成。1. 正向化将成本型指标“价格”正向化。使用差值法新价格 max(价格) - 原价格。 max(价格) 5999。 因此新价格数据为[5999-39992000, 5999-49991000, 5999-29993000, 5999-59990]。 正向化后的矩阵X‘为[[8500, 2000, 6.5, 85], [9200, 1000, 5.8, 92], [7800, 3000, 7.2, 78], [9500, 0, 5.5, 95]]注意此时所有指标都已变为“越大越好”。2. 标准化向量归一化 以“性能跑分”列为例计算分母sqrt(8500^2 9200^2 7800^2 9500^2) ≈ sqrt(72.2584.6460.8490.25)*10^3 ≈ sqrt(307.98)*10^3 ≈ 17549.3则手机A的性能标准化值8500 / 17549.3 ≈ 0.4844同理计算其他。得到标准化矩阵Z近似值[[0.4844, 0.5345, 0.5062, 0.4781], [0.5243, 0.2673, 0.4515, 0.5172], [0.4444, 0.8018, 0.5606, 0.4384], [0.5412, 0.0000, 0.4283, 0.5340]]3. 熵权法求权重基于矩阵Z 以“性能跑分”列(j1)为例计算比重p_i1p11 0.4844/(0.48440.52430.44440.5412) ≈ 0.4844/1.9943 ≈ 0.2429 同理得p21≈0.2629, p31≈0.2228, p41≈0.2714。计算熵值e1k1/ln(4)≈0.7213e1 -0.7213 * (0.2429*ln0.2429 ... 0.2714*ln0.2714) ≈ -0.7213 * (-1.345) ≈ 0.970。计算信息效用d1 1 - 0.970 0.030。 同理计算其他指标的d_j。假设我们算得d [0.030, 0.450, 0.020, 0.025]这里为演示价格列的变异最大所以d值也最大。计算权重w_jsum(d) 0.525 则w [0.030/0.525≈0.057, 0.450/0.525≈0.857, 0.020/0.525≈0.038, 0.025/0.525≈0.048]。 可以看到价格已正向化的权重被熵权法赋予了极高的值0.857因为它在此数据集内变异最大0, 1000, 2000, 3000区分度最高。4. 构建加权规范矩阵Vv_{ij} w_j * z_{ij}。例如手机A的性能加权值0.057 * 0.4844 ≈ 0.0276。 得到V矩阵近似[[0.0276, 0.4582, 0.0192, 0.0229], [0.0299, 0.2291, 0.0172, 0.0248], [0.0253, 0.6873, 0.0213, 0.0210], [0.0308, 0.0000, 0.0163, 0.0256]]5. 确定理想解V^与负理想解V^-V^ [max(性能列), max(价格列), max(续航列), max(拍照列)] [0.0308, 0.6873, 0.0213, 0.0256]V^- [min(性能列), min(价格列), min(续航列), min(拍照列)] [0.0253, 0.0000, 0.0163, 0.0210]6. 计算距离与贴近度 以手机A为例S_A^ sqrt((0.0276-0.0308)^2 (0.4582-0.6873)^2 (0.0192-0.0213)^2 (0.0229-0.0256)^2) ≈ sqrt(0.000010 0.05248 0.0000044 0.0000073) ≈ sqrt(0.0525) ≈ 0.2291S_A^- sqrt((0.0276-0.0253)^2 (0.4582-0.0000)^2 (0.0192-0.0163)^2 (0.0229-0.0210)^2) ≈ sqrt(0.0000053 0.2099 0.0000084 0.0000036) ≈ sqrt(0.2099) ≈ 0.4582C_A S_A^- / (S_A^ S_A^-) 0.4582 / (0.22910.4582) ≈ 0.4582 / 0.6873 ≈ 0.666同理计算其他手机。最终C_i排序可能为C_C C_A C_B C_D具体值取决于精确计算。这意味着在本案例的熵权权重下手机C价格最低、续航最长的综合评价最高。4.3 Python代码实现手动计算太繁琐下面给出一个完整的Python函数包含了正向化、标准化、熵权法、TOPSIS计算的全流程。import numpy as np import pandas as pd def topsis(data, weightNone, index_typeNone): TOPSIS综合评价函数。 参数 data: numpy.ndarray 或 pandas.DataFrame原始决策矩阵每行一个方案每列一个指标。 weight: list 或 array-like, 可选。预先设定的权重向量。如为None则使用熵权法计算。 index_type: list, 可选。指示每列指标的类型1表示效益型-1表示成本型。 如为None则默认所有指标为效益型。 返回 result_df: pandas.DataFrame包含各方案的综合得分C_i及排序。 weight: 最终使用的权重向量。 # 转换为numpy数组 X np.array(data, dtypefloat) m, n X.shape # m个方案n个指标 # 1. 指标正向化 if index_type is None: index_type [1] * n # 默认全为效益型 X_pos X.copy() for j in range(n): if index_type[j] -1: # 成本型指标 X_pos[:, j] np.max(X[:, j]) - X[:, j] # 差值法正向化 # 或者使用倒数法X_pos[:, j] 1 / X[:, j] # 2. 数据标准化向量归一化 Z X_pos / np.sqrt(np.sum(X_pos ** 2, axis0)) # 3. 确定权重熵权法 if weight is None: # 计算比重 P Z / np.sum(Z, axis0, keepdimsTrue) # 处理可能为0的值避免log(0) P np.where(P 0, 1e-10, P) # 计算熵值 k 1 / np.log(m) e -k * np.sum(P * np.log(P), axis0) # 计算信息效用值 d 1 - e # 计算权重 weight d / np.sum(d) else: weight np.array(weight) if len(weight) ! n: raise ValueError(权重向量长度与指标数不符) if not np.allclose(np.sum(weight), 1): print(警告权重之和不为1已自动归一化) weight weight / np.sum(weight) # 4. 计算加权规范矩阵 V Z * weight # 5. 确定理想解和负理想解 V_plus np.max(V, axis0) V_minus np.min(V, axis0) # 6. 计算各方案到理想解/负理想解的距离 S_plus np.sqrt(np.sum((V - V_plus) ** 2, axis1)) S_minus np.sqrt(np.sum((V - V_minus) ** 2, axis1)) # 7. 计算相对贴近度 C S_minus / (S_plus S_minus) # 8. 整理结果 result_df pd.DataFrame({ 方案: [f方案{i1} for i in range(m)], 综合得分C_i: C, 排序: np.argsort(-C) 1 # 降序排列的名次 }) result_df result_df.sort_values(by综合得分C_i, ascendingFalse).reset_index(dropTrue) return result_df, weight # 使用示例 if __name__ __main__: # 原始数据 data np.array([ [8500, 3999, 6.5, 85], [9200, 4999, 5.8, 92], [7800, 2999, 7.2, 78], [9500, 5999, 5.5, 95] ]) # 指标类型性能(效益1)价格(成本-1)续航(效益1)拍照(效益1) index_type [1, -1, 1, 1] # 调用函数 result, weights topsis(data, weightNone, index_typeindex_type) print(熵权法计算得到的权重, weights) print(\nTOPSIS综合评价结果) print(result)运行这段代码你可以快速得到评价结果和熵权权重。在实际数模竞赛或项目分析中你只需要准备好数据矩阵data和对应的index_type列表即可。5. 实战中的常见问题与进阶思考TOPSIS法原理清晰实现也不难但在实际应用中尤其是数学建模竞赛中有几个关键点处理不好很容易失分。5.1 指标正向化的方法选择我们之前用了差值法 (max - x)。还有其他方法倒数法x 1/x。适用于绝对数值但要求x 0且当x很小时x会剧烈放大可能 distort 数据分布。区间型指标正向化有些指标不是越大越好或越小越好而是落在某个区间[a, b]内最好。例如人体体温在36.5-37.5度最好。处理方式可以是M max{ |x_i - a|, |x_i - b| }x_i 1 - |x_i - (ab)/2| / M一种方法 这需要根据实际问题灵活构造转换函数。建议在论文中必须明确说明你选择某种正向化方法的理由。差值法最稳健也最常用。5.2 数据标准化的其他方法除了向量归一化还有Min-Max标准化极差法z_{ij} (x_{ij} - min_j) / (max_j - min_j)。将数据缩放到[0,1]。这种方法会受极端值极大、极小影响。Z-score标准化z_{ij} (x_{ij} - mean_j) / std_j。将数据转化为均值为0标准差为1的分布。但处理后的数据可能出现负值在计算比重p_{ij}熵权法需要时可能需要再次平移。TOPSIS经典论文中多用向量归一化因为它源于欧氏距离的空间几何意义与后续计算距离的环节在数学上更自洽。我建议无特殊要求时优先使用向量归一化。5.3 权重敏感性与结果分析TOPSIS的结果对权重非常敏感。在上面案例中熵权法给了价格正向化后极高的权重0.857导致最终排名几乎由价格决定。这合理吗这取决于问题的背景。如果本次采购预算极度敏感价格差异的权重本就该很大熵权法反映了这一数据特征。但如果从业务角度看性能和拍照也同样重要那么纯熵权法得出的结果可能过于极端。因此在实际应用中尤其是撰写数模论文时必须进行敏感性分析或权重分析。你可以对比不同赋权方法分别用熵权法、AHP法、等权重法计算看排名是否稳定。如果排名变化不大说明结果稳健如果变化大则需要深入分析原因并在论文中讨论。模拟权重变化固定其他指标权重微调某个关键指标的权重观察综合得分C_i和排名的变化情况。这能帮你理解哪个指标对最终决策影响最大。5.4 TOPSIS的局限性及与其他方法的结合没有完美的模型TOPSIS也有其局限“理想解”可能不切实际理想解是由各个指标的最优值拼凑起来的现实中可能不存在这样的方案比如又便宜、性能又顶级、续航又长的手机。对中间型指标处理稍复杂如前所述需要额外的正向化函数。距离度量单一默认使用欧氏距离它假设各指标间相互独立。如果指标间存在较强相关性可以考虑使用马氏距离但计算更复杂。在实践中TOPSIS常与其他方法结合AHP-TOPSIS用AHP确定主观权重再代入TOPSIS计算。这样兼顾了专家经验和数据本身。熵权-TOPSIS如本文所述用熵权法确定客观权重再代入TOPSIS。这在数据充足、缺乏先验知识时很有效。灰色关联分析-TOPSIS先用灰色关联分析处理数据不确定性再用TOPSIS排序。5.5 在数学建模竞赛中的应用要点如果你在数模竞赛中使用TOPSIS以下几点能帮你加分清晰的流程图在论文中画一个TOPSIS算法流程图包括数据预处理、标准化、赋权、距离计算等步骤。详细的公式与说明列出关键公式如向量归一化、熵权公式、贴近度公式并解释其含义。权重确定的论证花篇幅说明你为什么用某种方法确定权重熵权法、AHP等并展示计算过程或判断矩阵。敏感性分析如前所述对权重或标准化方法进行敏感性分析证明你模型的稳健性或讨论其局限性。结果的可视化可以用条形图展示各方案的最终得分C_i用雷达图展示每个方案在不同指标上的表现与理想解、负理想解的对比。TOPSIS是一个强大而灵活的工具它的价值在于将多维度、多量纲的复杂决策问题转化成一个直观的距离比较问题。掌握其核心思想与实现细节不仅能帮你解决数模竞赛中的评价类问题也能让你在实际工作和生活中面对多种选择时有一个科学、理性的分析框架。最后记住模型是辅助决策的而不是替代决策。模型输出的结果需要结合具体的业务背景和常识进行最终判断。
返回列表