2017-12-26 21 views
1

나는 다음과 같은 코드를 사용하여 일부 데이터에 맞게 시도하고 작동하지 않습니다 내가하지 누구인지에scipy curve_fit 잘

enter image description here

어떤 생각이 플롯을 만드는

import numpy as np 
import scipy.optimize 
import matplotlib.pyplot as plt 

def fseries(x, a0, a1, b1, w): 
    f = a0 + (a1 * np.cos(w * x)) + (b1 * np.sin(w * x)) 
    return f 

x = np.arange(0, 10) 
y = [-45.0, -17.0, -33.0, 50.0, 48.0, -3.0, -1.0, 2.0, 84.0, 71.0] 

res = scipy.optimize.curve_fit(fseries, x, y, maxfev=10000) 

xt = np.linspace(0, 10, 100) 
yt = fseries(xt, res[0][0], res[0][1], res[0][2], res[0][3]) 

plt.plot(x,y) 
plt.plot(xt, yt, 'r') 
plt.show() 

이해하거나 잘못하고있는가?

+0

각 시리즈의 샘플 개수가 n = 100과 비교할 때 n = 10이므로 n = 100 일 때 더 많은 공백이 채워집니다. – DrBwts

답변

1

우선, 곡선 맞춤은 주어진 데이터 세트에 대해 좋은 곡선을 만드는 마법 장치가 아닙니다. 대수 데이터 세트에 지수 곡선을 잘 맞출 수 없습니다. 데이터를 보면, 정의한 함수에 의해 잘 묘사 된 것처럼 보입니까? 그것은 선형 함수와 사인 함수의 오버레이처럼 보이지 않습니까?
그런 다음 커브 피팅은 시작 값에 크게 좌우되는 반복 프로세스입니다.

P0 : 다음 scipy manual의 매개 변수에 대한 없음, 스칼라, 또는 N-길이 순서, 선택 초기 추측. 없음 경우, 초기 값은 모두 1

p0위한 더 나은 추측을 제공 할 수 있습니까?
마지막으로, 두 개의 어레이가 반환됩니다. 네가 필요로 할지라도 나는 둘 다 읽을 것이다. 코드를 단순화합니다.

p0 = (10, 20, 20, 1.5) 
res, _popcv = scipy.optimize.curve_fit(fseries, x, y, p0, maxfev=10000) 
xt = np.linspace(0, 10, 100) 
yt = fseries(xt, *res) 

시도하고 당신은 이미 더 잘 맞는을 얻을. 당신이

enter image description here

이 기능이 유용 여부, 당신이 결정해야

def fseries(x, a0, a1, b1, w): 
    f = a0 * x + (a1 * np.cos(w * x)) + (b1 * np.sin(w * x)) 
    return f 
에 더 잘 맞는 함수를 정의 할 때 enter image description here
당신은 더 적합성을 향상시킬 수 있습니다. 데이터 세트가 더 적합하기 때문에 상황에 맞는 설명자가된다는 것을 의미하지는 않습니다.

+0

굉장 !!! 대단히 감사합니다. – KDB

+0

합리적인 초기 추측을 어떻게 결정할 수 있습니까? p0 값은 y 값과 관련이없는 것 같습니다. – KDB

+1

'p0'는 정의 된 함수'fseries'의 변수에 대한 초기 추측입니다. 이 경우에는'a0, a1, b1, w'가 포함되어 있습니다.'res'의 적합 알고리즘에서 얻은 것과 같은 목록입니다. – MrT