2010-03-14 4 views
8

J'essaie de trouver un ensemble numérique qui s'adaptera à une spline naturelle qui minimise les moindres carrés pondérés.Python Moindres carrés naturels Splines

Il y a un paquet dans scipy qui fait ce que je veux pour les splines non naturelles.

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

Répondre

5

Le fichier spline.py intérieur de ce tar file de this page-t un ajustement de spline naturelle par défaut. Il y a aussi du code sur this page qui prétend principalement à ce que vous voulez. Le pyD3D package a également un natural spline function dans son module pyDataUtils. Ce dernier me semble le plus prometteur. Cependant, il ne semble pas avoir la possibilité de définir vos propres nœuds. Peut-être que si vous regardez la source, vous pouvez trouver un moyen de rectifier cela.

Aussi, j'ai trouvé this message sur la liste de diffusion Scipy qui dit que l'utilisation de s = 0.0 (comme dans votre code donné) rend les splines ajustés en utilisant votre procédure ci-dessus naturel selon l'auteur du message. J'ai trouvé this splmake fonction qui a une option pour faire un spline naturel, mais en regardant la source, j'ai trouvé qu'il n'est pas encore implémenté.

+1

Merci pour la réponse. Le fichier que vous avez pointé va interpoler toutes les données avec une spline naturelle. Cela signifie que la courbe traversera tous les points des données. Si les données sont bruyantes (dans mon cas, c'est le cas), c'est une mauvaise chose à faire. Si vous séparez vos données en cases et faites une approximation par les moindres carrés, nous pouvons obtenir une courbe lisse qui n'interpole pas les données exactement (ce qui est préférable avec des données bruitées). Je pense que je vais devoir écrire la classe moi-même, mais cela semble être une chose de plus qui peut mal tourner. Merci encore. – Eldila

+1

J'ai mon propre code de travail. Aussi, j'ai regardé la deuxième option en utilisant le paquet pyD3D à nouveau. Au début, je pensais que c'était juste une interpolation, mais je ne suis pas sûr de ça maintenant. De toute façon, je vais marquer votre réponse comme la réponse acceptée. – Eldila

+0

juste pour être clair, la réponse affirmant que s = 0.0 donne une spline «naturelle» est, je crois, incorrecte - la spline naturelle devrait avoir une condition sur la deuxième dérivée aux extrémités qui ne semble pas être mis en œuvre dans scipy – Noah

Questions connexes