我试图拟合多个分布并获得每个分布的标准偏差。然而,对于标准差,很多分布都会返回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]))
此外,我还会跳过在拟合数据时生成警告的分布。
更新1:
例如,当distribution = scipy.stats.beta
时,我得到[ nan nan]
,参数如下:
arg: (32.198726690922953, 15883184.284202889)
loc: -33527.5754686
scale: 35484135514.4
答案 0 :(得分:0)
Beta发布的variance是:
a * b / [ (a + b)^2 * (a + b + 1) ]
因此标准偏差是其平方根。获取a
和b
:
a = scipy.stats.beta.fit(data)[0]
b = scipy.stats.beta.fit(data)[1]
请注意,您可以始终使用np.std(data)
计算数据的标准偏差(没有任何适合的分布)。
答案 1 :(得分:0)
我在Stack Overflow上问了一个不同的问题,并得到了一个解决这个问题的解决方案。事实证明,我传递的参数被scipy解释得不同。以下是答案的链接: