熵权法确定权重

在这里插入图片描述

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'; %求综合得分

用到的归一化函数:

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_datas.mat, 为2014年31个省份的就业与劳动保障数据, 包含5个指标:社会养老保险参保率、医疗保险参保率、失业保险参保率、工伤保险参保率、工伤事故发生率, 其中第5个指标为负向指标。
执行代码:

load shang_datas

Ind=[1 1 1 1 2]; %指定各指标的正向or负向

[S,W]=shang(X,Ind)

运行结果:
S =
Columns 1 through 9

3.2624 11.7822 5.2952 1.3521 2.5262 2.0425 4.4215 2.6953 2.5208

Columns 10 through 18

7.8834 4.7410 7.4679 1.4645 3.2541 1.6292 3.3035 1.6282 1.9043

Columns 19 through 27

2.0526 7.8582 0.7256 3.8943 3.7992 1.7187 0.7766 0.6445 2.0167

Columns 28 through 31

0.7801 1.3353 2.2775 2.9462

W = 0.0896 0.2195 0.3330 0.3073 0.0506

发布了56 篇原创文章 · 获赞 4 · 访问量 8349

猜你喜欢

转载自blog.csdn.net/qq_45669448/article/details/104211693
今日推荐