示例:
如果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
函数,我得到相同的值。
谢谢。
答案 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
视为灰度图像(其值在0
和1
之间的矩阵或者从0
到255
)。由于X
的基础类型为double
,因此变量由函数im2uint8
进行内部转换,以使其所有值都落在灰度图像的正确范围内...从而获得:
X = [255 255 255 0];
这会产生不同的概率向量,等于:
P = [0.25 0.75];
产生香农的熵指数等于0.811278124459133
。