使用scipy.stats.beta.fit时的运行时警告

时间:2017-06-16 14:58:05

标签: python python-3.x scipy statistics

如果我在python中运行以下代码

from scipy.stats import norm, beta
sample = beta.rvs(2,5,size=100)
beta_fit = beta.fit(sample)

我收到以下错误

/usr/lib/python3/dist-packages/scipy/stats/_continuous_distns.py:404: RuntimeWarning: invalid 
value encountered in sqrt
sk = 2*(b-a)*sqrt(a + b + 1) / (a + b + 2) / sqrt(a*b)

并且根据样本的大小,我有时也会得到另一个错误

/usr/lib/python3/dist-packages/scipy/optimize/minpack.py:161: RuntimeWarning: 
The iteration is not making good progress, as measured by the improvement from the last ten iterations.
warnings.warn(msg, RuntimeWarning)

有谁知道为什么会发生这种情况以及如何解决这个问题?

谢谢!

1 个答案:

答案 0 :(得分:2)

在评论中,您说要将支持固定为[0,1]。要使用fit()方法执行此操作,请使用参数floc=0fscale=1。然后只有形状参数适合数据。

from scipy.stats import beta

sample = beta.rvs(2, 5, size=100)
beta_fit = beta.fit(sample, floc=0, fscale=1)

这也应该消除您所看到的警告。发生这些警告是因为当所有四个参数都适合时,代码使用通用数值优化例程来查找最大化可能性的参数,并且该代码中的某些内容正在生成这些警告。 (这可能是一个错误 - 形状参数应该是正数,因此生成警告的行中对sqrt的调用都不会产生负面参数。)当您修复位置和比例时, fit()方法解决了一个更简单的数值问题,以找到最大似然参数估计值,因此它避免了生成警告的代码。