2017-05-05 21 views
0
나는 시끄러운 X, Y 데이터에 파이썬에서 큐빅 스플라인에 맞게하고 (즉, I는 각 간격에 대한 네 개의 스플라인 계수를 얻기 위해 기대) 각 간격에 대한 스플라인 계수를 추출 할

을 찾는 입방 스플라인에 맞게 다른 파이썬 함수는 계수

지금까지 내가 (모든 scipy.interpolate에서) 시도 :

1) CubicSpline하지만,이 방법은 저 비현실적인, 불안해 계수 데이터의 결과로, 스플라인을 원활하게 할 수 없습니다.

2)와 결합 splrep splev 예컨대 I는 계수 추출

tck = splrep(x, y, k=3, s=1e25) 

/

F = PPoly.from_spline(tck) 
coeffs = F.c 
knots = F.x 

그러나 사용 매듭 I 전체 X-범위 평활 계수를 발견 할 수 없더라도 (비 물리적 인 제로 1e23에 가까운 값 간의 이동) 매끄러운 매개 변수 s를 매우 큰 수로 늘리면 매듭 수가 너무 적어지기 때문에 궁극적으로 매듭의 수가 너무 적습니다. 나는 적당한 매개 변수 s와 매듭의 수를 동시에 발견 할 수 없다.

3) I 사용 UnivariateSpline (X, Y, K = 3, (S) 내가의 변화에 ​​더 나은 감도를 발견 여기 0.03) 를 =하지만 대응 get_coeffs() 메소드는 각 구간에 대해 4 개 계수를 제공하지 않는다 그러나 하나만 이해할 수 없습니다.

4) 3 차 다항식을 사용하여 조각 별 능선 선형 회귀를 시도했지만이 방법은 적합도에 너무 큰 백분율 오차를 제공하므로 표준 스플라인 방법 중 하나를 작동시키는 것이 좋습니다.

무엇이 누락 되었습니까? 누군가가 도와 줄 수 있니?

답변

0

내가 여기에 볼 수있는 구체적인 문제는 UnivariateSpline는 보간 스플라인에 X의 다양한 능력의 대수 계수를 산출하지 않습니다. 그것은 또한 get_coeffs 방법으로 반환하는 개인 _data 재산의 유지 계수는, B-spline coefficients의 일종이기 때문이다. 이 계수는 리던던시가없는 스플라인을 나타냅니다 (N 자유가있는 스플라인의 경우 N을 필요로 함). 그러나 부착 된 기본 스플라인은 다소 복잡합니다.

그러나 당신은 당신이 스플라인 객체의 derivatives 방법을 사용하여 원하는 계수의 종류를 얻을 수 있습니다. 주어진 포인트 x에서 4 개의 모든 파생물을 반환합니다.이 지점에서 Taylor coefficients은 쉽게 찾을 수 있습니다. x가 보간법의 매듭 점인이 방법을 사용하는 것은 당연합니다. 얻은 계수는 매듭에서 다음 계수까지 유효합니다. 다음은 "멋진"형식의 출력으로 완성 된 예제입니다.

import numpy as np 
from scipy.interpolate import UnivariateSpline 
spl = UnivariateSpline(np.arange(6), np.array([3, 1, 4, 1, 5, 9]), s=0) 
kn = spl.get_knots() 
for i in range(len(kn)-1): 
    cf = [1, 1, 1/2, 1/6] * spl.derivatives(kn[i]) 
    print("For {0} <= x <= {1}, p(x) = {5}*(x-{0})^3 + {4}*(x-{0})^2 + {3}*(x-{0}) + {2}".format(kn[i], kn[i+1], *cf)) 

이 예제에서 노트는 0, 2, 3, 5입니다. 각 부분에 대해, cf는 낮은 수준으로 시작 계수를 보유

For 0.0 <= x <= 2.0, p(x) = -3.1222222222222222*(x-0.0)^3 + 11.866666666666667*(x-0.0)^2 + -10.744444444444445*(x-0.0) + 3.000000000000001 
For 2.0 <= x <= 3.0, p(x) = 4.611111111111111*(x-2.0)^3 + -6.866666666666667*(x-2.0)^2 + -0.7444444444444436*(x-2.0) + 4.000000000000001 
For 3.0 <= x <= 5.0, p(x) = -2.322222222222221*(x-3.0)^3 + 6.966666666666665*(x-3.0)^2 + -0.6444444444444457*(x-3.0) + 1.0000000000000016 

하는 것으로하므로 문자열 포맷시 순서 반전되어 출력된다.

은 플로팅

는 공식이 올바른지 확인하려면, 내가 그들을 붙여 넣은 복사 (물론, 당신은 아마 이러한 계수와 다른 무언가를하고 싶어) :

spline