2010-03-14 9 views
8

Próbuję znaleźć pakiet liczbowy, który będzie pasował do naturalnego splajnu, który minimalizuje ważone najmniejsze kwadraty.Python Least-Squares Naturalne splajny

Istnieje pakiet w scipy, który robi to, co chcę dla nienaturalnych splajnów.

import numpy as np 
import matplotlib.pyplot as plt 
from scipy import interpolate, randn 

x = np.arange(0,5,1.0/6) 
xs = np.arange(0,5,1.0/500) 

y = np.sin(x+1) + .2*np.random.rand(len(x)) -.1 

knots = np.array([1,2,3,4]) 
tck = interpolate.splrep(x,y,s=0,k=3,t=knots,task=-1) 
ys = interpolate.splev(xs,tck,der=0) 

plt.figure() 
plt.plot(xs,ys,x,y,'x') 

Odpowiedz

5

Plik spline.py wewnątrz tego tar file z this page robi naturalny splajnu dopasowanie domyślnie. Istnieje również kod na this page, który twierdzi, że w większości tego, co chcesz. Model pyD3D package ma także natural spline function w swoim module pyDataUtils. Ten ostatni wydaje mi się najbardziej obiecujący. Jednak wydaje się, że nie ma możliwości ustawienia własnych węzłów. Może, jeśli spojrzysz na źródło, znajdziesz sposób, aby to naprawić.

Również znalazłem this message na liście mailingowej Scipy, która mówi, że używanie s = 0.0 (jak w twoim kodzie) sprawia, że ​​splajny dopasowywane przy użyciu powyższej procedury są naturalne w zależności od autora komunikatu. Znalazłem funkcję this splmake, która ma opcję dopasowania naturalnego splajnu, ale patrząc na źródło, stwierdziłem, że nie jest jeszcze zaimplementowany.

+1

Dzięki za odpowiedź. Plik, który wskazałeś, interpoluje dowolne dane za pomocą naturalnego splajnu. Oznacza to, że krzywa przechodzi przez każdy punkt danych. Jeśli dane są głośne (w moim przypadku), jest to złe. Jeśli podzielisz dane na boksy i wykonasz najmniejsze przybliżenie kwadratowe, możemy uzyskać gładką krzywą, która nie interpoluje dokładnie danych (co jest lepsze w przypadku głośnych danych). Myślę, że sam będę musiał napisać klasę, ale wydaje mi się, że to jeszcze jedna rzecz, która może pójść nie tak. Dzięki jeszcze raz. – Eldila

+1

Mam swój własny kod działa. Spojrzałem również na drugą opcję, ponownie używając pakietu pyD3D. Na początku myślałem, że to po prostu interpolacja, ale nie jestem tego teraz pewien. Tak czy inaczej, zaznaczę twoją odpowiedź jako zaakceptowaną odpowiedź. – Eldila

+0

dla jasności, odpowiedź twierdząca, że ​​s = 0,0 daje "naturalny" splajn, jest, jak sądzę, niepoprawny - naturalny splajn powinien mieć warunek dla drugiej pochodnej na punktach końcowych, który wydaje się nie być implementowany w scipy – Noah

Powiązane problemy