熵权法+TopSIS(带权重的TopSIS)(升级版)

第一部分:学会熵权法

数学建模之熵权法-CSDN博客

第二部分:学会TopSIS

TOPSIS法-CSDN博客

第三部分:基于TopSIS整合熵权法

(1)整合位置

(2)更改熵权法代码

因为上述熵权法和TopSIS中用到的基础数据集不一样,所以我们需要在TopSIS数据集上重新写一下熵权法的代码(主要就是用熵权法的得到每个特征标签的权重)。

(只需要把球信息熵到-信息熵冗余度-计算各指标权重 的代码运用基础TopSIS中就可以了)

①补充熵权法1:计算每个指标的信息熵

#补充熵权法1:计算每个指标的信息熵
# 计算概率矩阵
n_rows, n_cols = normalized_data.shape
print(n_rows)#行数,也就是公式里面的n值
print(n_cols)#列数
#先对每一列求和
col_sums = normalized_data.sum(axis=0)
print(col_sums)
#下面这个也就是求pij
p_matrix = normalized_data / col_sums
print(p_matrix)
# 计算信息熵Hj
k = 1.0 / np.log(n_rows)  # 熵计算的常量
entropy = -k * ((p_matrix * np.log(p_matrix + 1e-10)).sum(axis=0))  # 加上1e-10防止log(0)的问题
print("信息熵:\n", entropy)
#print(normalized_data.columns)
# 构建 DataFrame,并将指标作为列名,信息熵作为第二行
entropy_df = pd.DataFrame([entropy], columns=normalized_data.columns)
entropy_df.index = ['信息熵']
# 输出至 Excel 文件
entropy_df.to_excel("附加1信息熵.xlsx")
print("信息熵已保存至 附加1信息熵.xlsx")

②计算信息熵冗余度

#补充熵权法2: 计算信息熵冗余度
redundancy = 1 - entropy
print("信息熵冗余度:\n", redundancy)
# 将冗余度保存到 Excel 文件
redundancy_df = pd.DataFrame([redundancy], columns=normalized_data.columns)
redundancy_df.index = ['冗余度']
redundancy_df.to_excel("附加2信息熵冗余度.xlsx", index=True)
print("信息熵冗余度已保存至 附加2信息熵冗余度.xlsx")

③确定权重

#补充熵权法3: 确定权重
weights = redundancy / redundancy.sum()
print("权重:\n", weights)

# 将权重保存到 Excel 文件
weights_df = pd.DataFrame([weights], columns=normalized_data.columns)
weights_df.index = ['权重']
weights_df.to_excel("附加3权重.xlsx", index=True)
print("权重已保存至 附加3权重.xlsx")

④修改计算距离的参数化计算方式(带权重计算)

# 计算每行与最大值和最小值的距离(核心修改的部分)
distances_to_max = np.sqrt((((normalized_data - max_values) ** 2)*weights).sum(axis=1))
distances_to_min = np.sqrt((((normalized_data - min_values) ** 2)*weights).sum(axis=1))

⑤完整"熵权法+TopSIS"pycharm代码

import pandas as pd
import numpy as np
# step(0):读取数据
data = pd.read_excel('Before.xlsx')
data.set_index('产品', inplace=True)  # 设置产品列为索引
print(data)

# Step (1): 正向化处理
# 极小型指标转换(假设成本是极小型指标)
data['成本'] = data['成本'].max() - data['成本']

# 中间型指标转换(适合度,最佳值为7)
X_best = 7
M = max(abs(data['适合度'] - X_best))
data['适合度'] = 1 - abs(data['适合度'] - X_best) / M

# 区间型指标转换(温度,最佳区间为[35, 37])
a, b = 35, 37
M = max(a - data['温度'].min(), data['温度'].max() - b)
data['温度'] = data['温度'].apply(lambda x: 1 - (a - x) / M if x < a else (1 if a <= x <= b else 1 - (x - b) / M))

print("正向化后的数据:\n", data)
# 将正向化后的数据保存到 Excel 文件
data.to_excel('正向化.xlsx')
print("正向化后的数据已保存至 正向化.xlsx")
# Step (2): 标准化
# 使用欧几里得距离法进行标准化
normalized_data = data.apply(lambda x: x / np.sqrt((x**2).sum()), axis=0)
print("标准化后的数据:\n", normalized_data)
normalized_data.to_excel('标准化.xlsx')
print("标准化后的数据已保存至 标准化.xlsx")
#补充熵权法1:计算每个指标的信息熵
# 计算概率矩阵
n_rows, n_cols = normalized_data.shape
print(n_rows)#行数,也就是公式里面的n值
print(n_cols)#列数
#先对每一列求和
col_sums = normalized_data.sum(axis=0)
print(col_sums)
#下面这个也就是求pij
p_matrix = normalized_data / col_sums
print(p_matrix)
# 计算信息熵Hj
k = 1.0 / np.log(n_rows)  # 熵计算的常量
entropy = -k * ((p_matrix * np.log(p_matrix + 1e-10)).sum(axis=0))  # 加上1e-10防止log(0)的问题
print("信息熵:\n", entropy)
#print(normalized_data.columns)
# 构建 DataFrame,并将指标作为列名,信息熵作为第二行
entropy_df = pd.DataFrame([entropy], columns=normalized_data.columns)
entropy_df.index = ['信息熵']
# 输出至 Excel 文件
entropy_df.to_excel("附加1信息熵.xlsx")
print("信息熵已保存至 附加1信息熵.xlsx")

#补充熵权法2: 计算信息熵冗余度
redundancy = 1 - entropy
print("信息熵冗余度:\n", redundancy)
# 将冗余度保存到 Excel 文件
redundancy_df = pd.DataFrame([redundancy], columns=normalized_data.columns)
redundancy_df.index = ['冗余度']
redundancy_df.to_excel("附加2信息熵冗余度.xlsx", index=True)
print("信息熵冗余度已保存至 附加2信息熵冗余度.xlsx")

#补充熵权法3: 确定权重
weights = redundancy / redundancy.sum()
print("权重:\n", weights)

# 将权重保存到 Excel 文件
weights_df = pd.DataFrame([weights], columns=normalized_data.columns)
weights_df.index = ['权重']
weights_df.to_excel("附加3权重.xlsx", index=True)
print("权重已保存至 附加3权重.xlsx")

# Step (3): 计算得分
# ① 计算每一列的最大值和最小值
# 计算每列的最大值和最小值
max_values = normalized_data.max()
min_values = normalized_data.min()
# 将最大值和最小值合并成一个新的 DataFrame
extreme_values = pd.DataFrame([max_values, min_values], index=['最大值', '最小值'])
# 显示最大值和最小值表格
print(extreme_values)
# 将结果保存到 Excel 文件
extreme_values.to_excel("最大最小值.xlsx", index=True)
print("最大值和最小值已保存至 最大最小值.xlsx")

# ② 计算每一行的每个元素与最大值、最小值的距离
# 计算每行与最大值和最小值的距离(核心修改的部分)
distances_to_max = np.sqrt((((normalized_data - max_values) ** 2)*weights).sum(axis=1))
distances_to_min = np.sqrt((((normalized_data - min_values) ** 2)*weights).sum(axis=1))
# 将距离添加到数据框中
normalized_data['每行与最大值的距离'] = distances_to_max
normalized_data['每行与最小值的距离'] = distances_to_min
# 打印结果并保存到 Excel 文件
print("添加距离后的数据:\n", normalized_data)
normalized_data.to_excel("距离计算结果.xlsx", index=True)
print("每行与最大值和最小值的距离已保存至 距离计算结果.xlsx")
# ③ 计算每个评价对象的总分数(未归一化)
scores = distances_to_min / (distances_to_min + distances_to_max)
normalized_data['未进行归一化的总分数'] = scores

# 打印结果并保存到 Excel 文件
print("未进行归一化的总分数:\n", scores)
normalized_data.to_excel("未进行归一化的总分数.xlsx", index=True)
print("未进行归一化的总分数计算结果已保存至 未进行归一化的总分数.xlsx")

# ④ 归一化(这里分数已经是归一化的,因为距离计算时除以了总距离)
# 将最终得分添加到原始数据表
scores2 = scores / scores.sum()
normalized_data['进行归一化的总分数'] = scores2

# 打印结果并保存到 Excel 文件
print("进行归一化的总分数:\n", scores2)
normalized_data.to_excel("进行归一化的总分数.xlsx", index=True)
print("进行归一化的总分数计算结果已保存至 进行归一化的总分数.xlsx")

第四部分:资源获取

通过网盘分享的文件:TopSISAndShangQuan.zip
链接: https://pan.baidu.com/s/1-HbiMkhhtsv0yYZPC8d4KQ?pwd=qagq 提取码: qagq
--来自百度网盘超级会员v5的分享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

还不秃顶的计科生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值