Поведение scipy's splrep

У меня есть набор точек данных, и я хотел бы аппроксимировать их с помощью функции сплайна. Я использовал две разные функции:

  1. splrep из scipy
  2. и функцию кубического сплайна, которую я нашел здесь.

Результаты выглядят так: этим.

Код выглядит следующим образом:

from matplotlib.pyplot import *
from numpy import *
from scipy import interpolate
#----------------------------------------------
s = arange(257)/256.0
z = s[::-1]
b = transpose(array((z*z*z,
                 3*z*z*s, 
                 3*z*s*s,
                 s*s*s)))
def cubicspline(c,t): 
return dot(b[t],c)
#----------------------------------------------

A = array([
   [ -126.041   ,  246.867004],
   [ -113.745003,   92.083   ],
   [  208.518997, -183.796997],
   [  278.859009, -190.552994]])

a1 = A[:,0]
a2 = A[:,1] 
cs = reshape(A, (-1, 4, 2))
X = []
Y = []
#spline with cubicspline()
for (x,y) in [cubicspline(c,16*t) for c in cs for t in arange(17)]:
X.append(x)
Y.append(y)

# spline with splrep
tck = interpolate.splrep( a1, a2)

xnew = np.arange( min(a1), max(a1), 5)
ynew = interpolate.splev(xnew, tck)
plot(a1, a2, "--ob", ms = 9,  label = "points")
plot(X, Y, "r", lw=2, label = "cubicspline")
plot(xnew, ynew, "g", lw=2, label = "splrep")
legend(); savefig("image.png"); show()

Как видите, результаты splrep далеки от удовлетворительных. Может кто-нибудь объяснить это поведение и как получить разумное приближение от splrep?


person Tengis    schedule 21.11.2012    source источник


Ответы (1)


Вам нужно определить, что вы подразумеваете под «удовлетворением». Очевидно, что ваш кубический сплайн не интерполирует точки, в то время как результат splrep интерполирует (и в этом смысле вполне удовлетворителен). Также обратите внимание, что ваш «кубический сплайн» на самом деле представляет собой всего лишь один полином, а не сплайн (который является полиномом с точками останова).

Вам нужно явно указать splrep, что сплайну не нужно проходить через точки --- передать ненулевой s параметр сглаживания. Как правильно это выбрать, см. этот вопрос: scipy. interpolate.UnivariateSpline не сглаживается независимо от параметров

person pv.    schedule 21.11.2012
comment
Ты прав. Удовлетворительно в том смысле, что сплайн не колеблется значительно. Я не уверен, что означает параметр сглаживания (думаю, мне нужно выполнить математику). Но на этот раз он работает лучше. postimage.org/image/cb8crl2l7. Спасибо за предложение. - person Tengis; 21.11.2012