Есть ли Python, эквивалентный функции smooth.spline в R

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

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

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

1 ответ

Вы можете использовать функции 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.

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

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

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

Другие вопросы по тегам