我想評估一個單側截斷正態分佈的不同值的分位數和不同值的未截斷平均值。爲了提高效率,我想使用numpy
廣播而不是Python循環。使用numpy廣播與scipy truncnorm
對於最小重複的例子,假設三個位數欲評價是[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。
看起來像一個錯誤。你可以通過https://github.com/scipy/scipy/issues創建一個問題(點擊大綠色的「新問題」按鈕)。 –