问题描述
这是我的数据:
x
array([ 0,7,14,21,28,35,42,49,56,63,70,77,84,91,98,105,112,119,126,133,140,147,154,161,168,175])
y
array([0.4,0.4,0.6,0.97,1.13,0.9,0.7,0.7 ])
我应用了 pwlf
- https://pypi.org/project/pwlf,但每次执行此代码时都会得到不同的 fit_breaks
:
pwlf_model = pwlf.PiecewiseLinFit(x,y,degree=1)
pwlf_model.fit(4)
第一次运行
pwlf_model.fit_breaks
array([ 0.,58.01861485,60.07425168,104.30868782,175. ])
第二次运行
pwlf_model.fit_breaks
array([ 0.,59.48475228,59.67460644,104.30594173,175. ])
第三次运行
pwlf_model.fit_breaks
array([ 0.,56.60204,62.0270283,104.30827438,175. ])
第四次运行
pwlf_model.fit_breaks
array([ 0.,58.92722066,59.50363949,104.30764284,175. ])
这是为什么?模型中的任何随机步骤? [1]:https://i.stack.imgur.com/Iut9x.png
解决方法
看起来用于进行拟合的方法是随机的。从 pwlf source code,fit 调用函数 scipy.optimize.differential_evolution
。此函数的 Scipy docs 将其描述为一种确定函数全局最小值的随机方法。
似乎在 pwlf 使用的默认设置下,它并没有完全收敛,或者至少每次都从不同的方向接近收敛。您也许可以编辑关键字,以便优化将对真正的最小值进行更严格的搜索。例如,atol
设置收敛的绝对容差。您还将 seed
设置为一致的值,以至少每次都获得相同的结果,即使它可能没有找到“真实”最小值。请注意,如果您更改其中一个关键字,则需要明确写出所有其他关键字,因为传递给 **kwargs
的 fit
似乎会覆盖将传递给 {{1} }.