首页 > 编程知识 正文

TOPSIS法优劣解距离法介绍及 python3 实现,topsis法优劣解距离法

时间:2023-05-04 02:45:30 阅读:205211 作者:1781

文章目录 TOPSIS法(优劣解距离法)介绍及 python3 实现1 简述2 TOPSIS过程2.1 指标属性同向化,一般选择指标正向化2.1.1 极小型指标:期望指标值越小越好(如患病率、死亡率等)2.1.2 中间型指标:期望指标值既不要太大也不要太小,适当取中间值最好(如水质量评估 PH 值)2.1.3 区间型指标:期望指标的取值最好落在某一个确定的区间最好(如体温) 2.2 构造归一化初始矩阵2.3 确定最优方案和最劣方案2.4 计算各评价对象与最优方案、最劣方案的接近程度2.5 计算各评价对象与最优方案的贴近程度Cj2.6 根据Ci大小进行排序,给出评价结果2.7 TOPSIS法算法程序 补充:不同的算法步骤MATLAB版本TOPSIS算法步骤对应MATLAB程序

TOPSIS法(优劣解距离法)介绍及 python3 实现

转载原文:
https://zhuanlan.zhihu.com/p/37738503

1 简述

C.L.Hwang 和 K.Yoon 于1981年首次提出 TOPSIS (Technique for Order Preference by Similarity to an Ideal Solution)。TOPSIS 法是一种常用的组内综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。基本过程为基于归一化后的原始数据矩阵,采用余弦法找出有限方案中的最优方案和最劣方案,然后分别计算各评价对象与最优方案和最劣方案间的距离,获得各评价对象与最优方案的相对接近程度,以此作为评价优劣的依据。该方法对数据分布及样本含量没有严格限制,数据计算简单易行。

通俗的例子:fqdbmh数学考试 134 分,要怎么知道他的成绩是好还是不好呢?

基于分布的评价方法会观察fqdbmh的分数位于班级分数的哪个水平(如前 5%、前 10%),但这种评价方法只能给出一个方向的情况。如班上成绩除了最高分外,其余都是 134 分,那么fqdbmh的成绩就是并列的倒数第一,但是正向评价给出的结果是前 5%。
  而 TOPSIS 就是找出班上最高分(假设是 147 分)、最低分(假设是 69 分),然后计算fqdbmh的分数和这两个分数之间的差距,从而得到自己分数好坏的一个客观评价。距离最高分越近,那么评价情况越好,距离最低分越近,那么评价情况越糟。

2 TOPSIS过程

网上大部分资料对此部分均有描述,但不少资料与文献原文存在较大偏差、排版较为混乱,并且没有深入思考原理。此部分内容转述外网文献,并加入了笔者自己的理解。

2.1 指标属性同向化,一般选择指标正向化

TOPSIS 法使用距离尺度来度量样本差距,使用距离尺度就需要对指标属性进行同向化处理(若一个维度的数据越大越好,另一个维度的数据越小越好,会造成尺度混乱)。通常采用成本型指标向效益型指标转化(即数值越大评价越高,事实上几乎所有的评价方法都需要进行转化),此外,如果需要使用雷达图进行展示,建议此处将所有数据都变成正数。

2.1.1 极小型指标:期望指标值越小越好(如患病率、死亡率等)


M为指标 x可能取值的最大值

2.1.2 中间型指标:期望指标值既不要太大也不要太小,适当取中间值最好(如水质量评估 PH 值)


其中M为指标 x的可能取值的最大值, m为指标 x 的可能取值的最小值

2.1.3 区间型指标:期望指标的取值最好落在某一个确定的区间最好(如体温)


其中 [a,b] 为指标 x的最佳稳定区间, [a*,b*] 为最大容忍区间

def dataDirection_1(datas, offset=0):def normalization(data):return 1 / (data + offset)return list(map(normalization, datas))def dataDirection_2(datas, x_min, x_max):def normalization(data):if data <= x_min or data >= x_max:return 0elif data > x_min and data < (x_min + x_max) / 2:return 2 * (data - x_min) / (x_max - x_min)elif data < x_max and data >= (x_min + x_max) / 2:return 2 * (x_max - data) / (x_max - x_min)return list(map(normalization, datas))def dataDirection_3(datas, x_min, x_max, x_minimum, x_maximum):def normalization(data):if data >= x_min and data <= x_max:return 1elif data <= x_minimum or data >= x_maximum:return 0elif data > x_max and data < x_maximum:return 1 - (data - x_max) / (x_maximum - x_max)elif data < x_min and data > x_minimum:return 1 - (x_min - data) / (x_min - x_minimum)return list(map(normalization, datas)) 2.2 构造归一化初始矩阵

设共有 [公式] 个待评价对象,每个对象都有 [公式] 个指标(属性),则原始数据矩阵构造为:

构造加权规范矩阵,属性进行向量规范化,即每一列元素都除以当前列向量的范数(使用余弦距离度量)

由此得到归一化处理后的标准化矩阵 Z :

2.3 确定最优方案和最劣方案

最优方案Z+由 [Z中每列元素的最大值构成:

最劣方案 Z- 由 Z中每列元素的最小值构成:

2.4 计算各评价对象与最优方案、最劣方案的接近程度


其中 wj为第 j 个属性的权重(重要程度),指标权重建议根据实际确定或使用专家评估方法。在本文第 4 部分也提供了两种常用的确定权重的方法及简要分析。

2.5 计算各评价对象与最优方案的贴近程度Cj


2.6 根据Ci大小进行排序,给出评价结果 2.7 TOPSIS法算法程序

使用的编程语言:python3.7.1 (Anaconda3)

使用的编辑器:Sublime Text 3

使用的模块:pandas、numpy

import pandas as pdimport numpy as npdef topsis(data, weight=None):# 归一化data = data / np.sqrt((data ** 2).sum())# 最优最劣方案Z = pd.DataFrame([data.min(), data.max()], index=['负理想解', '正理想解'])# 距离weight = entropyWeight(data) if weight is None else np.array(weight)Result = data.copy()Result['正理想解'] = np.sqrt(((data - Z.loc['正理想解']) ** 2 * weight).sum(axis=1))Result['负理想解'] = np.sqrt(((data - Z.loc['负理想解']) ** 2 * weight).sum(axis=1))# 综合得分指数Result['综合得分指数'] = Result['负理想解'] / (Result['负理想解'] + Result['正理想解'])Result['排序'] = Result.rank(ascending=False)['综合得分指数']return Result, Z, weight

topsis 函数需要输入:
data:原始数据,pandas.DataFrame 类型
weight:权系数, 默认使用熵权法定权. 也可以传入指定权重列表. (熵权法代码见下文)

补充:不同的算法步骤MATLAB版本

原文链接:https://blog.csdn.net/CSDN___CSDN/article/details/81042527

TOPSIS算法步骤


对应MATLAB程序 说明:有‘%’的地方可灵活变换数值a=[1 2 3;4 5 6;7 8 9];%【】c=sqrt(sum(a.*a));for i=1:3%【[ma,na]=size(A); %ma为A矩阵的行数,na为A矩阵的列数】for j=1:3%【】d(i,j)=a(i,j)/c(j)%【d为规范化决策矩阵】endendw=[1 2 3];%【】for i=1:3%【】for j=1:3%【】c(i,j)=d(i,j)*w(j)%【c为加权矩阵】endendcmax=max(c);cmin=min(c);for i=1:3%【】c1=c(i,:)-cmaxs1(i)=norm(c1)c2=c(i,:)-cmins2(i)=norm(c2)T(i)=s2(i)/(s1(i)+s2(i))end

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。