Numpy Piecewise с N сегментами
Следуя этому очень иллюстративному решению ( Невозможно сделать кусочно-кусочно с 3 сегментами), я просто хотел бы расширить такой алгоритм до N частей без необходимости кодировать непосредственно каждый отдельный фрагмент. То есть я бы хотел расширить случай из 3 частей, представленных в ответе @BM, до N случаев.
def f(x,x0,y0,x1,k1,k2,k3):
# x0,y0 : first breakpoint
# x1 : second breakpoint
# k1,k2,k3 : 3 slopes.
y1=y0+ k2*(x1-x0) # for continuity
return (
(x<x0) * (y0 + k1*(x-x0)) +
((x>=x0) & (x<x1)) * (y0 + k2*(x-x0)) +
(x>=x1) * (y1 + k3*(x-x1)))
в моем нынешнем виде я кодировал что-то столь же ужасное, как это:
from scipy.optimize import curve_fit
for piece_number in nmb_pieces:
if piece_number == 1:
p, e = curve_fit(linear_fit, original_x, series_to_fit)
fit_curve = linear_fit(original_x, *p)
elif piece_number == 2:
p, e = curve_fit(piecewise_double, original_x, series_to_fit)
fit_curve = piecewise_double(original_x, *p)
elif piece_number == 3:
p, e = curve_fit(piecewise_triple, original_x, series_to_fit)
fit_curve = piecewise_triple(original_x, *p)
else:
p, e = curve_fit(piecewise_fourth, original_x, series_to_fit)
fit_curve = piecewise_fourth(original_x, *p)
где piecewise_triple
а также piecewise_fourth
соответственно функция, представленная ранее, и расширение в 4th
степень. ясно, что я хотел бы расширить что-то вроде:
from scipy.optimize import curve_fit
from functools import partial
def piecewise_nth(piece_number, args)
return ...
for piece_number in nmb_pieces:
if piece_number == 1:
p, e = curve_fit(linear_fit, original_x, series_to_fit)
fit_curve = linear_fit(original_x, *p)
else:
p, e = curve_fit(partial(piecewise_nth, piece_number=piece_number), original_x, series_to_fit)
fit_curve = partial(piecewise_nth, piece_number=piece_number)(original_x, *p)
но я должен понять, чтобы динамически строить
y1=y0+ k2*(x1-x0)
а также
return (
(x<x0) * (y0 + k1*(x-x0)) +
((x>=x0) & (x<x1)) * (y0 + k2*(x-x0)) +
(x>=x1)
есть идеи?