matlab:熵值法确定权重

  • 前言

    课题的模型需要给数据的各个属性进行分配权重,原本想使用AHP层次分析法求每个属性的权重,但因为这个算法主观因素偏重,而且我有用大量的数据,完全可以从数据中学习,最终选择了信息熵确定权重的方法。

  • 信息熵为什么能确定权值?

    信息熵是对信息不确定的一种度量,不确定性越大,信息熵越大,不确定性越小,信息熵越小,因此可以用熵值来确定一个指标的离散程度,离散程度越大,对综合评价的影响越大,其熵值越小。

  • 算法步骤1:归一化

    由于每个属性的计量单位并不统一,因此在用它们计算综合指标前,先要对它们进行标准化处理,归一化公式很简单,就是每个属性的最大值减去最小值作为分母,属性的每个值减去属性的最小值作为分子。需要注意的是使用matlab的mapminmax函数时,是对行进行处理的,也就是说需要先把每个属性的值转置,转置后的列表所示:

属性 数值 数值
属性1
属性2
属性3

归一化公式

  • 算法步骤2:计算每个数据占该数据所在属性的比重
    简单讲就是每个属性的所有值作为分母,单个值作为分子,求比重矩阵。
    求比重

  • 算法步骤3:计算每个指标的熵值
    熵值是有专门的计算公式,如下图,将步骤2的计算结果带入即可。
    在这里插入图片描述

    其中 :
    在这里插入图片描述
    n为每个属性的样本个数,也就是数据矩阵的行数。

  • 算法步骤4:计算信息熵冗余度:
    在这里插入图片描述

  • 算法步骤5: 计算每个属性的权值

    在这里插入图片描述

  • matlab代码

clc
clear
load data  
%算法第1步:归一化
%mapminmax函数对行进行处理,需要将数据进行转置
[x,mapping] = mapminmax(data');
%因为数据中含有0的数字,为了分母有理化进行范围规定
mapping.ymin = 0.002;
mapping.ymax = 0.996;
mapping.yrange = mapping.ymax-mapping.ymin;
data = mapminmax(data',mapping);
data = data';
%算法所需矩阵初始化,提高计算速度
[row,column] = size(data);
p = zeros(row,column);  %比重
e = zeros(1,column);  %每一项的熵值
d = ones(1,column); %信息熵冗余度
w = zeros(1,column); %各项指标权值


%算法第2步:每个属性的所有值做分母,单个值作为分子,形成比重矩阵
for j = 1:column
    sum_column = sum(data(:,j));
    for i = 1:row
        p(i,j) = data(i,j)/sum_column;
    end
end
%算法第3步:根据公式进行计算
k = 1 / log(row);
for i = 1:column
    e(i) = -k*sum(p(:,i).*log(p(:,i)));
end
%算法第4步:计算信息熵冗余度
d = d - e;
%算法第5步:计算各项指标的权值
w = d./sum(d);






你可能感兴趣的:(机器学习及数据挖掘)