【问题标题】:Piecewise regression python分段回归 python
【发布时间】:2018-02-15 16:38:33
【问题描述】:

我正在尝试在 Python 中进行分段线性回归,数据看起来像这样,

我需要为每个部分设置 3 行。知道怎么做吗?我有以下代码,但结果如下所示。任何帮助将不胜感激。

    import numpy as np
    import matplotlib
    import matplotlib.cm as cm
    import matplotlib.mlab as mlab
    import matplotlib.pyplot as plt
    from scipy import optimize

    def piecewise(x,x0,x1,y0,y1,k0,k1,k2):
        return np.piecewise(x , [x <= x0, np.logical_and(x0<x, x< x1),x>x1] , [lambda x:k0*x + y0, lambda x:k1*(x-x0)+y1+k0*x0 lambda x:k2*(x-x1) y0+y1+k0*x0+k1*(x1-x0)])

    x1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12, 13, 14, 15,16,17,18,19,20,21], dtype=float)
    y1 = np.array([5, 7, 9, 11, 13, 15, 28.92, 42.81, 56.7, 70.59, 84.47, 98.36, 112.25, 126.14, 140.03,145,147,149,151,153,155])
    y1 = np.flip(y1,0)
    x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12, 13, 14, 15,16,17,18,19,20,21], dtype=float)
    y = np.array([5, 7, 9, 11, 13, 15, 28.92, 42.81, 56.7, 70.59, 84.47, 98.36, 112.25, 126.14, 140.03,145,147,149,151,153,155])
    y = np.flip(y,0)

    perr_min = np.inf
    p_best = None
    for n in range(100):
        k = np.random.rand(7)*20
        p , e = optimize.curve_fit(piecewise, x1, y1,p0=k)
        perr = np.sum(np.abs(y1-piecewise(x1, *p)))
        if(perr < perr_min):
            perr_min = perr
            p_best = p

    xd = np.linspace(0, 21, 100)
    plt.figure()
    plt.plot(x1, y1, "o")
    y_out = piecewise(xd, *p_best)
    plt.plot(xd, y_out)
    plt.show()

适合的数据

谢谢。

【问题讨论】:

  • 您的图片未显示
  • 我尝试运行您发布的代码,但似乎缺少导入语句。您能发布一个完整的工作示例吗?
  • 嗨,刚刚添加了导入语句...
  • 问题:您可以使用单个方程,还是针对这种特定情况设置分段模型?
  • 我不能使用单个方程,因为它是科学数据,曲线中的 3 个区域具有不同的属性。所以,寻找适合的部分。

标签: python linear-regression piecewise


【解决方案1】:

一个非常简单的方法(无需迭代,无需初始猜测)就可以解决这个问题。

微积分的方法来自这篇论文的第30页:https://fr.scribd.com/document/380941024/Regression-par-morceaux-Piecewise-Regression-pdf(复制如下)。

下图显示结果:

拟合函数的方程为:

或等价:

H 是 Heaviside 函数。

另外,数值演算的详细内容如下:

【讨论】:

  • 你知道有没有 Python 包吗?
  • 可能不会。但是编写这样的计算机程序并不难。
  • 听起来不错。在我深入研究您提供的来源之前 - 它是否可以很好地推广到 m(参数化)段?
  • 理论上我会说是的。但是当段数增加时,矩阵会变得越来越大,并且对于分散的数据,微积分的准确性会降低。在实践中,由于数值微积分的偶然性和由于实验数据的分散而导致的偏差越来越大,我担心分段的数量会受到很大的限制。
  • 是的,它只是矩阵求逆和多项式方程的根。但是它们越多,由于初始数据的分散,最终结果的偏差就越大。
猜你喜欢
  • 2016-05-26
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 2020-10-23
  • 2018-09-28
相关资源
最近更新 更多