用轴心点 Python 拟合曲线
Fitting a curve with a pivot point Python
我有下面的图,我想用 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 能够做到这一点的软件包)
您的模型在 log-space 中可能的逐步参数化类似于:
(x>q)*((x-q)*a)+(x<q)*((x-q)*c)+b
其中 q
是扭结的位置,a
,c
是两个部分的斜率,b
是全局 y 偏移。由于模型具有不连续性,基于梯度的最小化器可能不是找到最佳拟合的最佳选择。尽管如此,我还是尝试了 scipy.optimize.leastsq
和 scipy.odr
并取得了不错的效果。
你可以看看piecewise and pwlf。下面是一个使用分段的例子,它可以自动适应多个段。
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))
我有下面的图,我想用 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 能够做到这一点的软件包)
您的模型在 log-space 中可能的逐步参数化类似于:
(x>q)*((x-q)*a)+(x<q)*((x-q)*c)+b
其中 q
是扭结的位置,a
,c
是两个部分的斜率,b
是全局 y 偏移。由于模型具有不连续性,基于梯度的最小化器可能不是找到最佳拟合的最佳选择。尽管如此,我还是尝试了 scipy.optimize.leastsq
和 scipy.odr
并取得了不错的效果。
你可以看看piecewise and pwlf。下面是一个使用分段的例子,它可以自动适应多个段。
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))