熵权TOPSIS的Python代码
2025-08-26 01:00:23作者:平淮齐Percy
适用场景
熵权TOPSIS(Technique for Order Preference by Similarity to Ideal Solution)是一种经典的多准则决策分析方法,广泛应用于各种决策场景:
科研学术领域:
- 学术论文中的综合评价研究
- 科研项目评估与选择
- 学术成果质量评价
商业决策应用:
- 供应商选择与评估
- 投资项目决策分析
- 产品方案优选
- 市场策略评估
工程与技术领域:
- 技术方案比选
- 设备选型决策
- 工艺参数优化
- 系统性能评价
管理决策支持:
- 人才选拔与评价
- 绩效考核体系
- 风险评估与管理
- 资源配置优化
该方法特别适用于需要综合考虑多个评价指标、且各指标权重需要客观确定的复杂决策场景。
适配系统与环境配置要求
系统要求
- 操作系统:Windows 7/10/11、macOS 10.14+、Linux Ubuntu 16.04+
- 处理器:双核1.8GHz及以上
- 内存:4GB RAM及以上
- 存储空间:至少500MB可用空间
软件环境
- Python版本:Python 3.6及以上版本
- 必要依赖库:
- NumPy 1.19.0+(数值计算核心)
- Pandas 1.1.0+(数据处理与分析)
- SciPy 1.5.0+(科学计算工具)
- Matplotlib 3.3.0+(数据可视化)
开发环境推荐
-
IDE选择:
- Jupyter Notebook/JupyterLab(交互式开发)
- PyCharm(专业Python开发)
- VS Code with Python扩展(轻量级开发)
-
虚拟环境:建议使用conda或virtualenv创建独立环境
资源使用教程
安装与配置
首先安装必要的依赖库:
pip install numpy pandas scipy matplotlib
基本使用步骤
1. 数据准备 准备决策矩阵,行代表方案,列代表评价指标:
import numpy as np
import pandas as pd
# 示例决策矩阵
decision_matrix = np.array([
[80, 90, 85, 70],
[75, 85, 90, 80],
[85, 80, 75, 90],
[70, 95, 80, 85]
])
2. 数据标准化 对原始数据进行标准化处理:
def normalize_matrix(matrix):
# 向量归一化
norm_matrix = matrix / np.sqrt(np.sum(matrix**2, axis=0))
return norm_matrix
3. 熵权计算 计算各指标的熵值和权重:
def calculate_entropy_weight(norm_matrix):
# 计算概率矩阵
p_matrix = norm_matrix / np.sum(norm_matrix, axis=0)
# 计算熵值
k = 1 / np.log(norm_matrix.shape[0])
entropy = -k * np.sum(p_matrix * np.log(p_matrix + 1e-10), axis=0)
# 计算权重
weights = (1 - entropy) / np.sum(1 - entropy)
return weights
4. TOPSIS计算 实现完整的TOPSIS算法:
def topsis_method(matrix, weights, benefit_attributes=None):
# 标准化决策矩阵
norm_matrix = normalize_matrix(matrix)
# 加权标准化矩阵
weighted_matrix = norm_matrix * weights
# 确定正理想解和负理想解
if benefit_attributes is None:
benefit_attributes = [True] * matrix.shape[1]
ideal_best = np.array([
np.max(weighted_matrix[:, i]) if benefit_attributes[i]
else np.min(weighted_matrix[:, i])
for i in range(matrix.shape[1])
])
ideal_worst = np.array([
np.min(weighted_matrix[:, i]) if benefit_attributes[i]
else np.max(weighted_matrix[:, i])
for i in range(matrix.shape[1])
])
# 计算距离
distance_best = np.sqrt(np.sum((weighted_matrix - ideal_best)**2, axis=1))
distance_worst = np.sqrt(np.sum((weighted_matrix - ideal_worst)**2, axis=1))
# 计算相对贴近度
closeness = distance_worst / (distance_best + distance_worst)
return closeness
5. 完整流程示例
# 完整使用示例
def entropy_topsis_analysis(data_matrix, benefit_flags):
# 数据标准化
norm_data = normalize_matrix(data_matrix)
# 计算熵权
weights = calculate_entropy_weight(norm_data)
print("各指标权重:", weights)
# TOPSIS分析
scores = topsis_method(data_matrix, weights, benefit_flags)
# 排序结果
rankings = np.argsort(-scores) + 1
return scores, rankings
# 使用示例
data = np.array([[80, 90, 85], [75, 85, 90], [85, 80, 75]])
benefit_flags = [True, True, True] # 所有指标都是效益型
scores, rankings = entropy_topsis_analysis(data, benefit_flags)
print("各方案得分:", scores)
print("方案排名:", rankings)
常见问题及解决办法
1. 数据标准化问题
问题:数据标准化后出现NaN值 解决方法:
- 检查原始数据是否包含零值或负值
- 添加极小值避免除零错误:
matrix + 1e-10
- 使用不同的标准化方法(如min-max标准化)
2. 熵值计算异常
问题:熵值计算出现数学错误 解决方法:
- 确保概率值在(0,1]范围内
- 添加极小值避免log(0):
np.log(p + 1e-10)
- 检查数据是否全部为相同值
3. 权重计算不合理
问题:某些指标权重为0或接近0 解决方法:
- 检查该指标数据是否变异过小
- 考虑合并相关性过高的指标
- 人工调整权重分配
4. 距离计算异常
问题:欧氏距离计算出现异常值 解决方法:
- 检查数据维度是否一致
- 验证加权矩阵的计算正确性
- 使用其他距离度量方法(如曼哈顿距离)
5. 性能优化建议
大规模数据处理:
- 使用NumPy向量化操作替代循环
- 分块处理大型矩阵
- 考虑使用稀疏矩阵存储
内存管理:
- 及时释放不再使用的变量
- 使用生成器处理流式数据
- 优化数据类型减少内存占用
6. 结果解释与验证
结果验证方法:
- 与专家打分结果对比
- 使用交叉验证方法
- 进行敏感性分析
结果可视化:
- 绘制权重分布图
- 显示方案得分雷达图
- 制作排名对比图表
通过以上方法和技巧,您可以有效地使用熵权TOPSIS方法进行多准则决策分析,并获得可靠的分析结果。