Суммирование логарифмических вероятностей - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь реализовать следующее:

enter image description here

, где правая часть возвращает вероятность от 0 до 1. Относительно продукта авторы соответствующего документа примечание:

Из-за проблем точности чисел с произведениями вероятностей в нашей реализации мы следуем общепринятой практике и используем суммирование логарифмических вероятностей.

Форму, как я понимаю, использование суммы вероятностей журнала помогает предотвратить недополнение. Но тогда я не получаю значения между 0 и 1, а 1- в формуле выше не имеет смысла. Что мне здесь не хватает? И можно ли преобразовать сумму логарифмических вероятностей обратно в значение между 0 и 1? При использовании большого числа вероятностей я по-прежнему получаю очень небольшое число, например:

log_probability = math.log(0.9) + math.log(0.3) + math.log(0.9) + math.log(1) + math.log(0.9) + math.log(0.3) + math.log(0.3) + math.log(0.3) + math.log(0.3) + math.log(0.3) + math.log(0.3) + math.log(0.3) + math.log(0.3) + math.log(0.3) + math.log(0.3) + math.log(0.3) + math.log(0.3) 
prob = math.exp(log_probability)

Где log_probality=-15.967728003210647 и prob =1.1622614669999998e-07.

Спасибо, я действительно поражаю край моего понимания статистики здесь ...!

1 Ответ

0 голосов
/ 03 мая 2020

На мой взгляд, следует избегать того, чтобы вероятности становились равными нулю в виде чисел с плавающей запятой, а в качестве действительных чисел - нет. Стратегия заключается в том, чтобы хранить и обрабатывать вероятности в качестве их логарифмов и при необходимости преобразовывать обратно в подлинные вероятности.

Пример может сделать это более понятным. Предположим, у нас есть N моделей данных, и мы стремимся приписать вероятности моделям. Когда мы обрабатываем экземпляр данных, мы обновляем эти вероятности с помощью правила Байеса:

P(M,i) is the prior probability ascribed to model i
P(D|i) is the probability of the data, given model i
we update the P(M|i) via
S[i] = P(M,i) * P(D|i)  
T = Sum{ 1<=i<=N | S[i]}
P(M|i) = S[i]/T

Могут возникнуть проблемы, когда мы получим последовательность данных, каждая из которых делает одну (или более) из моделей очень маловероятной, что is P (D | i) намного меньше, чем, по крайней мере, вероятность данных другой модели. В этом случае может случиться, что P (M | i) станет как число с плавающей запятой нулем. Как только он это сделает, он останется на нуле (потому что 0 раз все равно 0). Даже если в дальнейшем данные будут такими, что P (D | i) станет самой большой вероятностью данных, так что P (M | i) увеличится, этого не произойдет, потому что он застрял в 0.

Предположим, однако мы храним не P (M, i), а его log l (M, i), скажем. Теперь наше обновление становится

s[i] = l(M,i) + log(P(D|i))
t = log( Sum{ 1<=i<=N | exp( s[i]})
l(M|i) = s[i] - t

Хотя оно не защищено от проблемы ложных нулей, оно будет избегать его во многих случаях, когда оригинал поддастся.

Однако есть проблема оценки:

B = log( Sum{ 1<=i<=N | exp( s[i]) })

Если мы оценим это наивно, мы можем получить 0, если s [i] настолько отрицателен, что каждый exp (s [i]) равен 0. В этом случае сумма будет равна 0, а логарифм будет иметь значение nan.

Простой способ оценки B состоит в том, чтобы найти максимум, скажем, s [i], а затем оценить

B = a + log (Sum {1 <= i <= N | exp (s [i] -a)}) </p>

, где мы оцениваем второе слагаемое, оценивая каждую экспоненту. По крайней мере один из s [i] -a равен нулю, поэтому хотя бы один из членов суммы равен 1, и все они неотрицательны, поэтому сумма не будет 0

...