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

What's the correct way of calculate the entropy of a variable?

示例:

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

我的尝试(使用 MATLAB):

p(1) = 1/4; % probably of occur 1

p(2) = 2/4; % probably of occur 2

p(0) = 1/4; % probably of occur 0

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

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

谢谢。

你的问题的答案取决于你试图做什么。

如果 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 并且等于零的概率(不是值)必须排除在计算之外(使用上面的代码,不可能产生这样的概率,所以没有必要来处理它们)。

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

X = [255 255 255 0];

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

P = [0.25 0.75]; 

产生的香农熵指数等于 0.811278124459133