美赛常用算法及matlab代码——(3)熵权法

 

熵权法真的用的太太太多啦(反正我们队是)

原理很简单,不再讲了(俺觉得就算不懂原理只要会用就OK)

举个栗子(以下数据全为我瞎编)

 身高气质颜值
小王得分5.532
小红得分5.643
小明得分5.756
小白得分5.868
小中得分5.9710

我们想算出以上身高、气质、颜值对于一个人影响程度的多少,就是算出这三个方面的权值,权值越大,表示该方面越重要。

当然,这是一个很浅显的例子。具体到美赛中,应用就多了去了。比如今年(2020年)的E题(我们队就选的这个题),我们有一步要计算水污染、大气污染、固体污染对于一个地区环境生态影响程度的时候,就可以用熵权法来看看这三个方面究竟哪个对于环境污染的影响更大。

下面上代码

main.m

说一下,下面的Ind数组,你有几列数据要处理(即有几个方面要求权值)这个Ind数组里就有几个元素,比如我上面举的例子,就把Ind改为[1 1 1]  如果某个指标是负值,你就把Ind里面对应的项改成2.    直接运行main.m 就能得到w值,即各项的权值

x=load('data.txt');  % 读入数据
Ind=[1 1 1 1]; %指定各指标的正向or负向
[s,w]=shang(x,Ind)

还定义了两个函数,记得把main.m和guiyi.m还有shang.m放在一个文件夹下,当然啦,要把你的要处理的数据放在data.txt文件里,同时这个文件也放在该文件夹下。

 guiyi.m

function y=guiyi(x,type,ymin,ymax)
%实现正向或负向指标归一化,返回归一化后的数据矩阵
%x为原始数据矩阵, 一行代表一个样本, 每列对应一个指标
%type设定正向指标1,负向指标2
%ymin,ymax为归一化的区间端点
[n,m]=size(x);
y=zeros(n,m);
xmin=min(x);
xmax=max(x);
switch type
    case 1
        for j=1:m
            y(:,j)=(ymax-ymin)*(x(:,j)-xmin(j))/(xmax(j)-xmin(j))+ymin;
        end
    case 2
        for j=1:m
            y(:,j)=(ymax-ymin)*(xmax(j)-x(:,j))/(xmax(j)-xmin(j))+ymin;
        end
end

 shang.m

function [s,w]=shang(x,ind)
%实现用熵值法求各指标(列)的权重及各数据行的得分
%x为原始数据矩阵, 一行代表一个样本, 每列对应一个指标
%ind指示向量,指示各列正向指标还是负向指标,1表示正向指标,2表示负向指标
%s返回各行(样本)得分,w返回各列权重
[n,m]=size(x); % n个样本, m个指标
%%数据的归一化处理
for i=1:m
    if ind(i)==1 %正向指标归一化
        X(:,i)=guiyi(x(:,i),1,0.002,0.996);    %若归一化到[0,1], 0会出问题
    else %负向指标归一化
        X(:,i)=guiyi(x(:,i),2,0.002,0.996);
    end
end
%%计算第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
s=100*w*X'; %求综合得分

 

  • 18
    点赞
  • 184
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值