首页
/ 熵权TOPSIS的Python代码

熵权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方法进行多准则决策分析,并获得可靠的分析结果。