数学建模 TOPSIS-优劣解距离法python代码(简单示例)

首先我们需要知道的是TOPSIS的基本算法和公式,在这里我不做详细介绍,大家可以到专业书籍上查找关于TOPSIS原理的具体介绍和推导过程
我总结的TOPSIS算法过程为
1.数据引入
2.数据类型判断
3.数据标准化处理
4.数据赋权处理
5.寻找正理想解和负理想解(即每列项最大值和每项最小值)
6.分别计算每项数据与正理想解和负理想解的距离
7.用与负理想解的距离除以数据到正、负理想解的距离算出最终的评价标准值
8.根据评价标准值排序

如下所示是我们的测试数据:以“优劣解距离法_测试数据.xlsx”命名

(注:相关的代码和数据在文章最后会给出链接)

 代码如下:

import pandas as pd
data = pd.read_excel(r'优劣解距离法_测试数据.xlsx')
print(data.shape[0])
print(data.shape[1])
# print(data.loc[0][0])
print(data)
print('max',data['效益型'].max())
#数据处理:
#标准0-1变换:

#1.效益型:
max = data['效益型'].max()
min = data['效益型'].min()
for i in range(data.shape[0]):
    data.loc[i,'效益型'] = (data.loc[i][0]-min)/(max-min)
print(data)

#2.成本型:
max = data['成本型'].max()
min = data['成本型'].min()
for i in range(data.shape[0]):
    data.loc[i,'成本型'] = (max-data.loc[i][1])/(max-min)
print(data)

#3.区间型
#最佳区间长度:[5,6]
perfect_lowwer = 5
perfect_upper = 6
#可容忍区间长度[2,12]
unbearable_lowwer = 2
unbearable_upper = 12
for i in range(data.shape[0]):
    if data.loc[i][2]  >=unbearable_lowwer and data.loc[i][2]<perfect_lowwer:
        data.loc[i,'区间型'] = 1-((perfect_lowwer-data.loc[i][2])/(perfect_lowwer-unbearable_lowwer))
    elif data.loc[i][2]>=perfect_lowwer and data.loc[i][2]<=perfect_upper:
        data.loc[i,'区间型'] = 1
    elif data.loc[i][2]>=perfect_upper and data.loc[i][2]<=unbearable_upper:
        data.loc[i,'区间型'] = 1-((data.loc[i][2]-perfect_upper)/(unbearable_upper-perfect_upper))
    else:
        data.loc[i,'区间型'] = 0
print(data)

#接下来给各个判断标准赋上权重值,比如我们这里以[0.2,0.5,0.3]作为我们的权重值
for i in range(data.shape[0]):
    data.loc[i,'效益型'] = 0.2*data.iloc[i]['效益型']
    data.loc[i,'成本型'] = 0.5*data.iloc[i]['成本型']
    data.loc[i,'区间型'] = 0.3*data.iloc[i]['区间型']
print(data)
#至此,数据处理基本完成

#计算正理想解和负理想解
max_0 = data['效益型'].max()
max_1 = data['成本型'].max()
max_2 = data['区间型'].max()
min_0 = data['效益型'].min()
min_1 = data['成本型'].min()
min_2 = data['区间型'].min()

#更新为每一项与正理想解,负理想解之间的距离
s_positive = []
s_negative = []
for i in range(data.shape[0]):
    s_positive.append(((data.loc[i][0]-max_0)**2 + (data.loc[i][1]-max_1)**2 + (data.loc[i][2]-max_2)**2)**0.5)
for i in range(data.shape[0]):
    s_negative.append(((data.loc[i][0] - min_0) ** 2 + (data.loc[i][1] - min_1) ** 2 + (data.loc[i][2] - min_2) ** 2) ** 0.5)

#计算最总评价值judge_list
judge_list = []
for i in range(data.shape[0]):
    judge_list.append(s_negative[i]/(s_negative[i]+s_positive[i]))
print(judge_list)
index_list=[i[0] for i in sorted(enumerate(judge_list), key=lambda x:x[1])] #根据f数值大小对f的索引进行排序
print(index_list)  #得到最终结果

代码及数据文件如下

链接:https://pan.baidu.com/s/1Sewq56NZyubd5-QnvYPj_w
提取码:mv28
--来自百度网盘超级会员V2的分享

以下是使用熵权TOPSISPython代码示例: ```python import numpy as np import pandas as pd # 计算熵权 def entropyWeight(data): p = data / data.sum() entropy = (-p * np.log2(p)).sum() weight = (1 - entropy) / (len(data) - 1) return weight # 极小型指标转为极大型 def dataDirection_1(data): return 1 / data # 区间型指标转为极大型 def dataDirection_3(data, a, b, c, d): return (data - a) / (b - a) * (d - c) + c # 计算得分并排序(人工赋权重) def topsis(data, weight=None): Z = pd.DataFrame(\[data.max(), data.min()\], index=\['正理想', '负理想'\]) # 最优最劣方案(最大值Z^+ 和 最小值) 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 # 例题数据处理 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')\]) # 极小型指标转为极大型 minimum_list = dataDirection_1(data.loc\[:, "逾期毕业率"\]) minimum_array = np.array(minimum_list) minimum_4f = np.round(minimum_array, 6) # 区间型指标转为极大型 maximum_list = dataDirection_3(data.loc\[:, "生师比"\], 5, 6, 2, 12) maximum_array = np.array(maximum_list) maximum_4f = np.round(maximum_array, 6) # 指标正向化结果 index_Isotropy = pd.DataFrame() index_Isotropy\["人均专著"\] = data\["人均专著"\] index_Isotropy\["生师比"\] = maximum_4f index_Isotropy\["科研经费"\] = data\["科研经费"\] index_Isotropy\["逾期毕业率"\] = minimum_4f # 人工赋权重的结果 weight = \[0.2, 0.3, 0.4, 0.1\] Result, Z, weight = topsis(index_Isotropy, weight) ``` 这段代码实现了熵权TOPSIS的计算过程,包括指标转换、熵权计算、得分计算和排序。最终的结果存储在`Result`,最优最劣方案存储在`Z`,权重存储在`weight`。 #### 引用[.reference_title] - *1* *2* *3* [TOPSIS(优劣距离)【附Python实现代码及可视化代码】](https://blog.csdn.net/Michale_L/article/details/127832863)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值