熵权-TOPSIS综合评价方法的MATLAB程序

这篇博客分享了一段MATLAB代码,用于通过熵权法计算权重,并结合TOPSIS方法进行综合评价。博主亲测有效,适合算法和机器学习领域的研究者参考使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下是我搜寻的熵值法求权重并结合TOPSIS进行综合评价的MATLAB代码,自己试过了,是有用的,分开来使用,先求权重,再进行TOPSIS评价。第一次发博,如有不合规或错误的地方,请谅解。

%第一部分:求熵值
function [s,w]=shang(x)
 x=[ ];%这里输入自己的评价矩阵
 % 函数shang.m, 实现用熵值法求各指标(列)的权重及各数据行的得分
% x为原始数据矩阵
% s返回各行得分, w返回各列权重
[n,m]=size(x); % n=23个国家, m=5个指标
%% 数据的归一化处理
% Matlab2010b,2011a,b版本都有bug,需如下处理. 其它版本直接用[X,ps]=mapminmax(x',0,1);即可
[X,ps]=mapminmax(x',0,1);
 ps.ymin=0.002; % 归一化后的最小值
ps.ymax=0.996; % 归一化后的最大值
ps.yrange=ps.ymax-ps.ymin; % 归一化后的极差,若不调整该值, 则逆运算会出错
X=mapminmax(x',ps);
 % mapminmax('reverse',xx,ps); % 反归一化, 回到原数据
X=X';  % X为归一化后的数据
 %% 计算第j个指标下,第i个记录占该指标的比重p(i,j)
 for i=1:n
     for j=1:m
         p(i,j)=X(i,j)/sum(X(:,j));
     end
 end
 %计算第j个指标的熵值e(j)
 k=1/log(n);
 for j=1:m
     e(j)=-k*sum(p(:,j).*log(p(:,j)));
 end
 d=ones(1,m)-e;  % 计算信息熵冗余度
w=d./sum(d);    % 求权值w
%第二部分:TOPSIS综合评价
function [ output_args ] = TOPSIS(A,W)
A=[];%这里输入自己的评价矩阵
W=[]%这里输入上面求得的权重
%A为决策矩阵,W为权值矩阵,M为正指标所在的列,N为负指标所在的列
 [ma,na]=size(A);          %ma为A矩阵的行数,na为A矩阵的列数
 for i=1:na
 
### 熵权法与TOPSIS综合评价在Excel中的实现 熵权法是一种基于信息论的方法,用于衡量数据集中各指标的信息量大小,并据此分配权重[^2]。而TOPSIS(Technique for Order Preference by Similarity to Ideal Solution)则通过计算样本到理想解的距离来完成排序评价[^1]。 以下是熵权-TOPSIS综合评价法在Excel中的具体实现步骤: #### 数据准备 假设我们有如下表格结构的数据集: | 序号 | 指标A | 指标B | 指标C | |------|-------|-------|-------| | 1 | ... | ... | ... | | 2 | ... | ... | ... | --- #### 步骤一:矩阵正向化 如果某些指标为负向指标,则需将其转换为正向指标。例如,对于极小型指标 \( x \),可以通过公式 \( y = max(x) - x \) 进行转化[^1]。 --- #### 步骤二:标准化处理 对正向化的矩阵进行标准化操作,得到无量纲的数值。标准化公式为: \[ z_{ij} = \frac{x_{ij}}{\sqrt{\sum_{j=1}^{m}{x_{ij}^2}}} \] 在Excel中可以使用以下公式实现: ```excel = A2 / SQRT(SUMSQ(A$2:A$n)) ``` 其中 `A2` 是当前单元格位置,`SUMSQ(A$2:A$n)` 计算列平方--- #### 步骤三:计算信息熵 利用熵权法计算每项指标的权重。首先计算概率分布: \[ p_{ij} = \frac{z_{ij}}{\sum_{j=1}^{m}{z_{ij}}} \] 接着代入信息熵公式: \[ H_j = -k \cdot \sum_{i=1}^{n}{p_{ij} \cdot ln(p_{ij})}, k=\frac{1}{ln(n)} \] 在Excel中分别输入以下公式: - **计算\( p_{ij} \)**: ```excel = B2/SUM(B$2:B$n) ``` - **计算\( H_j \)**: 需要在辅助列先求得每一列的概率乘积之后再应用自然对数函数: ```excel = -(LN(C2)*D2)/LN(ROW()-MIN(ROW($B$2:$B$n))+1) ``` 最终汇总所有列的信息熵值。 --- #### 步骤四:确定权重 根据信息效用差值得出权重系数: \[ d_j = 1 - H_j, w_j = \frac{d_j}{\sum_{j=1}^{m}{d_j}} \] 在Excel中可依次执行加减运算得出结果。 --- #### 步骤五:TOPSIS评分计算 按照标准流程构建正理想解负理想解: \[ P^* = (\max(z_1), ..., \max(z_m)), N^* = (\min(z_1), ..., \min(z_m)) \] 随后计算各样本至两者的欧几里得距离以及相对接近度: \[ D_P(i) = \sqrt{\sum_{j=1}^{m}(w_j \cdot (P^*_j-z_{ij}))^2} \] \[ D_N(i) = \sqrt{\sum_{j=1}^{m}(w_j \cdot (N^*_j-z_{ij}))^2} \] \[ C_i = \frac{D_N(i)}{D_P(i)+D_N(i)} \] 这些都可以借助Excel内置函数轻松达成。 --- #### 完整模板设计建议 创建多个工作表分开存储原始数据、中间变量及最后得分排名等内容以便于管理查看。 ```python # 示例Python代码片段供参考如何自动化导出给定逻辑下的Excel文件 import pandas as pd from math import log df = pd.DataFrame({ '序号': range(1,6), '指标A':[...], ... }) def entropy_weight(df): data = df.values.T.tolist() norm_data = normalize(data) prob_matrix = [] for row in norm_data: total = sum(row) prob_row = [float(val)/total for val in row] prob_matrix.append(prob_row) entropies = [-reduce(lambda s,x:s+x*log(x),row,0) for row in prob_matrix] weights = [(1-e)/(len(entropies)-e.sum()) for e in entropies] return weights weights = entropy_weight(df.iloc[:,1:]) ... ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值