python实现TOPSIS

最近需要用一下TOPSIS算法,所以学了一下,然后网上搜了一下python代码,但是download下来的代码感觉有一些问题,所以自己基于download下来的代码修改了一下,并且测试了一下。
本文主要是介绍下修改的python TOPSIS代码,至于算法的介绍,给个链接,大家自己花个半小时看下即可,非常容易理解

一、TOPSIS算法介绍

TOPSIS算法介绍,这是网上的一篇博文,写的非常得清晰易懂,而且这个算法本来就简单,就不做过多介绍了,大家自己点开链接看一下就行了。

二、基于博主“XHHP”的python代码的修改后的TOPSIS算法

原博文链接

2.1指标正向化

这一部分和原博文相同,没有修改。输入是一个np.array,返回是正向化后结果。输入的array的每一行是一个样本的各个指标,列数就是指标数,这个和通常的skilearn的输入是相同的。

#极小型指标 -> 极大型指标
def dataDirection_1(datas):         
        return np.max(datas)-datas     #套公式

#中间型指标 -> 极大型指标
def dataDirection_2(datas, x_best):
    temp_datas = datas - x_best
    M = np.max(abs(temp_datas))
    answer_datas = 1 - abs(datas - x_best) / M     #套公式
    return answer_datas
    
#区间型指标 -> 极大型指标
def dataDirection_3(datas, x_min, x_max):
    M = max(x_min - np.min(datas), np.max(datas) - x_max)
    answer_list = []
    for i in datas:
        if(i < x_min):
            answer_list.append(1 - (x_min-i) /M)      #套公式
        elif( x_min <= i <= x_max):
            answer_list.append(1)
        else:
            answer_list.append(1 - (i - x_max)/M)
    return np.array(answer_list)   

case:
一个中间型指标的正向化。
在这里插入图片描述
极小化指标正向化的case。
在这里插入图片描述

2.2正向化矩阵标准化(去除量纲影响)

自己重写了一下这个标准化,输入是一个二维的array,每一行是一个样本,各个列就是各个指标。

def Standard(datas):
    K = np.power(np.sum(pow(datas,2),axis = 0),0.5)
    for i in range(len(K)):
        datas[: , i] = datas[: , i] / K[i]
    return datas 

case:
在这里插入图片描述

2.3计算得分并归一化

之前标准化数据的输出结果作为输入

def Score(sta_data):
    z_max = np.amax(sta_data , axis=0)
    z_min = np.amin(sta_data , axis=0)
    # 计算每一个样本点与最大值的距离
    tmpmaxdist = np.power(np.sum(np.power((z_max - sta_data) , 2) , axis = 1) , 0.5)  # 每个样本距离Z+的距离
    tmpmindist = np.power(np.sum(np.power((z_min - sta_data) , 2) , axis = 1) , 0.5)  # 每个样本距离Z+的距离
    score = tmpmindist / (tmpmindist + tmpmaxdist)
    score = score / np.sum(score)  # 归一化处理
    return score

case:
在这里插入图片描述

2.4将计算得到的得分与源数据一起进行整理,形成dataframe

testdata['score'] = sco
testdata.head(5)

case:
在这里插入图片描述
这样一来,TOPSIS算法就已经全部完成了。

三、代码获取

代码是用Jupyter Notebook写的,放在github里了,需要自己拿下好了。
TOPSIS算法(python实现)

  • 12
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值