由于 "divide by zero encountered in log" 错误,我无法拟合麦克斯韦分布
I cannot fit a Maxwell distribution due to "divide by zero encountered in log" error
我正在尝试 Maxwell distribution with the values included in this file。
因为我需要强制 loc 为 0,所以我使用表达式:
params = st.maxwell.fit(values, floc=0)
但是,这失败了 "divide by zero encountered in log" 错误:
我估计一个 loc=0 和 11000 左右比例的 pdf 会很好。
如何绕过这个问题并使拟合工作?
最大化对数似然的代码触发了下溢,因为它对比例参数的默认初始猜测为 1,这与实际最优值相去甚远。您可以使用 scale
参数将更好的猜测传递给 fit
。矩量法提供了一个很好的猜测,在这种情况下,这意味着使用样本均值来估计尺度参数。 Maxwell-Boltzmann distribution 上的维基百科页面根据尺度 a
给出了均值 μ 的公式。求解 a
得到:
In [19]: a = np.mean(values)/(2*np.sqrt(2/np.pi))
In [20]: a
Out[20]: 10587.275841415043
现在将该值作为 scale
参数传递给 fit
,它会覆盖优化代码使用的默认初始值:
In [21]: p = maxwell.fit(values, floc=0, scale=a)
In [22]: p
Out[22]: (0, 10455.558876443883)
这是位置(您设置为 0)和比例 a
的最大似然估计。
我正在尝试 Maxwell distribution with the values included in this file。
因为我需要强制 loc 为 0,所以我使用表达式:
params = st.maxwell.fit(values, floc=0)
但是,这失败了 "divide by zero encountered in log" 错误:
我估计一个 loc=0 和 11000 左右比例的 pdf 会很好。
如何绕过这个问题并使拟合工作?
最大化对数似然的代码触发了下溢,因为它对比例参数的默认初始猜测为 1,这与实际最优值相去甚远。您可以使用 scale
参数将更好的猜测传递给 fit
。矩量法提供了一个很好的猜测,在这种情况下,这意味着使用样本均值来估计尺度参数。 Maxwell-Boltzmann distribution 上的维基百科页面根据尺度 a
给出了均值 μ 的公式。求解 a
得到:
In [19]: a = np.mean(values)/(2*np.sqrt(2/np.pi))
In [20]: a
Out[20]: 10587.275841415043
现在将该值作为 scale
参数传递给 fit
,它会覆盖优化代码使用的默认初始值:
In [21]: p = maxwell.fit(values, floc=0, scale=a)
In [22]: p
Out[22]: (0, 10455.558876443883)
这是位置(您设置为 0)和比例 a
的最大似然估计。