Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分段回归python_Python_Linear Regression_Piecewise - Fatal编程技术网

分段回归python

分段回归python,python,linear-regression,piecewise,Python,Linear Regression,Piecewise,我试图用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 optimi

我试图用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()
将numpy导入为np
导入matplotlib
将matplotlib.cm导入为cm
将matplotlib.mlab导入为mlab
将matplotlib.pyplot作为plt导入
从scipy导入优化
def分段(x、x0、x1、y0、y1、k0、k1、k2):
返回np。分段(x,[x一个非常简单的方法(没有迭代,没有初始猜测)可以解决这个问题

微积分的方法来自本文的第30页:(复制如下)

下图显示了结果:

拟合函数的方程为:

或相当于:

H是Heaviside函数

此外,数值演算的细节如下所示:

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

微积分的方法来自本文的第30页:(复制如下)

下图显示了结果:

拟合函数的方程为:

或相当于:

H是Heaviside函数

此外,数值演算的细节如下所示:



您的图像尚未显示,upI试图运行您发布的代码,但似乎缺少导入语句。请发布完整的工作示例好吗?您好,刚刚添加了导入语句…问题:您可以使用单个方程式吗?或者对于此特定情况,您是否设置为分段模型?我不能使用单个方程式,因为它是科学数据和曲线中的3个区域具有不同的属性。因此,寻找分段拟合。您的图像尚未显示。我试图运行您发布的代码,但似乎缺少导入语句。请发布完整的工作示例好吗?嗨,刚刚添加了导入语句…问题:您可以使用单个方程式,还是f或者这个具体的例子,你是建立在分段模型上的吗?我不能使用一个方程,因为它是一个科学数据,曲线中的三个区域具有不同的属性。所以,寻找分段拟合。你知道有没有Python包吗?可能没有。但是编写这样的计算机程序并不困难。听起来不错。在我开始之前到您提供的源代码中-它是否可以很好地推广到m(参数化)分段?理论上我会说是的。但是当分段的数量增加时,矩阵变得越来越大,对于分散的数据,微积分的精度也越来越低。在实践中,我担心分段的数量会受到很大限制,因为数值演算的偶然性,以及由于经验分散而导致的偏差增加原始数据。是的,它只是矩阵求逆和多项式方程的根。但是它们的项越多,由于初始数据的分散性,最终结果的偏差就越大。你知道有没有Python包吗?可能没有。但是编写这样的计算机程序并不难。听起来不错。在我您提供的源代码中的ve-它是否可以很好地推广到m(参数化)分段?理论上我会说是的。但是当分段的数量增加时,矩阵变得越来越大,对于分散的数据,微积分的精度也越来越低。在实践中,我担心分段的数量会受到很大限制,因为数值演算的偶然性,以及由于经验分散而导致的偏差增加原始数据。是的,它只是矩阵求逆和多项式方程的根。但它们的项越多,由于原始数据的分散性,最终结果的偏差就越大。