2016-01-16 2 views
4

Я реализовал mutual information формулы питона с помощью pandas и numpyВычисления взаимной информации в питоне возвращает нана

def mutual_info(p): 
    p_x=p.sum(axis=1) 
    p_y=p.sum(axis=0) 
    I=0.0 
    for i_y in p.index: 
     for i_x in p.columns: 
      I+=(p.ix[i_y,i_x]*np.log2(p.ix[i_y,i_x]/(p_x[i_y]*p[i_x]))).values[0] 
    return I 

Однако, если клетка в p имеет нулевую вероятность, то np.log2(p.ix[i_y,i_x]/(p_x[i_y]*p[i_x])) является отрицательной бесконечностью, и целое выражение умножается на ноль и возвращает NaN.

Каков правильный способ обойти это?

+0

Не можете ли вы проверить, нет ли нуля в p, и в этом случае вернуть значение, которое вы ожидаете для этого случая? – timgeb

+0

Я понятия не имею, что такое энтропия нулевой вероятности –

+0

, может быть, кто-то здесь знает –

ответ

3

По различным теоретическим и практическим соображениям (например, см. Competitive Distribution Estimation: Why is Good-Turing Good), вы можете рассмотреть никогда с использованием нулевой вероятности с мерой потерь лога.

Так, скажем, если у вас есть вероятность вектор р, то для некоторых малых скалярных α> 0, вы бы использовать α 1 + (1 - α) р (где здесь первый 1 - равномерный вектор). К сожалению, нет никаких общих рекомендаций по выбору α, и вам придется оценить это дальше по расчёту.

Для расстояния Kullback-Leibler вы, конечно, применяете это к каждому из входов.