2010-03-14 12 views
8

Sto cercando di trovare un pacchetto numerico che si adatti ad una spline naturale che minimizzi i minimi quadrati pesati.Python Least-Squares Natural Splines

C'è un pacchetto in scipy che fa quello che voglio per le spline non naturali.

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

risposta

5

Il file spline.py all'interno di questo tar file da this page fa una spline scelta naturale per impostazione predefinita. C'è anche del codice su this page che rivendica principalmente quello che vuoi. Lo pyD3D package ha anche un natural spline function nel suo modulo pyDataUtils. Quest'ultima sembra la più promettente per me. Tuttavia, non sembra avere la possibilità di impostare i propri nodi. Forse se guardi la fonte puoi trovare un modo per correggerlo.

Inoltre, ho trovato this message nella mailing list di Scipy che dice che l'uso di s = 0.0 (come nel tuo codice) rende le spline adattate usando la tua procedura sopra naturale secondo lo scrittore del messaggio. Ho trovato la funzione this splmake che ha un'opzione per fare una spline naturale, ma guardando la fonte ho scoperto che non è ancora implementata.

+1

Grazie per la risposta. Il file che hai indicato interpola qualsiasi dato con una spline naturale. Ciò significa che la curva attraverserà ogni punto dei dati. Se i dati sono rumorosi (nel mio caso lo è), questa è una brutta cosa da fare. Se separi i tuoi dati in bin e fai un'approssimazione minima, possiamo ottenere una curva uniforme che non interpola esattamente i dati (che è meglio con i dati rumorosi). Penso che dovrò scrivere la lezione da solo, ma sembra essere ancora una cosa che può andare storta. Grazie ancora. – Eldila

+1

Ho ottenuto il mio codice di lavoro. Inoltre, ho guardato di nuovo la seconda opzione usando il pacchetto pyD3D. All'inizio ho pensato che fosse solo un'interpolazione, ma ora non ne sono sicuro. Ad ogni modo, segnerò la tua risposta come risposta accettata. – Eldila

+0

solo per essere chiari, la risposta che afferma s = 0.0 produce una spline "naturale" è, credo, errata - la spline naturale dovrebbe avere una condizione sulla seconda derivata agli endpoint che sembra non essere implementata in scipy – Noah