使用支点Python

时间:2016-02-23 13:52:45

标签: python machine-learning linear-regression curve-fitting data-fitting

我有下面的情节,我想用2条线来装。使用python我设法适应上半部分:

def func(x,a,b):
    x=np.array(x)
    return a*(x**b)
popt,pcov=curve_fit(func,up_x,up_y)

我想让下半部分与另一条线相配,但是我希望线穿过红色星形的点,所以我可以有一个连续的功能。所以我的问题是如何通过给出函数必须通过的点来使用curve_fit,但是留下线的斜率由python计算? (或任何其他能够做到的python包)

enter image description here

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

在对数空间中对模型进行逐步参数化可能类似于:

(x>q)*((x-q)*a)+(x<q)*((x-q)*c)+b

如果q是扭结的位置,ac是两个部分的斜率,b是全局y偏移量。由于模型具有不连续性,因此基于梯度的最小化器可能不是找到最佳拟合的最佳选择。不过我尝试了scipy.optimize.leastsqscipy.odr,并取得了不错的成绩。

fit to noisy data

答案 2 :(得分:-1)

您可以查看piecewisepwlf。下面是使用分段的示例,该分段可以自动适合多个细分。

from piecewise.regressor import piecewise
import numpy as np

x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ,11, 12, 13, 14, 15,16,17,18], 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,120,112,110])

model = piecewise(x, y)

评估“模型”以获取以下输出:

FittedModel with segments:
* FittedSegment(start_t=1.0, end_t=7.0, coeffs=(2.9999999999999996, 2.0000000000000004))
* FittedSegment(start_t=7.0, end_t=16.0, coeffs=(-68.2972222222222, 13.888333333333332))
* FittedSegment(start_t=16.0, end_t=18.0, coeffs=(198.99999999999997, -5.000000000000001))