2012-07-05 6 views
0

꽤 간접적 인 방식으로 데이터를 맞추어야합니다. 피트에서 복구해야 할 원래 데이터는 작은 진동과 드리프트가있는 선형 함수이며이를 식별하고 싶습니다. 이것을 f (t)라고 부르 자. 실험에서이 매개 변수를 직접 기록 할 수는 없지만 간접적으로 g (f) = sin (a f (t))라고 가정 해 보겠습니다.Scipy/Python 간접 스플라인 보간

f (t)가 sin 함수의 전환점을 향하여 방향을 변경하면 식별하기가 어려우며 대안을 시도했습니다. (실제 전달 함수는 더 복잡하지만 여기에서 역할을해서는 안됩니다.) 접근법은 g의 역함수와 일부 추측을 계속하는 것보다 f (t)를 복구하는 접근법을 사용합니다.

동일한 전송 함수 g()와 g (fm (t))를 닮은 모델 함수 fm t))를 데이터에 적용합니다. 데이터 세트가 거대하기 때문에 전체 세트에서 fm의 연속성을 보장하는 데이터의 연속적인 덩어리를 조각별로 처리합니다.

첫 번째 시도는 optimize.leastsq를 사용하여 선형 함수를 사용하는 것이 었습니다. 여기서 오류 추정은 g (fm)에서 파생되었습니다. 그것은 완전히 만족스럽지 않고 fspline (t)을 f (t)의 모델로 사용하여 데이터와 파생 상품의 연속성을 보장하는 데이터에 스플라인을 맞추는 것이 훨씬 더 좋을 것이라고 생각합니다.

보간 패키지의 스플라인 피팅이 데이터에서 직접 작동하므로 g (fspline)을 사용하여 스플라인을 감싸고 스플라인 보간을 수행 할 수 없습니다. 이것이 scipy에서 할 수있는 방법이 있습니까?

다른 아이디어?

나는 차 기능과 데이터의 선행하는 장착 청크의 것과 일치하는 등의 오프셋 및 경사를 수정, 그래서 하나의 피팅 매개 변수가 매우 빠르게 시작 곡률이 이탈하는 시도

감사

만약 계수, coefs을 스플라인 기저 함수의 선형 조합으로서

f(t) = np.dot(b(t), coefs) 

을 F (t)를 근사하고 추정 할 수 있도록

답변

0

가 무엇을해야하면, 스플라인 기저 함수, B (t)의 행렬 , optimize.leastsq에 의해 .

그러나 스플라인 기저 함수는 내가 알고있는 한 Python에서 쉽게 사용할 수 없습니다 (실험 스크립트를 빌리거나 일부 패키지의 코드를 검색하지 않는 한).

대신 당신은 또한 예를

b(t) = np.polynomial.chebvander(t, order) 

를 들어, 다항식을 사용할 수 있고 스플라인 대신 다항식 근사를 사용합니다.

이 문제의 구조는 일반화 된 선형 모델과 매우 유사합니다. 여기서 g는 알려진 링크 함수이고 계량 경제학의 인덱스 문제와 유사합니다.

당신이 인공 데이터

를 만들 경우 간접적 인 방법으로 scipy 스플라인을 사용할 수있을 것
y_i = f(t_i) 
F (t_i가) scipy.interpolate 스플라인, 그리고 y_i을 추정 할 수있는 매개 변수입니다

최소 제곱 최적화. (느슨하게 내가 전에 본 스크립트를 기반으로 scipy 버전보다 스무딩 스플라인의 다른 종류를 만드는 데 사용되는. 나는 이걸 본 곳을 기억하지 않습니다.)

0

이러한 의견에 감사드립니다. 위에서 다항식 기반을 시도했지만 다항식은 내 요구 사항에 대한 선택 사항이 아니며 조건 설정이 어려운 링잉을 만드는 경향이있는 광고입니다.

이제 내가 찾은 스플라인 사용에 대한 해결책은 매우 간단하고 직선적이며 "간접적 인 방법으로 스플라인을 사용하는 것"이라고 생각했습니다.

fitting 함수 f (t)는 interpolate.splev (x, (t, c, k)) 함수에 의해 얻어 지지만 omptimize.leastsq 함수로 스플라인 계수 c를 제공합니다. 이런 식으로, f (t)는 (보통 splrep (x, y) 함수로 얻을 수있는 것처럼) 직접적인 스플라인 맞춤은 아니지만 fit에서 간접적으로 최적화되므로 링크 함수 g를 사용할 수 있습니다. c에 대한 초기 추측은 모델 데이터에 대한 splrep (xinit, yinit, t = knots) 평가를 통해 얻을 수 있습니다.

하나의 트릭은 splrep()의 함수 호출 중에 명시 적으로 지정하고 splev()를 사용하여 평가 중에이 축소 된 세트를 제공하여 데이터 요소의 수 아래로 스플라인의 매듭 점 수를 제한하는 것입니다.