Python pwlf分段线性函数对于相同的数据给出不同的结果

问题描述

这是我的数据:

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 设置为一致的值,以至少每次都获得相同的结果,即使它可能没有找到“真实”最小值。请注意,如果您更改其中一个关键字,则需要明确写出所有其他关键字,因为传递给 **kwargsfit 似乎会覆盖将传递给 {{1} }.