【问题标题】:Python pwlf (piecewise linear functions) gives different results for the same dataPython pwlf(分段线性函数)对相同的数据给出不同的结果
【发布时间】:2021-04-02 06:50:08
【问题描述】:

这是我的数据:

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

【问题讨论】:

    标签: python-3.x regression linear-regression piecewise


    【解决方案1】:

    看起来用于拟合的方法是随机的。从pwlf source code,fit 调用函数scipy.optimize.differential_evolution。该函数的Scipy docs 将其描述为确定函数全局最小值的随机方法。

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

    【讨论】:

    • 感谢您的清晰解释,我会尝试不同的选项
    猜你喜欢
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    相关资源
    最近更新 更多