前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >综合评价之TOPSIS模型

综合评价之TOPSIS模型

作者头像
三猫
发布2021-01-04 16:05:15
1.7K0
发布2021-01-04 16:05:15
举报

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)

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习养成记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档