2013-07-01 8 views
1

Я пытался энтропии для каждого столбца, матрица выглядит следующим образом:Как можно векторизовать расчет энтропии?

0.5 0.3333 0.2 
0 0.3333 0.4 
0.5 0.3333 0.4 

Каждый столбец добавить к одному, однако, есть некоторые нули в матрице, так что если я просто log2 (обр (я , :)), в результате будет -Inf, поэтому все это не сработает
На практике у меня огромная матрица, поэтому я хочу, чтобы программа работала быстро, есть ли работа вокруг?
Вот мое решение, работает ли оно так же быстро, как p. * Log2 (p)?

log2p = log2(p); 
    log2p(log2p==-Inf)=0; 
    entropy = entropy - p .* log2p; 
+0

Я не понял, что именно вы хотите сделать, но вы можете добавить эпсилон (0,001) к матрице, поэтому он не будет содержать нулей. – Adiel

+0

@Adiel Я хочу рассчитать энтропию для каждого столбца, что вы сказали, это работа вокруг – cloudyFan

+0

@cloudyFan ваш вопрос не ясен, что вы пытаетесь прорисовать? и как '-inf 'связано с вашей проблемой векторизации? – Shai

ответ

0

Использование isinf

log2p = log2(p); 
log2p(isinf(log2p)) = 0; 
entrpoy = -sum(p.*log2p , 1) 
+0

это так же быстро векторная версия? Entropy = entropy - p. * Log2 (p); – cloudyFan

+0

в вашем заявлении: 'entropy = entropy - p. * Log2 (p);' что векторизовано? откуда приходит энтропия? это строка в 'for'-loop по всем строкам' p'? – Shai

0

Использование eps:

САП минимальное представимое число в обращении, так что вы будете иметь ваши результаты без изменения много (почти infinitesmall изменения).

log2(p) 

ans = 

    -1.0000 -1.5851 -2.3219 
     -Inf -1.5851 -1.3219 
    -1.0000 -1.5851 -1.3219 

log2(p+eps) 

ans = 

    -1.0000 -1.5851 -2.3219 
    -52.0000 -1.5851 -1.3219 
    -1.0000 -1.5851 -1.3219 

p2=p+eps; 
entropy=-sum(p2.*log2(p2),1) 

entropy = 

    1.0000 1.5849 1.5219 
+0

Но это дает разумные результаты для энтропии (1.0000)? – AutomaticHourglass

+0

никогда не думал, я сделал концептуальную ошибку. См. Мой комментарий к Shai в комментариях выше :) –

0

Вы можете использовать isnan в сочетании с тем, что 0*-inf==NaN:

E = p.*log2(p); 

valid = ~isnan(E); 
entropy(valid) = entropy(valid) - E(valid); 

clear E valid 

Как выяснили here, это должно работать без предупреждений, если у вас есть MatLab новее R2007a.

1

В MATLAB 0^0 равен 1. А так как log2(1)==0, Вы можете использовать эту функцию и переписать функцию энтропии, как

p.*log2(p) = log2(p.^p) 

Тогда для примера мы получаем

>> log2(p.^p) 

ans = 

    -0.5000 -0.5283 -0.4644 
     0 -0.5283 -0.5288 
    -0.5000 -0.5283 -0.5288 
+2

Вы действительно получаете '0.^0 == 0'? Какая версия Matlab? Я получаю '1' в R2012b, а' 1' - [стандарт на большинстве языков] (http://en.wikipedia.org/wiki/Exponentiation#Zero_to_the_power_of_zero) (некоторые оставляют его неопределенным или дают ошибки). – horchler

+0

Это была моя ошибка. Это 1. Я отредактировал ответ. –

Смежные вопросы