TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

这篇具有很好参考价值的文章主要介绍了TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、指标正向化

1.极小型指标->极大型指标

2.中间型指标->极大型指标

3.区间型指标->极大型指标

二、标准化处理

三、计算得分并归一化(不带权重)

四、计算得分并归一化(带权重)

熵权法

1)判断输入的矩阵是否存在负数

2)计算第j项指标下第i个样本所占的比重,并将其看作相对熵计算中用到的概率

3)计算每个指标的信息熵,并计算信息效用值,并归一化得到每个指标的熵权

五、代码

 5.1 指标正向化

 5.2 标准化处理

 5.3 计算得分并排序(人工赋权重)

 5.4 熵权法

5.5 数据可视化


TOPSIS法是一种常用的综合评价方法,其能充分利用原始数据的信息,其结果能精确反应各评价方案之间的差距。

用TOPSIS法来评定一个人是不是值得恋爱。比如,现在有4个人,他们分别为Terry,xiaofang,smike,jerry.以下为根据他们身边的好朋友对他们的评价得分:

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

简单的评分方法是直接按评价得分高低排名评分:

不过要用修正后的排名,因为评分越高越好

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

但是这样会出现一个问题,可以随便修改得分,只要排名不变,评分也不会改变。

所以,我们不能直接按得分排名评价,要构造计算评分的公式:

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

TOPSIS法步骤如下:

一、指标正向化

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

好友评分是越大(高)越好,这样的指标称为极大型指标(效益型指标)。

恋爱次数是越少(低)越好,这样的指标称为极小型指标(成本型指标)

中间型指标:指标值既不要太大也不要太小,取某特定值最好(如水质量评估 PH 值 )

区间型指标:指标值落在某个区间内最好,例如人的体温在36°~37°这个区间比较好。

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

所以,我们必须的统一指标类型,将所有的指标转化为极大型,即指标正向化。

1.极小型指标->极大型指标

公式:

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

如果所有的元素均为正数,那么也可以使用

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

2.中间型指标->极大型指标

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

举例:

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

3.区间型指标->极大型指标

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

 上面不好理解也可以看下面这个公式

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

二、标准化处理

为了消去不同指标量纲的影响,需要对已经正向化的矩阵进行标准化处理。

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

比如:

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

三、计算得分并归一化(不带权重)

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

归一化之后就可以根据数值大小进行排名

区别归一化和标准化:

归一化的目的:为了让结果更容易解释,对结果有一个更加清晰直观的印象。

标准化的目的:消除量纲的影响。

四、计算得分并归一化(带权重)

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

如何计算权重?

基于熵权法的赋值

熵权法

熵权法是一种客观赋权方法

原理:

指标的变异程度越小,所反映的信息量也越少,其对应的权值也应该越低。

如何度量信息量的大小?

越有可能发生的事情,信息量越少,

越不可能发生的事情,信息量就越多。

怎么衡量事情发生的可能性大小 ?

概率

如何度量信息量的大小?

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

信息熵越大,则它的值能补充的信息量越大,说明这个值已有的信息量越小,所以信息量越小

熵权法计算步骤:

1)判断输入的矩阵是否存在负数

如果存在负数,就要重新标准化到非负区间。

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

2)计算第j项指标下第i个样本所占的比重,并将其看作相对熵计算中用到的概率

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

3)计算每个指标的信息熵,并计算信息效用值,并归一化得到每个指标的熵权

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

五、代码

import numpy as np
import pandas as pd


data = pd.DataFrame(
        {'人均专著': [0.1, 0.2, 0.4, 0.9, 1.2], 
         '生师比': [5, 6, 7, 10, 2], 
         '科研经费': [5000, 6000, 7000, 10000, 400],
         '逾期毕业率': [4.7, 5.6, 6.7, 2.3, 1.8]}, 
          index=['院校' + i for i in list('ABCDE')])

 对五所研究生院进行评价,构造数据如下:

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

 5.1 指标正向化

# 指标正向化
# 结合公式理解代码
# 需要根据题目选择具体的处理方法


# 极小型转为极大型指标
def dataDirection_1(datas, offset=0):
    def normalization(data):
        return 1 / (data + offset)

    return list(map(normalization, datas))


# 中间型指标转为极大型指标
def dataDirection_2(datas, x_min, x_max):
    def normalization(data):
        if data <= x_min or data >= x_max:
            return 0
        elif data > x_min and data < (x_min + x_max) / 2:
            return 2 * (data - x_min) / (x_max - x_min)
        elif data < x_max and data >= (x_min + x_max) / 2:
            return 2 * (x_max - data) / (x_max - x_min)

    return list(map(normalization, datas))

# 区间型指标转为极大型指标
# [x_min, x_max]最佳稳定区间, [x_minimum, x_maximum]容忍区间
def dataDirection_3(datas, x_min, x_max, x_minimum, x_maximum):  
    def normalization(data):
        if data >= x_min and data <= x_max:
            return 1
        elif data <= x_minimum or data >= x_maximum:
            return 0
        elif data > x_max and data < x_maximum:
            return 1 - (data - x_max) / (x_maximum - x_max)
        elif data < x_min and data > x_minimum:
            return 1 - (x_min - data) / (x_min - x_minimum)

    return list(map(normalization, datas))

例题数据处理:

# 极小型指标转为极大型
minimum_list = dataDirection_1(data.loc[:,"逾期毕业率"])
minimum_array = np.array(minimum_list)
minimum_4f = np.round(minimum_array, 6)
print(minimum_4f)

# 区间型指标转为极大型
maximum_list = dataDirection_3(data.loc[:,"生师比"], 5, 6, 2, 12)
maximum_array = np.array(maximum_list)
maximum_4f = np.round(maximum_array, 6)
print(maximum_4f)

结果:
[0.212766 0.178571 0.149254 0.434783 0.555556]
[1.       1.       0.833333 0.333333 0.      ]
# 指标正向化结果
index_Isotropy = pd.DataFrame()
index_Isotropy["人均专著"] = data["人均专著"]
index_Isotropy["生师比"] = maximum_4f
index_Isotropy["科研经费"] = data["科研经费"]
index_Isotropy["逾期毕业率"] = minimum_4f
print(index_Isotropy)

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

 5.2 标准化处理

# 这里采用归一化,数据处于0-1之间,便于可视化
data_normalization = index_Isotropy / np.sqrt((index_Isotropy ** 2).sum())
print(data_normalization)

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

 5.3 计算得分并排序(人工赋权重)

def topsis(data, weight=None):


    # 最优最劣方案(最大值Z^+ 和 最小值)
    Z = pd.DataFrame([data.max(), data.min()], index=['正理想解', '负理想解'])

    # 距离
    weight = entropyWeight(data) if weight is None else np.array(weight)
    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['综合得分指数'] = Result['负理想解'] / (Result['负理想解'] + Result['正理想解'])  
    Result['排序'] = Result.rank(ascending=False)['综合得分指数']

    return Result, Z, weight

# 人工赋权重的结果
weight = [0.2, 0.3, 0.4, 0.1]
Result, Z, weight = topsis(data_normalization, weight)

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

 5.4 熵权法

def entropyWeight(data):
    data = np.array(data)
    # 计算第j个指标下第i个样本所占的比重,相对熵计算中用到的概率
    P = data / data.sum(axis=0)  # 压缩行
    # 计算熵值
    E = np.nansum(-P * np.log(P) / np.log(len(data)), axis=0)
    # 信息效用值
    d = (1 - E)
    # 计算权系数
    W = d / d.sum()
    return W

entropyWeight(data)

结果:
array([0.41803075, 0.14492264, 0.28588943, 0.15115718])

# 将计算出来的权重代入5.3计算就可以

5.5 数据可视化

这里是对原始数据归一化后以及计算出来的正负理想解进行可视化,便于观察比较各院校特征

使用了雷达图

# 把归一化的结果列的顺序改一下,把‘生师比’放第一个,便于下图展示,不改也可以
data_normalization=data_normalization[['生师比','人均专著',  '逾期毕业率', '科研经费']]
data_normalization
from math import pi
import matplotlib.pyplot as plt


# 目标数量
categories = list(data_normalization)[0:]
N = len(categories)

# 角度
angles = [n / float(N) * 2 * pi for n in range(N)]
angles += angles[:1]

# 绘图初始化
plt.figure(dpi=150)
plt.style.use('ggplot')
ax = plt.subplot(111, polar=True)

# 设置第一处
ax.set_theta_offset(pi / 2)  # 设置最上面为0°
ax.set_theta_direction(-1)  # 设置正方形为顺时针

# 添加背景信息
plt.title("研究生院试评估")
plt.xticks(angles[:-1], categories)  # 改变轴标签rotation = 30
plt.xticks(rotation = pi/4,fontsize=6)
ax.set_rlabel_position(30)   # 极径标签显示位置
# ax.set_rgrids(np.arange(0.1,0.9,0.1))
plt.yticks(np.arange(0.1,0.9,0.1), ["0.1", "0.2", "0.3","0.4","0.5","0.6","0.7","0.8"], color="grey", size=5)  # 设置极径标签区间
plt.ylim(0, 0.8)  # 设置极径范围

# 添加数据图

# 第一个
values = data_normalization.loc["院校A"].values.flatten().tolist()
values += values[:1]  # 首尾相连
ax.plot(angles, values, linewidth=1, linestyle='solid', color='#d62728',marker='.',markersize=4,label="院校A")
ax.fill(angles, values, '#d62728', alpha=0.2)  # 填充线条

# 第二个
values = data_normalization.loc["院校B"].values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid',color='#1f77b4',marker='.',markersize=4, label="院校B")
ax.fill(angles, values, '#1f77b4', alpha=0.2)

# 第三个
values = data_normalization.loc["院校C"].values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid', color='#9467bd',marker='.',markersize=4,label="院校C")
ax.fill(angles, values, '#9467bd', alpha=0.2)

# 第四个
values = data_normalization.loc["院校D"].values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid',color='#7f7f7f', marker='.',markersize=4, label="院校D")
ax.fill(angles, values, '#7f7f7f', alpha=0.2)

# 第五个
values = data_normalization.loc["院校E"].values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid',color='#ff7f0e',marker='.',markersize=4, label="院校E")
ax.fill(angles, values, '#ff7f0e', alpha=0.2)

# 最优解
values =Z.loc["正理想解"].values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid',color='#2ca02c',marker='.',markersize=4, label="最优解")
ax.fill(angles, values, '#2ca02c', alpha=0.2) 

# 最劣解
values =Z.loc["负理想解"].values.flatten().tolist()
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid',color='#e377c2',marker='.',markersize=4, label="最劣解")
ax.fill(angles, values, '#e377c2', alpha=0.2) 

# 添加图例
plt.legend(loc='upper right', bbox_to_anchor=(1.5, 1))

# 显示
plt.show()

 可视化结果如下:

TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】

参考资料:

原理部分参考了清风数模视频和一篇博客,具体哪篇之前写的时候忘记下来了

代码部分参考了下面知乎这篇,原理讲的也很好,不过这篇没有雷达图的代码,本文补充了这部分代码

TOPSIS法(优劣解距离法)介绍及 python3 实现 - 知乎 (zhihu.com)文章来源地址https://www.toymoban.com/news/detail-418991.html

到了这里,关于TOPSIS(优劣解距离法)【附Python实现代码及可视化代码】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 02【评价类】模型——TOPSIS法(理想解法、优劣解距离法)

    目录 02【评价类】模型——TOPSIS法(理想解法、优劣解距离法)  一、引述 二、TOPSIS法的应用 2.1 决策矩阵正向化处理 2.1.1 效益型指标(极大型指标) 2.1.2 成本型指标(极小型指标) 2.1.3 区间型指标 2.1.4 中间型指标 2.1.5 问题解决  2.2 正向化矩阵规范化处理 2.3 构造指标的权

    2024年01月23日
    浏览(47)
  • 2023数学建模国赛常用算法-Topsis优劣解距离法

    1.1 概念 TOPSIS 法是一种常用的组内综合评价方法,能充分利用原始数据的信息,其结果能精确地反映各评价方案之间的差距。基本过程为基于归一化后的原始数据矩阵,采用余弦法找出有限方案中的最优方案和最劣方案,然后分别计算各评价对象与最优方案和最劣方案间的距

    2024年02月15日
    浏览(33)
  • Python|30行代码实现微博热榜爬虫(及可视化进阶)

    当你想要跟踪微博的热门话题时,通过编写一个Python爬虫,来获取微博热搜榜单上的实时数据,并将其可视化展示出来,通过邮件或QQ机器人将其推送,亦可以将其存档,用以保留不同时期的舆论热点。 此外,排行榜项目一向是学习Python爬虫时必备的练手项目,通过本项目,

    2024年02月05日
    浏览(49)
  • 【数据分析】中介效应的简介、模型、python代码实现以及数据可视化

    当谈到因果关系时,中介效应是一种非常重要的概念。中介效应发生在一个变量(中介变量)部分地中介了另外两个变量之间的关系。 中介效应发生在以下情况下: 一个变量(中介变量)部分地中介了另外两个变量之间的关系。假设自变量X对因变量Y产生了影响,而这种关系

    2024年02月06日
    浏览(40)
  • python数据可视化显示(附代码)

    Python是一种非常流行的编程语言,具有广泛的应用领域,包括数据可视化。在数据可视化中,Python提供了多种工具来帮助用户创建各种类型的图表、图形和可视化效果。本文将介绍Python数据可视化的基本概念、工具和技术,并提供代码示例以说明如何使用Python进行数据可视化

    2024年02月13日
    浏览(47)
  • 【100天精通Python】Day71:Python可视化_一文掌握Seaborn库的使用《一》_数据分布可视化,数据关系可视化,示例+代码

    目录 1. 数据分布的可视化 1.1 直方图(Histograms) 1.2 核密度估计图(Kernel Density Estimation Plot)

    2024年02月06日
    浏览(50)
  • 几个实用数据可视化图表Python代码!

    可视化是一种方便的观察数据的方式,可以一目了然地了解数据块。我们经常使用柱状图、直方图、饼图、箱图、热图、散点图、线状图等。这些典型的图对于数据可视化是必不可少的。除了这些被广泛使用的图表外,还有许多很好的却很少被使用的可视化方法,这些图有助

    2024年02月09日
    浏览(69)
  • 【100天精通Python】Day72:Python可视化_一文掌握Seaborn库的使用《二》_分类数据可视化,线性模型和参数拟合的可视化,示例+代码

    目录 1. 分类数据的可视化 1.1 类别散点图(Categorical Scatter Plot) 1.2 类别分布图(Categorical Distribution Plot)

    2024年02月08日
    浏览(40)
  • 数据可视化python,绘制饼图,代码和解析

    使用matplotlib.pyplot.pie绘制 (1),该函数的定义如下: matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, hold=None, data=None) 参数说明:

    2024年02月06日
    浏览(46)
  • 【python可视化大屏】使用python实现可拖拽数据可视化大屏

    我在前几期分享了关于爬取weibo评论的爬虫,同时也分享了如何去进行数据可视化的操作。但是之前的可视化都是单独的,没有办法在一个界面上展示的。这样一来呢,大家在看的时候其实是很不方便的,就是没有办法一目了然的看到数据的规律。为了解决这个问题我使用p

    2024年02月03日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包