TOPSIS&熵权法

import numpy as np
import pandas as pd
pd.set_option('display.max_columns',1000)
pd.set_option('display.width',1000)


def datadirection_min(datas):  #小变大
    def normalization(data):
        return 1/data
    return list(map(normalization,datas))


data=pd.DataFrame({"GDP-growing":[0.1,0.2,0.4,0.9,1.2],
                   "city-people":[1,1,0.833333,0.333333,0],
                   "high-edu":[5000,6000,7000,10000,400],
                   "enger-num":[0.4,0.6,0.7,1.4,2.4],
                   "gang-dev":[29.3,52.9,20.4,39.5,29.4]},
                   columns=['GDP-growing','city-people','high-edu','enger-num','gang-dev'])

#归一化
data = data / np.sqrt((data ** 2).sum())
#li=归一化的data阵
li=np.array(data)
def topsis(data,weight=None):
    # 归一化
    data = data / np.sqrt((data ** 2).sum())
    #最优最劣方案
    Z = pd.DataFrame([data.max(), data.min()], index=['D+', 'D-'])
    Res=data.copy()
    Res['D+'] = np.sqrt(((data - Z.loc['D+']) ** 2 * weight).sum(axis=1))
    Res['D-'] = np.sqrt(((data - Z.loc['D-']) ** 2 * weight).sum(axis=1))
    Res['C'] = Res['D-'] / (Res['D-'] + Res['D+'])
    Res['Rank'] = Res.rank(ascending=False)['C']
    print(Res.head())


def get_weight(li):
    li = (li - li.min()) / (li.max() - li.min()) + 0.000000000001
    m, n = li.shape
    # m,n为矩阵行和列数
    k = 1 / np.log(m)
    yij = li.sum(axis=0)
    pij = li / yij
    test = pij * np.log(pij)
    test = np.nan_to_num(test)
    ej = -k * (test.sum(axis=0))
    # 计算每种指标的信息熵
    wi = (1 - ej) / np.sum(1 - ej)
    print(wi)
    return wi

topsis(data,weight=get_weight(li))

这是博主竞赛的代码,大家理性参考,可能有差错)

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yifanan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值