2010-03-14 5 views
8

가중치가 최소 인 사각형을 최소화하는 자연스러운 스플라인에 맞는 숫자 패키지를 찾으려고합니다.Python Least-Squares Natural Splines

부 자연스러운 스플라인을 원한다면 scipy에 패키지가 있습니다.

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

답변

5

this page에서이 tar file의 내부 spline.py 파일은 기본적으로 자연 스플라인 맞춤을한다. this page에도 대부분 원하는대로 소유권을 주장하는 코드가 있습니다. pyD3D packagepyDataUtils 모듈에 natural spline function이 있습니다. 이 마지막 하나가 나에게 가장 유망 해 보인다. 그러나, 그것은 자신의 노트를 설정할 수있는 옵션을 가지고 있지 않습니다. 어쩌면 소스를 보면이를 수정하는 방법을 찾을 수 있습니다.

또한 Scipy 메일 목록에 s = 0.0을 사용하면 메시지 작성자에 따라 위 절차를 사용하여 스플라인을 자연 스럽 게 만든다는 메시지가 나타납니다 (this message). 나는 this splmake 함수에 자연스러운 스플라인을 적용 할 수있는 옵션이 있지만 소스를 보면 아직 구현되지 않은 것으로 나타났습니다.

+1

응답 해 주셔서 감사합니다. 지정한 파일은 자연스러운 스플라인으로 모든 데이터를 보간합니다. 즉, 커브는 데이터의 모든 지점을 통과하게됩니다. 데이터가 시끄 럽다면 (내 경우는 그렇다), 이것은 나쁜 일이다. 데이터를 빈 (bin)으로 분리하고 최소 제곱 근사를 수행하면 데이터를 정확하게 보간하지 않는 부드러운 곡선을 얻을 수 있습니다 (잡음이 많은 데이터의 경우 더 낫습니다). 나는 수업을 직접 써야한다고 생각하지만, 그것은 잘못 될 수있는 또 하나의 것 같다. 다시 한번 감사드립니다. – Eldila

+1

나는 내 자신의 코드를 작동 시켰습니다. 또한 pyD3D 패키지를 사용하여 두 번째 옵션을 다시 살펴 보았습니다. 처음에는 보간을했다고 생각했지만 지금은 확신이 없습니다. 어느 쪽이든, 나는 당신의 대답을 인정 된 대답으로 표시 할 것입니다. – Eldila

+0

분명히 밝혀지면 s = 0.0이라고하는 대답은 "자연스러운"스플라인을 생성합니다. 잘못된 말입니다. 자연스러운 스플라인은 끝점에서 2 차 미분에 조건이 있어야합니다. – Noah