计算变量熵的正确方法是什么?

时间:2018-01-19 15:05:21

标签: matlab entropy information-extraction

示例:

如果a有一个变量 X = [1 2 2 0] ,那么计算熵的正确方法是什么?

我的尝试(使用MATLAB):

  

p(1)= 1/4; %可能发生1

     

p(2)= 2/4; %可能发生2

     

p(0)= 1/4; %可能发生0

H = -(1/4*log2(1/4)+2/4*log2(2/4)+1/4*log2(1/4))
  = 1.5

问题和我的困惑是,我应该考虑 X 的零值吗? 使用MATLAB的entropy函数,我得到相同的值。

谢谢。

1 个答案:

答案 0 :(得分:1)

您的问题的答案取决于您的尝试。

如果X表示与灰度图像关联的数据,那么entropy function就是您要找的内容:

X = [1 2 2 0];
H = entropy(X); % 0.811278124459133

但是,您的X变量和预期结果(1.5)都没有指向该解决方案。对我来说,似乎你只是试图在随机值向量上计算香农的熵。因此,您必须使用不同的方法:

X = [1 2 2 0];

% Build the probabilities vector according to X...

X_uni = unique(X);
X_uni_size = numel(X_uni);

P = zeros(X_uni_size,1);

for i = 1:X_uni_size
    P(i) = sum(X == X_uni(i));
end

P = P ./ numel(X);

% Compute the Shannon's Entropy

H = -sum(P .* log2(P)); % 1.5

P必须总和到1,并且必须将等于零的概率(不是值)排除在计算之外(使用上面的代码,它不可能产生这样的概率,所以它& #39;没有必要处理它们。)

为什么结果不同?这很容易解释。在第一个示例(使用entropy function的示例)中,Matlab被迫将X视为灰度图像(其值在01之间的矩阵或者从0255)。由于X的基础类型为double,因此变量由函数im2uint8进行内部转换,以使其所有值都落在灰度图像的正确范围内...从而获得:

X = [255 255 255 0];

这会产生不同的概率向量,等于:

P = [0.25 0.75]; 

产生香农的熵指数等于0.811278124459133