Обходной путь для ошибки «сумма pk, не равная 1» в модуле scipy stats.rv_discrete - PullRequest
0 голосов
/ 02 мая 2019

В python3 функция scipy stats.rv_discrete требует, чтобы сумма вероятностей была равна 1, но из-за представления чисел с плавающей запятой сумма не равна 1.

К счастью, scipy был установлен в моем домашнем каталоге, поэтому я смог закомментировать строки 'if', проверяющие сумму в ~ .local / lib / python3.7 / site-packages / scipy / stats / _distn_infrastructure.py файл, тем самым заставляя его работать. Но что делать, если этот код запускается в другой системе. Копирование файла в рабочий каталог и его импорт приводит к слишком большому количеству ошибок. Пользовательский код с нуля (с использованием списков) кажется крайне неэффективным.

if len(xk) != len(pk):
    raise ValueError("xk and pk need to have the same length.")
#if not np.allclose(np.sum(pk), 1):
    #raise ValueError("The sum of provided pk is not 1.")

Надеюсь получить эффективную функцию с нуля или правильный обходной путь.

1 Ответ

1 голос
/ 02 мая 2019

Вы можете нормализовать значения pk, чтобы избежать ошибки.Это «заставит» сумму вероятностей быть равной 1.

До:

from scipy import stats
xk = np.arange(7)
pk = (0.1, 0.2, 0.3, 0.1, 0.1, 0.0, 0.19) 
custm = stats.rv_discrete(name='custm', values=(xk, pk))

Ошибка: ValueError: Сумма предоставленного pk не равна 1.

После:

from scipy import stats
xk = np.arange(7)
pk = (0.1, 0.2, 0.3, 0.1, 0.1, 0.0, 0.19)
pk_norm = tuple(p/sum(pk) for p in pk)
custm = stats.rv_discrete(name='custm', values=(xk, pk_norm))

Результат: ОК

...