1.概念

        熵权法(Entropy Weight Method)是一种客观赋权方法,通过计算指标数据的离散程度确定权重。其核心思想是:数据离散程度越大,信息量越多,权重越高;反之,离散程度小的指标权重低。

        前面的方法计算权值都有主观因素,比如我认为伤害与子弹速度相比更重要,角色数值比人气更重要,但是这样是有主观因素的,而熵权法就只和数据离散程度有关,给出的权值就是完全客观的。

这个方法就是打分/选择/评价过程的一环 

2. 计算过程

1.数据正向化+标准化

对标准化矩阵记作Z

如果所有元素都是正数

常规标准化\tilde{z}_{ij}=\frac{x_{ij}}{\sqrt{\sum_{i=1}^{n}x^{2}_{ij}}}

如果存在负数元素

\tilde{Z}=\frac{x-min\left \{ x_{1j}, x_{2j},..., x_{nj}\right \}}{max\left \{x_{1j}, x_{2j},..., x_{nj} \right \}-min\left \{ x_{1j}, x_{2j},..., x_{nj} \right \}}(0\leq \tilde{z}_{ij}\leq 1)

2.计算概率矩阵P

计算每一项指标下,第i个样本所占的比重  p_{ij} = \frac{\tilde{z}_{ij}}{\sum_{i=1}^{n}\tilde{z}_{ij}}

3.计算熵权

e_{j}=-\frac{1}{\textup{ln}(n)}\sum_{i=1}^{n}p_{ij}\textup{ln}(p_{ij}),(j=1,2,...,m)

这里当p_{1j}=p_{2j}=...=p_{nj}=\frac{1}{n}

e_{j}=-\frac{1}{ln(n)}\sum_{i=1}^{n}\frac{1}{n}ln(\frac{1}{n})=-\frac{1}{ln(n)}\sum_{i=1}^{n}ln(\frac{1}{n})^{\frac{1}{n}}=-\frac{1}{ln(n)} n ln(\frac{1}{n})^{\frac{1}{n}}

=-\frac{1}{ln(n)} ln(\frac{1}{n})^{\frac{1}{n}\cdot n}=-\frac{1}{ln(n)} ln(\frac{1}{n})=-\frac{1}{ln(n)} \cdot (-ln(n))=1

注意这里n是一个常数

此时信息熵最大,但是信息效用最小 

定义信息效用d_{j}=1-e_{j} ,此时效用值越大,权重越大

将信息效用值归一化,得到熵权 W_{j}=\frac{d_{j}}{\sum_{j=1}^{m}d_{j}}

3.代码

%熵权法
%对正向化后的矩阵标准化
%判断是否需要正向化
X=input('指标矩阵A=');
[n,m]=size(X);
disp(['共有' num2str(n) '个评价对象',num2str(m) '个评价指标']);
Judge = input(['这' num2str(m) '个指标是否需要正向化处理,需要输入1,不需要输入0:']);
if Judge==1
    Position=input('请输入需要正向化处理的指标所在的列,例如第2,3,6列现需要处理,那么输入[2,3,6]:');
    disp('请输入需要处理的这些列的指标类型(1:极小型,2:中间型,3:区间型)');
    Type=input('例如:第2列是极小型,第3列是区间型,第6列是中间型,需要输入[1,3,2]');
    for i=1:size(position,2)
        X(:,Position(i))=Positivization(X(:,Position(i)),Type(i),Position(i));
    end
    disp('正向化后矩阵X=');
    disp(X);
end
%正向化
Z=X ./ repmat(sum(X .* X) .^ 0.5,n,1);%repmat默认是每一行相加,最终是一个行向量,然后复制n行1列
disp('标准化矩阵 Z = ');
disp(Z)
%计算熵权
D=zeros(1,m);
for i=1:m
    x=Z(:,i);
    p=x/sum(x);
    e=-sum(p .* clog(p)) / log(n);
    D(i)=1-e;
end
W=D ./ sum(D);
disp('权重W=');
disp(W);
function [lnp]= clog(p)主要是考虑有0不能用ln的情况
n=length(p);
lnp=zeros(n,1);
for i = 1:n
    if p(i)==0
        lnp(i)=0;
    else
        lnp(i)=log(p(i));
    end
end
end

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐