Энтропия чистого расщепления в пересчете на NaN

Я написал функцию для вычисления энтропии вектора, где каждый элемент представляет количество элементов класса.

function x = Entropy(a)
    t = sum(a);
    t = repmat(t, [1, size(a, 2)]);
    x = sum(-a./t .* log2(a./t));
end

например: a = [4 0], затем entropy = -(0/4)*log2(0/4) - (4/4)*log2(4/4)

Но для приведенной выше функции энтропия равна NaN, когда расщепление является чистым из-за log2(0), как в приведенном выше примере. Энтропия чистого расщепления должна быть равна нулю.

Как мне решить проблему с наименьшим влиянием на производительность, поскольку данные очень велики? Спасибо


person Newbie    schedule 29.05.2015    source источник


Ответы (1)


Я бы посоветовал вам создать свою собственную функцию log2

function res=mylog2(a)
   res=log2(a);
   res(isinf(res))=0;
end

Эта функция, хотя и нарушает поведение log2, может использоваться в вашем конкретном примере, потому что вы умножаете результат на внутреннюю часть журнала, тем самым делая его равным нулю. Это не «математически правильно», но я считаю, что это то, что вы ищете.

person Ander Biguri    schedule 29.05.2015
comment
Спасибо, но мне пришлось отредактировать его на «res (isinf (res)) = 0», потому что log2 (0) = -inf. - person Newbie; 29.05.2015
comment
@ Новичок, действительно, моя ошибка - person Ander Biguri; 29.05.2015