基于熵权法的topsis综合评价方法怎么做
时间: 2023-12-15 19:06:07 浏览: 189
基于熵权法的TOPSIS综合评价方法步骤如下:
1. 确定评价指标及其权重。
2. 将指标归一化,使得所有指标都在0和1之间。具体方法是对于每个指标,先计算出所有样本在该指标上的得分,然后将所有得分除以该指标的最大得分,即可得到该指标上的归一化得分。
3. 计算熵值和权重熵值。对于每个指标,计算出所有样本在该指标上的归一化得分的熵值,然后将所有指标的熵值加权平均即可得到熵值。接着,计算每个指标的权重熵值,即该指标的熵值除以总熵值。
4. 计算每个样本的综合得分。对于每个样本,将其在每个指标上的归一化得分乘以该指标的权重熵值,然后将所有指标的乘积加和即可得到该样本的综合得分。
5. 对所有样本的综合得分进行排序,得到排名最高的样本即为最优解。
以上就是基于熵权法的TOPSIS综合评价方法的具体步骤。在实际应用中,还需要根据具体情况进行参数的设定和结果的解释。
相关问题
python做熵权topsis代码评价指标
### Python 熵权 TOPSIS 实现
#### 代码实现
下面展示了一个完整的基于 Numpy 和 Pandas 的熵权 TOPSIS 方法的 Python 实现:
```python
import numpy as np
import pandas as pd
def entropy_weight(data):
"""计算熵权"""
p = data / data.sum(axis=0)
e = -(p * np.log(p)).sum() / np.log(len(data))
w = (1 - e).sum()
return w
def topsis(df, weights=None, is_benefit=True):
"""
:param df: 输入的数据框,每一列代表一个指标
:param weights: 权重列表,默认为 None 表示使用熵权法自动计算权重
:param is_benefit: 列表表示各指标是否为效益型(True)还是成本型(False),默认全为 True
"""
# 数据标准化
norm_df = (df - df.min()) / (df.max() - df.min())
if not isinstance(weights, list): # 如果未提供权重,则通过熵权法求解
weights = entropy_weight(norm_df)
# 加权后的矩阵
weighted_matrix = norm_df.mul(weights, axis=1)
# 极大值和极小值理想解
positive_ideal_solution = weighted_matrix.max().values
negative_ideal_solution = weighted_matrix.min().values
# 调整正负理想解方向
for i in range(len(is_benefit)):
if not is_benefit[i]:
temp = positive_ideal_solution[i]
positive_ideal_solution[i] = negative_ideal_solution[i]
negative_ideal_solution[i] = temp
# 计算距离并归一化得分
distance_to_positive = ((weighted_matrix.values - positive_ideal_solution)**2).sum(axis=1)**0.5
distance_to_negative = ((weighted_matrix.values - negative_ideal_solution)**2).sum(axis=1)**0.5
score = distance_to_negative / (distance_to_positive + distance_to_negative)
result = pd.DataFrame({
'Score': score,
'Ranking': (-score).rank(method='min')
})
return result.sort_values('Ranking'), weights
if __name__ == '__main__':
# 示例数据集
data = {
"Cost": [897, 634, 567],
"Profit": [12, 15, 10],
"Time": [10, 12, 8]
}
df = pd.DataFrame(data=data)
evaluation_result, calculated_weights = topsis(
df=df,
is_benefit=[False, True, False]) # Cost and Time are cost-type indicators; Profit is benefit type.
print(evaluation_result)
```
此段程序实现了熵权 TOPSIS 法的核心逻辑,并能够处理不同类型的评价指标[^2][^4]。
#### 性能评估标准
对于 Topsis 结果的质量评估主要依赖以下几个方面:
- **稳定性**: 当输入数据发生微小变化时,最终排名应保持相对稳定。这可以通过多次运行算法并对结果的一致性进行检验来验证。
- **合理性**: 排名应当符合常识判断或领域专家的意见。例如,在企业绩效评估场景下,高盈利能力的企业应该获得较高的综合评分。
- **敏感度分析**: 测试不同的参数设置(如权重分配方式)对总体结论的影响程度。如果改变某些假设条件后得到截然相反的结果,则说明该模型可能存在问题。
- **可解释性**: 模型输出不仅限于简单的分数排序,还应对每个因素的重要性给予清晰阐述,便于使用者理解决策依据。
熵权topsis 面板
### 基于熵权法和TOPSIS方法的数据分析与决策支持
#### 熵权法概述
熵权法是一种用于确定指标权重的方法,该方法通过计算各评价指标的差异系数来决定各个指标的重要性。当某个指标的变化幅度较小时,则认为此指标提供的有效信息较少;反之则较多。因此,在多属性决策问题中应用熵权法可以更科学合理地分配不同属性之间的相对重要度[^1]。
#### TOPSIS方法简介
理想解排序技术(TOPSIS),即逼近理想方案排序法,是常用的一种多目标决策分析工具。它假设存在两个虚拟的理想型备选方案——正理想解(最优)以及负理想解(最劣), 并据此衡量实际待评估对象到这两个极端的距离远近来进行优劣评判。具体而言, 就是要找出距离正理想最近而离负理想最远的那个选项作为最佳选择[^2]。
#### 结合熵权法改进后的TOPSIS流程说明
为了克服传统TOPSIS可能存在的主观随意性缺陷,引入熵权理论对其进行优化调整:
- **标准化处理原始数据矩阵**:考虑到各项特征可能存在不同的量纲单位影响比较效果,需先做无量纲化转换;
- **构建加权规范化决策矩阵**:利用熵权公式求得每列属性各自的客观权重向量W=(w₁,w₂,...,wm)^T ,再乘以原表得到新的评分体系;
- **确定理想点坐标位置** :分别选取最大最小值构成P* 和 N*, 表征正面负面参照系;
- **计算欧氏几何间距D⁺/D⁻** : 对应每个参评实体i 计算至上述两极间的直线长度 d⁺_i /d⁻_i ;
- **得出综合贴近度C_i** : 定义 C_i=d⁻_i/(d⁺_i+d⁻_i ), 贴近度越大表示越接近完美状态。
- **按降序排列并择优选定最终结果**
```python
import numpy as np
from math import log
def entropy_weight(data):
"""Calculate the weight of each criterion using Entropy Method."""
data = np.array(data).astype(float)
p = data / data.sum(axis=0)
# Calculate entropy value for each column (criterion)
e_j = -(p * np.log(p)).sum(axis=0)/log(len(data))
# Get difference coefficient and then calculate weights
w = (1-e_j)/(len(e_j)-np.sum(e_j))
return w.tolist()
def topsis_decision(matrix, benefit_criteria=True):
"""
Perform Topsis analysis on given matrix with optional specification
whether criteria are beneficial or not.
"""
weights = entropy_weight(matrix.T)
norm_matrix = []
for i in range(len(matrix)):
row_sum_sq = sum([pow(x, 2) for x in matrix[i]])
norm_row = [float(x)/row_sum_sq**(0.5) for x in matrix[i]]
norm_matrix.append(norm_row)
weighted_norm_mat = [[norm_matrix[j][k]*weights[k] for k in range(len(weights))]for j in range(len(norm_matrix))]
if benefit_criteria:
best_vals = list(map(max, zip(*weighted_norm_mat)))
worst_vals = list(map(min, zip(*weighted_norm_mat)))
else:
best_vals = list(map(min, zip(*weighted_norm_mat)))
worst_vals = list(map(max, zip(*weighted_norm_mat)))
dist_best = [(sum([(a-b)**2 for a,b in zip(row, best_vals)]))**0.5 for row in weighted_norm_mat]
dist_worst = [(sum([(a-b)**2 for a,b in zip(row, worst_vals)]))**0.5 for row in weighted_norm_mat]
relative_closeness = [dist_worst[i]/(dist_best[i]+dist_worst[i]) for i in range(len(dist_best))]
sorted_indices = sorted(range(len(relative_closeness)), key=lambda k: relative_closeness[k], reverse=True)
return {'rank':sorted_indices,'relative_closeness':relative_closeness}
```
阅读全文
相关推荐












