导读:在之前的文章里我们介绍了综合评价中的熵权法(未看请戳👉综合评价之熵权法),可以帮助我们在实际应用中解决如何客观确定指标权重的问题。今天继续来介绍另一种客观综合评价方法——TOPSIS模型,并且TOPSIS可以与熵权法组合使用。
1、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计算样本得分。
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)ifweight is Noneelsenp.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)['综合得分指数']returnResult, Z, weightif__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)
最终得到的评分结果(部分)、正负理想解和权重如下:
往期推荐: