如何获得 scipy 中拟合分布的标准差?

How to get the standard deviation from the fitted distribution in scipy?

我正在尝试拟合多个分布并获取每个分布的标准差。然而,许多分布会为标准差返回 inf 或 Nan。我正在做的获得拟合分布方差的方法是否正确?有没有更好的办法?为什么南斯?这就是我所做的:

param = distribution.fit(data)
arg = param[:-2]
loc = param[-2]
scale = param[-1]

if len(arg)>0:
     std = np.sqrt(distribution.stats(arg, loc, scale, moments='v')[0]))
else:
     std = np.sqrt(distribution.stats(loc, scale, moments='v')[0]))

我还跳过了在拟合数据时生成警告的分布。

更新一: 比如当distribution = scipy.stats.beta时,得到[ nan nan],参数如下:

arg: (32.198726690922953, 15883184.284202889)
loc: -33527.5754686
scale: 35484135514.4 

beta 分布的 variance 是:

a * b / [ (a + b)^2 * (a + b + 1) ]

所以标准偏差是它的平方根。要获得 ab

a = scipy.stats.beta.fit(data)[0]
b = scipy.stats.beta.fit(data)[1]

请注意,您可以始终 使用 np.std(data).

计算数据的标准差(没有任何拟合分布)

我在 Stack Overflow 上问了一个不同的问题,并且得到了一个也回答了这个问题的解决方案。原来我传递的参数被scipy解释的不一样。这是 link 的答案: