TOPSIS法(优劣解距离法)介绍及python3实现
⽂章⽬录
TOPSIS法(优劣解距离法)介绍及 python3 实现
转载原⽂:
1 简述
C.L.Hwang 和 K.Yoon 于1981年⾸次提出 TOPSIS (Technique for Order Preference by Similarity to an Ideal Solution)。TOPSIS 法是⼀种常⽤的组内综合评价⽅法,能充分利⽤原始数据的信息,其结果能精确地反映各评价⽅案之间的差距。基本过程为基于归⼀化后的原始数据矩阵,采⽤余弦法出有限⽅案中的最优⽅案和最劣⽅案,然后分别计算各评价对象与最优⽅案和最劣⽅案间的距离,获得各评价对象与最优⽅案的相对接近程度,以此作为评价优劣的依据。该⽅法对数据分布及样本含量没有严格限制,数据计算简单易⾏。
通俗的例⼦:⼩明数学考试 134 分,要怎么知道他的成绩是好还是不好呢?dos编程
基于分布的评价⽅法会观察⼩明的分数位于班级分数的哪个⽔平(如前 5%、前 10%),但这种评价⽅
法只能给出⼀个⽅向的情况。如班上成绩除了最⾼分外,其余都是 134 分,那么⼩明的成绩就是并列的倒数第⼀,但是正向评价给出的结果是前 5%。
  ⽽ TOPSIS 就是出班上最⾼分(假设是 147 分)、最低分(假设是 69 分),然后计算⼩明的分数和这两个分数之间的差距,从⽽得到⾃⼰分数好坏的⼀个客观评价。距离最⾼分越近,那么评价情况越好,距离最低分越近,那么评价情况越糟。
2 TOPSIS过程
⽹上⼤部分资料对此部分均有描述,但不少资料与⽂献原⽂存在较⼤偏差、排版较为混乱,并且没有深⼊思考原理。此部分内容转述外⽹⽂献,并加⼊了笔者⾃⼰的理解。
2.1 指标属性同向化,⼀般选择指标正向化
TOPSIS 法使⽤距离尺度来度量样本差距,使⽤距离尺度就需要对指标属性进⾏同向化处理(若⼀个维度的数据越⼤越好,另⼀个维度的数据越⼩越好,会造成尺度混乱)。通常采⽤成本型指标向效益型指标转化(即数值越⼤评价越⾼,事实上⼏乎所有的评价⽅法都需要进⾏转化),此外,如果需要使⽤雷达图进⾏展⽰,建议此处将所有数据都变成正数。
2.1.1 极⼩型指标:期望指标值越⼩越好(如患病率、死亡率等)java swing项目代码
M为指标 x可能取值的最⼤值
2.1.2 中间型指标:期望指标值既不要太⼤也不要太⼩,适当取中间值最好(如⽔质量评估 PH 值)
其中M为指标 x的可能取值的最⼤值, m为指标 x 的可能取值的最⼩值
guidelines怎么读2.1.3 区间型指标:期望指标的取值最好落在某⼀个确定的区间最好(如体温)
其中 [a,b] 为指标 x的最佳稳定区间, [a*,b*] 为最⼤容忍区间
def dataDirection_1(datas, offset=0):
def normalization(data):
return1/(data + offset)
python在线编辑器python3
return list(map(normalization, datas))
def dataDirection_2(datas, x_min, x_max):
def normalization(data):
if data <= x_min or data >= x_max:
return0
elif data > x_min and data <(x_min + x_max)/2:
return2*(data - x_min)/(x_max - x_min)
elif data < x_max and data >=(x_min + x_max)/2:
return2*(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:
return1
elif data <= x_minimum or data >= x_maximum:
return0
elif data > x_max and data < x_maximum:
return1-(data - x_max)/(x_maximum - x_max)
elif data < x_min and data > x_minimum:
return1-(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 pd
import numpy as np
def 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 = py()
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版本
原⽂链接:
TOPSIS算法步骤
对应MATLAB程序

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。