综合评价之TOPSIS模型

2021-01-04 16:05:15 浏览数 (2)

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)

最终得到的评分结果(部分)、正负理想解和权重如下:

0 人点赞