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= 的默认值].
这是我的数据:
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= 的默认值].