Я хочу оценить одностороннее усеченное нормальное распределение для разных значений квантиля и разных значений неусеченного среднего. Для эффективности я хочу использовать numpy
трансляцию, а не цикл Python.
В качестве минимального воспроизводимого примера представьте, что три квантили, которые я хочу оценить, равны [3.0, 2.0, 1.0]
, соответствующие неусеченные средние значения равны [6.0, 5.0, 4.0]
, нижняя граница равна 1.5
, а неусеченное стандартное отклонение равно 3.0
.
Оценка их по отдельности работает, как и ожидалось. Если я побегу
import numpy as np
from scipy.stats import truncnorm
print truncnorm.logpdf(3.0, a=(1.5-6.0)/3.0, b=np.inf, loc=6.0, scale=3.0)
print truncnorm.logpdf(2.0, a=(1.5-5.0)/3.0, b=np.inf, loc=5.0, scale=3.0)
print truncnorm.logpdf(1.0, a=(1.5-4.0)/3.0, b=np.inf, loc=4.0, scale=3.0)
я получил
-2.44840736626
-2.3878150686
-inf
(Последнее значение равно -inf
, потому что 1.0
меньше порогового значения). Использование широковещательной рассылки numpy
для двух значений одновременно также работает должным образом. Если я побегу
print truncnorm.logpdf(
np.array([3.0, 2.0]),
a=(1.5-np.array([6.0, 5.0]))/3.0,
b=np.inf,
loc=np.array([6.0, 5.0]),
scale=3.0
)
print truncnorm.logpdf(
np.array([2.0, 1.0]),
a=(1.5-np.array([5.0, 4.0]))/3.0,
b=np.inf,
loc=np.array([5.0, 4.0]),
scale=3.0
)
я получил
[-2.44840737 -2.38781507]
[-2.38781507 -inf]
Однако, если я попытаюсь оценить три значения за раз, запустив:
print truncnorm.logpdf(
np.array([3.0, 2.0, 1.0]),
a=(1.5-np.array([6.0, 5.0, 4.0]))/3.0,
b=np.inf,
loc=np.array([6.0, 5.0, 4.0]),
scale=3.0
)
Я получаю сообщение об ошибке:
Traceback (most recent call last):
File "truncnorm_error.py", line 25, in <module>
scale=3.0
File "C:\Python27\lib\site-packages\scipy\stats\_distn_infrastructure.py", line 1701, in logpdf
place(output, cond, self._logpdf(*goodargs) - log(scale))
File "C:\Python27\lib\site-packages\scipy\stats\_continuous_distns.py", line 4853, in _logpdf
return _norm_logpdf(x) - self._logdelta
ValueError: operands could not be broadcast together with shapes (2,) (3,)
Что мне не хватает? Я использую Python 2.7, numpy
1.13 и scipy
0.19.