【问题标题】:Curvefitting optimization error when fitting piecewise linear function拟合分段线性函数时的曲线拟合优化误差
【发布时间】:2017-12-18 21:13:08
【问题描述】:

我在两个数组中有一些数据,其中似乎有中断。我希望我的代码通过在 scipy 中使用分段来找出中断的位置。这是我所拥有的:

from scipy import optimize
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

x = np.array([7228,7620,7730,7901,8139,8370,8448,8737,8824,9089,9233,9321,9509,9568,9642,9756,9915,10601,10942], dtype=np.float)
y= np.array([.874,.893,.8905,.8916,.9095,.9142,.9109,.9185,.9169,.9251,.9290,.9304,.9467,.9378,0.9464,0.9508,0.9583,0.9857,0.9975],dtype=np.float)

def piecewise_linear(x, x0, y0, k1, k2):
    return np.piecewise(x, [x < x0], [lambda x:k1*x + y0-k1*x0, lambda x:k2*x + y0-k2*x0])

p , e = optimize.curve_fit(piecewise_linear, x, y)
perr = np.sqrt(np.diag(e))
xd = np.linspace(7228, 11000, 3000)
plt.plot(x, y, "o")
plt.plot(xd, piecewise_linear(xd, *p))

我的问题是,如果我运行它,我会收到错误消息“OptimizeWarning: Covariance of the parameters could not beested category=OptimizeWarning)"。不知道如何解决这个问题?有没有办法将初始参数输入这个函数以帮助它收敛或类似的?

注意,我确实意识到我可以让它工作的另一种方法是插值并找到我的数据的二阶导数。我已经这样做了,但是因为我的数据间隔不均匀/ y 轴数据有一些错误,所以我有兴趣让它以这种方式工作以及用于统计目的。所以,要清楚,我在这里想要的是两条线的参数(斜率/截距)和拐点。 (理想情况下,我也希望在这些方面也出现错误,但不确定这种方法是否可行。)提前致谢!

【问题讨论】:

    标签: python scipy curve-fitting piecewise


    【解决方案1】:

    代码运行良好,只有初始值会导致问题。

    默认情况下,curve_fit 开始时所有参数都设置为 1。因此,x0 开始时超出了数据中 x 的范围,优化器无法计算合理的梯度。 这个小修改将解决问题:

    # make sure initial x0 and y0 are in range of the data
    p0 = [np.mean(x), np.mean(y), 1, 1]
    
    p , e = optimize.curve_fit(piecewise_linear, x, y, p0)  # set initial parameter estimates
    perr = np.sqrt(np.diag(e))
    xd = np.linspace(7228, 11000, 3000)
    plt.plot(x, y, "o")
    plt.plot(xd, piecewise_linear(xd, *p))
    
    print(p)  # [  9.32099947e+03   9.32965835e-01   2.58225121e-05   4.05400820e-05]
    print(np.diag(e))  # [  4.56978067e+04   5.52060368e-05   3.88418404e-12   7.05010755e-12]
    

    【讨论】:

      【解决方案2】:

      您的软件可能使用从初始猜测开始的迭代方法。通常,最初的猜测是这些方法的弱点。

      如果您想克服这种困难,请使用不需要初始猜测的非迭代方法。如果非迭代法的拟合标准不方便你,还是先用非迭代法得到第一个解。然后使用经典的迭代方法,从最先找到的解开始。

      例如,下一个结果是通过论文第 12-13 页给出的非常简单的算法(不是迭代,没有初始猜测)获得的:https://fr.scribd.com/document/380941024/Regression-par-morceaux-Piecewise-Regression-pdf

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-11
        • 1970-01-01
        • 1970-01-01
        • 2017-07-12
        • 2021-09-01
        • 2020-05-18
        • 1970-01-01
        • 2020-07-27
        相关资源
        最近更新 更多