2016-09-21 9 views
1

У меня есть пример гистограммы с:как вычислить энтропию от н.п. гистограммы

mu1 = 10, sigma1 = 10 
s1 = np.random.normal(mu1, sigma1, 100000) 

и вычислил

hist1 = np.histogram(s1, bins=50, range=(-10,10), density=True) 
for i in hist1[0]: 
    ent = -sum(i * log(abs(i))) 
print (ent) 

Теперь я хочу, чтобы найти энтропию из заданного массива гистограммы, но так как np.histogram возвращает два массива, у меня проблемы с вычислением энтропии. Как я могу просто вызвать первый массив np.histogram и вычислить энтропию? Я бы также получил ошибку математической области для энтропии, даже если мой код выше правильный. :(

** Edit: Как найти энтропию, когда Mu = 0 и журнал (0) дает математике домен ошибки


Так фактический код, который я пытаюсь написать это?:

mu1, sigma1 = 0, 1 
mu2, sigma2 = 10, 1 
s1 = np.random.normal(mu1, sigma1, 100000) 
s2 = np.random.normal(mu2, sigma2, 100000) 

hist1 = np.histogram(s1, bins=100, range=(-20,20), density=True) 
data1 = hist1[0] 
ent1 = -(data1*np.log(np.abs(data1))).sum() 

hist2 = np.histogram(s2, bins=100, range=(-20,20), density=True) 
data2 = hist2[0] 
ent2 = -(data2*np.log(np.abs(data2))).sum() 

до сих пор первый пример ent1 дадут нана, а вторые, ent2, дают ошибку математики домена :(

+0

Очевидно, проблема заключается в 'log (0)' в undefined. Но почему вы используете 'range = (- 20,20)'? Я не думаю, что 'np.random.normal (mu2, sigma2, 100000)' производит любое отрицательное число! Во всяком случае, до тех пор, пока в некоторых ячейках нет точек, вы получите эту ошибку! – Mahdi

+0

Эй! Благодаря! Я его разобрал. Я использовал, чтобы обрезать все данные 0! – Vinci

+0

Добро пожаловать! Это хорошее решение! Если вы думаете, что мой ответ помог, пожалуйста, примите ответ, чтобы вопрос был отмечен! – Mahdi

ответ

3

можно вычислить энтропию, используя векторизованный код:

import numpy as np 

mu1 = 10 
sigma1 = 10 

s1 = np.random.normal(mu1, sigma1, 100000) 
hist1 = np.histogram(s1, bins=50, range=(-10,10), density=True) 
data = hist1[0] 
ent = -(data*np.log(np.abs(data))).sum() 
# output: 7.1802159512213191 

Но если вы хотите использовать для цикла, вы можете написать:

import numpy as np 
import math 

mu1 = 10 
sigma1 = 10 

s1 = np.random.normal(mu1, sigma1, 100000) 
hist1 = np.histogram(s1, bins=50, range=(-10,10), density=True) 
ent = 0 
for i in hist1[0]: 
    ent -= i * math.log(abs(i)) 
print (ent) 
# output: 7.1802159512213191 
+0

Спасибо Махди за ответ! Однако для меня это возвращает RuntimeWarning: деление на ноль встречается в журнале ent = - (i * np.log (abs (i))). Sum() RuntimeWarning: недопустимое значение, встречающееся в double_scalars ent = - (i * np.log (abs (i))). sum() nan – Vinci

+0

и для цикла for я получаю ошибку в области математики? В чем проблема? – Vinci

+0

@JinJeon: Не могли бы вы создать новый набор значений 's1' и повторить вышеуказанный код? Кажется, что некоторые цифры слишком близки к нулю. – Mahdi

0

Использование np.ma.log избежать РСМД и нан ошибок. np.ma - массив масок в масках.