TOPSIS基本概念
TOPSIS (Technique for Order Preference by Similarity to an Ideal Solution )模型中文叫做“逼近理想解排序方法”,是根据评价对象与理想化目标的接近程度进行排序的方法,是一种距离综合评价方法。基本思路是通过假定正、负理想解,测算各样本与正、负理想解的距离,得到其与理想方案的相对贴近度(即距离正理想解越近同时距离负理想解越远),进行各评价对象的优劣排序。具体步骤及概念如下:
step 1: 指标同向化、标准化并得到权重。这部分与熵权法结合,通过熵权法得到权重,避免主观因素影响,得到权重向量W及标准化矩阵P。具体内容可参照综合评价之熵权法,这里不再赘述。
step 2 : 得到加权后的规范化矩阵Z。Z由P与W相乘后得到。
step 3 : 确定正、负理想解。正理想解指各指标都达到样本中最好的值,负理想解指各指标都为样本中最差的值。
step 4 : 计算各样本距离正、负理想解的距离。
step 5 : 计算各评价对象与最优方案的贴近程度。正其中
的取值范围为[0,1],越接近1表明样本评分越好。
2
Python实现
这里使用综合评价之熵权法中的测试数据作为演示。数据中共有4个变量,2036条样本,下面就开始用基于熵权法的TOPSIS计算样本得分。
代码语言:javascript复制import pandas as pdimport numpy as np
#逆向指标标准化def normalization1(data): _range = np.max(data) - np.min(data) return (data - np.min(data)) / _range
#正向指标标准化def normalization2(data): _range = np.max(data) - np.min(data) return (np.max(data) - data) / _range
#熵权法计算权重def entropyWeight(data): P = np.array(data) # 计算熵值 E = np.nansum(-P * np.log(P) / np.log(len(data)), axis=0) # 计算权系数 return (1 - E) / (1 - E).sum()
def topsis(data, weight=None): # 权重 weight = entropyWeight(data) if weight is None else np.array(weight) # 最优最劣方案 Z = pd.DataFrame([(data*weight.T).min(), (data*weight.T).max()], index=['负理想解', '正理想解']) #Z = pd.DataFrame([data.min(), data.max()], index=['负理想解', '正理想解']) # 距离 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['正理想解'] = np.sqrt(((data - Z.loc['正理想解']) ** 2 ).sum(axis=1)) Result['负理想解'] = np.sqrt(((data - Z.loc['负理想解']) ** 2 ).sum(axis=1))
# 综合得分指数 Result['综合得分指数'] = Result['负理想解'] / (Result['负理想解'] Result['正理想解']) Result['排序'] = Result.rank(ascending=False)['综合得分指数']
return Result, Z, weight
if __name__=='__main__': data = pd.read_csv('testdata.csv',sep = ',',encoding='gbk',header=None) data1 = data.copy() data1[0] = normalization1(data1[0]) data1[1] = normalization1(data1[1]) data1[2] = normalization1(data1[2]) data1[3] = normalization1(data1[3]) [result,z1,weight] = topsis(data1)
最终得到的评分结果(部分)、正负理想解和权重如下: