Python SciPy UnivariateSpline против R smooth.spline - PullRequest
0 голосов
/ 19 июня 2019

Я портирую скрипт, написанный на R, на Python. В R я использую smooth.spline, а в Python я использую SciPy UnivariateSpline. Они не дают одинаковых результатов (хотя они оба основаны на методе кубического сплайна). Есть ли способ или альтернатива UnivariateSpline, чтобы сплайн Python возвращал тот же сплайн, что и R?

Я математик. Я понимаю общую идею сплайнов. Но не мелкие детали их реализации в Python или R.

Вот код в R и затем Python. Входные данные одинаковы для обоих.

Вот входные данные:

x =  0.0,  0.1,  0.2,  0.3,  0.4,  0.5,  0.6,  0.7,  0.8,  0.9,  1.0
y =   -1,    1,    1,   -1,    1,    0,   .5,   .5,   .4,   .5,   -1

Вот код R

x = seq(0,1, by = .1); 
y = c(-1,1,1, -1,1,0, .5,.5,.4,  .5, -1);
spline_xy = smooth.spline(x,y)
predict(spline_xy,x)

который выводит:

$x
 [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

$y
 [1]  0.120614583  0.170800975  0.210954680  0.238032338  0.253672155
 [6]  0.253684815  0.236432643  0.200264536  0.145403302  0.074993797
[11] -0.004853825

Вот код Python

import numpy as np
from scipy.interpolate import UnivariateSpline
x = np.linspace(0, 1, num = 11, endpoint=True)    
y = np.array([-1,1,1, -1,1,0, .5,.5,.4,  .5, -1]) 
spline_xy = UnivariateSpline(x,y)
print('x =', x)
print('ysplined =',spline_xy(x))

который выводит:

x = [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]

ysplined = 
[-0.26433566 -0.02587413  0.18857809 0.36585082  0.49277389  
  0.55617716 0.54289044  0.43974359  0.23356643 -0.08881119 
 -0.54055944]

Я надеялся, что результаты в R $ y и в Python ysplined будут идентичны. Но это не так.

Буду признателен за любую помощь, например, как установить параметры или объяснения! Заранее спасибо.

1 Ответ

0 голосов
/ 19 июня 2019

Мне кажется, это разные методы сглаживания.

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

С другой стороны, Python UnivariateSpline появляется из документации здесь: https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.UnivariateSpline.html - сплайн регрессии, подгонка по наименьшим квадратам без штрафа. Похоже, адаптивно выбрать количество узлов.

Это совершенно разные алгоритмы, и я не ожидал бы, что они дадут одинаковые результаты. Я не знаю, есть ли пакет R, который использует тот же адаптивный выбор узлов, что и Python. Этот ответ: https://stackoverflow.com/a/55481248/2554330 утверждает, что ссылается на реализацию естественного сглаживающего сплайна в Python, но я не знаю, соответствует ли она реализации R.

...