нормализация списка очень маленьких двойных чисел (вероятности)

Я пишу алгоритм, в котором, учитывая модель, я вычисляю вероятности для списка наборов данных, а затем должен нормализовать (для вероятности) каждый из вероятностей. Таким образом, что-то вроде [0.00043, 0.00004, 0.00321] может быть преобразовано в что-то вроде [0.2, 0.03, 0.77].
Моя проблема в том, что вероятность журналов, с которыми я работаю, довольно мала (например, в пространстве журналов значения вроде -269647.432, -231444.981 и т. Д.). В моем коде C ++, когда я пытаюсь добавить два из них (взяв их показатель степени), я получаю ответ «Inf». Я пытался добавить их в лог-пространство (Суммирование / Вычитание журнала), но опять наткнулся на ту же проблему.

Кто-нибудь может поделиться своим мнением по этому поводу?

Спасибо

4

Решение

Предполагая, что вероятности были рассчитаны правильно, вы можете разделить каждую из них на наибольшую вероятность. Это можно сделать в логарифмической форме, вычитая наибольшее правдоподобие из каждого логарифмического правдоподобия.

Затем вы можете конвертировать из логарифмического пространства. Наибольшее значение будет равно 1,0, поскольку его нормализованное логарифмическое число равно 0. Каждое из меньших значений будет находиться в диапазоне от 0 до 1,0 и представлено как доля наибольшего.

4

Другие решения

Это стандартная процедура. Численно стабильный код Matlab:

LL = [ . . . ];  % vector of log-likelihoods
M = max(LL);
LL = LL - M;
L = exp(LL);
L = L ./ sum(L);
2

По вопросам рекламы [email protected]