第一部分:学会熵权法
第二部分:学会TopSIS
第三部分:基于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的分享