2010-03-14 13 views
8

Ich versuche, ein numerisches Paket zu finden, das einen natürlichen Spline passt, der gewichtete kleinste Quadrate minimiert.Python Least-Squares Natürliche Splines

Es gibt ein Paket in scipy, das macht, was ich für unnatürliche Splines will.

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') 

Antwort

5

Die spline.py Datei innerhalb dieser tar file von this page hat eine natürliche Spline-Anpassung von Standard. Es gibt auch einen Code auf this page, der größtenteils behauptet, was Sie wollen. Das pyD3D package hat auch ein natural spline function in seinem pyDataUtils Modul. Dieser letzte sieht für mich am vielversprechendsten aus. Es scheint jedoch keine Möglichkeit zu geben, eigene Knoten zu setzen. Vielleicht, wenn Sie sich die Quelle ansehen, können Sie eine Möglichkeit finden, das zu korrigieren.

Auch ich fand this message auf der Scipy-Mailingliste, die besagt, dass die Verwendung von s = 0.0 (wie in Ihrem angegebenen Code) Splines mit Ihrem obigen Verfahren natürlich nach dem Verfasser der Nachricht angepasst. Ich fand this splmake Funktion, die eine Option hat, um eine natürliche Spline-Fit zu tun, aber beim Betrachten der Quelle fand ich, dass es noch nicht implementiert ist.

+1

Danke für die Antwort. Die Datei, auf die Sie verwiesen haben, interpoliert alle Daten mit einem natürlichen Spline. Dies bedeutet, dass die Kurve jeden Punkt in den Daten durchlaufen wird. Wenn die Daten laut sind (in meinem Fall ist es), ist dies eine schlechte Sache zu tun. Wenn Sie Ihre Daten in Bins aufteilen und eine Annäherung an die kleinsten Quadrate durchführen, können wir eine glatte Kurve erhalten, die die Daten nicht exakt interpoliert (was besser bei verrauschten Daten ist). Ich denke, ich werde die Klasse selbst schreiben müssen, aber es scheint nur noch eine Sache zu sein, die schief gehen kann. Danke noch einmal. – Eldila

+1

Ich habe meinen eigenen Code funktioniert. Außerdem habe ich die zweite Option mit dem pyD3D-Paket nochmal angeschaut. Zuerst dachte ich, es wäre nur Interpolation, aber ich bin mir nicht sicher. Wie auch immer, ich werde Ihre Antwort als die akzeptierte Antwort markieren. – Eldila

+0

nur um klar zu sein, die Antwort behauptet s = 0.0 ergibt einen "natürlichen" Spline ist, glaube ich, inkorrekt - der natürliche Spline sollte eine Bedingung auf der zweiten Ableitung an den Endpunkten haben, die nicht in scipy – Noah

Verwandte Themen