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

Python pwlf (piecewise linear functions) gives different results for the same data

这是我的数据:

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.4 , 0.4 , 0.6 , 0.6 , 0.6 , 0.6 , 0.6 , 0.97, 0.97,
       0.97, 0.97, 1.13, 1.13, 1.13, 1.13, 1.13, 0.9 , 0.9 , 0.9 , 0.9 ,
       0.7 , 0.7 , 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 calls the function scipy.optimize.differential_evolution. The Scipy docs 开始,此函数将其描述为一种确定函数全局最小值的随机方法。

看来在pwlf使用的默认设置下,它并没有完全收敛,或者至少每次都从不同的方向接近收敛。您也许可以编辑关键字,以便优化将对真正的最小值进行更严格的搜索。例如,atol 设置收敛的绝对公差。您还将 seed 设置为一致的值,以至少每次都获得相同的结果,即使它可能没有找到“真实”的最小值。请注意,如果更改其中一个关键字,则需要明确写出所有其他关键字,因为传递给 fit**kwargs 似乎会覆盖将传递给 [=15= 的默认值].