Существует ли эквивалент Python функции smooth.spline в R

Функция smooth.spline в R допускает компромисс между шероховатостью (как определено интегрированным квадратом второй производной) и подгонки точек (как определено суммированием квадратов остатков). Этот компромисс выполняется параметром spar или df. С одной стороны вы получаете линию наименьших квадратов, а другую вы получаете очень кривую кривой, которая пересекает все точки данных (или среднее значение, если вы дублировали значения x с разными значениями y).

Я просмотрел scipy.interpolate.UnivariateSpline и другие варианты сплайнов в Python, однако они кажутся только компромиссом, увеличивая количество узлов и устанавливая порог (называемый s) для разрешенных остатков SS. Напротив, гладкая плоскость в R позволяет иметь узлы во всех значениях x, не обязательно имея кривую, которая поражает все точки - штраф исходит от второй производной.

Есть ли у Python механизм сплайна, который ведет себя таким образом? Разрешить все узлы, но наказывать вторую производную?

Ответ 1

Я искал точно то же самое, но скорее не должен был бы переводить код на Python. Однако пакет Splinter выглядит как опция: https://github.com/bgrimstad/splinter

Ответ 2

Из исследования в Google, я пришел к выводу, что

В отличие от этого, smooth.spline в R позволяет иметь узлы во всех значениях x, не обязательно иметь волнистую кривую, которая поражает все точки - штраф исходит от второй производной.

Ответ 3

Вы можете использовать R-функции в Python с rpy2:

import rpy2.robjects as robjects
r_y = robjects.FloatVector(y_train)
r_x = robjects.FloatVector(x_train)

r_smooth_spline = robjects.r['smooth.spline'] #extract R function# run smoothing function
spline1 = r_smooth_spline(x=r_x, y=r_y, spar=0.7)
ySpline=np.array(robjects.r['predict'](spline1,robjects.FloatVector(x_smooth)).rx2('y'))
plt.plot(x_smooth,ySpline)

Если вы хотите напрямую установить lambda: spline1 = r_smooth_spline(x=r_x, y=r_y, lambda=42) не работает, потому что lambda уже имеет другое значение в Python, но есть решение: Как использовать лямбда-аргумент smooth.spline в RPy БЕЗ Python, интерпретирующих его как лямбда.

Для запуска кода сначала необходимо определить данные x_train и y_train, и вы можете определить x_smooth=np.array(np.linspace(-3,5,1920)). , если хотите отобразить его между -3 и 5 в разрешении Full-HD.