scipy 如何使用norm.ppf与loc,scale和x作为numpy数组?

bvpmtnay  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(116)

我使用scipy.stats.norm包来计算CDF和ICDF。我想传递loc和scale参数作为numpy数组,并希望得到相同数量的x值的结果。norm.cdf函数返回了良好的结果(见下文):

>>> norm.cdf([0.1, 0.2, 0.3], loc = [2, 3, 4], scale = [0, 1, 2])
array([        NaN,  0.00255513,  0.03215677])

而norm.ppf函数查找ICDF时出错:

>>> norm.ppf([0.1, 0.2, 0.3], loc = [2, 3, 4], scale = [0, 1, 2])
    Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    norm.ppf([0.1, 0.2, 0.3], loc = [2, 3, 4], scale = [0, 1, 2])
  File "C:\Python\lib\site-packages\scipy\stats\distributions.py", line 718, in ppf
    output = valarray(shape(cond),value=self.a*scale + loc)
  File "C:\Python\lib\site-packages\scipy\stats\distributions.py", line 235, in valarray
    out = reshape(repeat([value],product(shape,axis=0),axis=0),shape)
  File "C:\Python\lib\site-packages\numpy\core\fromnumeric.py", line 152, in reshape
    return reshape(newshape, order=order)
ValueError: total size of new array must be unchanged

我不想循环多次,因为我的loc,scale和x值的数量很大。你能帮我用numpy vectorization解决这个问题吗?非常感谢:)

gpfsuwkq

gpfsuwkq1#

我不知道你是什么建模与零方差,但你没有得到“好结果”的任何设置。只是其中一个触发的错误信息比另一个更无礼。他们都给你错误消息的原因是因为你的零方差。这不是关于Python的一个版本不能正常工作。这是关于统计数据。试试这个:

scipy.stats.norm.ppf([0.1, 0.2, 0.3], loc = [2, 3, 4], scale = [0.01, 1, 2])

同方差应用:考虑用正态分布拟合的速度测量值的阵列l_speed。该示例导致Q-Q图,以测试测量误差与正态分布的拟合程度。

loc = l_speed.mean()
scale = l_speed.std()

# or alternatively
# loc, scale = scipy.stats.norm.fit(l_speed)

l_rv = stats.norm(loc, scale)     # models normal dis'n for one random variable each time it is called

x = np.array([np.percentile(l_speed.p) for p in np.linspace(0,100,20))
y = np.array([l_rv.ppf(p) for p in np.linspace(0.0001,1.0,20)])
plt.plot(x,y,linestyle='None', marker='o', color='blue')
plt.plot([550,1000],[550,1000],color='red', linestyle='--', linewidth=1)
plt.xlabel('Empirical Data')
plt.ylabel('Normal Distribution');

相关问题