2016-11-27 2 views
0

이 포스팅은 좀 X 데이터와 일부 Y 데이터가커브 피팅 최적화 scipy 파이썬 NumPy와

에서, Y 데이터는 X 데이터의 가중 합으로 적합 할 수 있습니다 내 앞의 질문을 바탕으로, 내 문제는이다 가장 잘 맞는 계수를 찾으십시오.

나는 그것이 최선의 방법이나 최적의 방법이 아닐 수도 있다는 것을 알았지 만, 이제는 그것을하는 한 방법을 이해합니다.

그러나 X- 데이터는 때로는 이동 될 수 있으므로 X의 각 열을 N 증분 단위로 이동하거나 슬라이딩 한 후에 만 ​​가장 적합한 것을 얻을 수 있습니다.

np.roll이이 작업을 수행하는 데 사용할 수 있는지 알아보기 위해 노력했지만 현재 함수에 열과 행을 올리거나 내릴 수있는 np.roll의 coefficents 및 정수 값이 모두 필요하므로 붙어 있습니다. N을 착용감 향상.

필자는 커브 핏에이 두 가지 종류의 매개 변수를 어떻게 전달할 수 있는지 이해하지 못한다고 생각합니다. 가능합니까?

아마도이 작업을 수행하는 가장 좋은 방법은 np.roll이 아닙니까? 그래서 다른 방법에 대한 어떤 제안도 감사 할 것입니다.

아래 예제에서 두 번째 열을 -1 씩 이동하면 Ydata에 더 잘 맞는 Xdata가 생성됩니다.

xdata = np.array([[1.0, 1.0],[1.0, 1.0], [2.0, 3.0], [4.0, 2.0], [2.0, 1.0],[1.0, 1.0]]) 

ydata = np.array([3.0, 5.0, 6.0, 9.0, 5.0, 3.0]) 


def fitfunc(xdata, *params): 
    ctx = 0.0 

    # y is not yet defined by somehow I would like it to take the values passed in the second np.array defined in c below 
    # the for loop should just run twice in this example 

    for n in range(len(params)): 
     ctx = params[n]*np.roll(xdata[:,n], y, axis=0) + ctx 
    return ctx, y 

#initial guesses for fitting parameters 
c = (np.array([0.6, 0.3]), np.array([1, 1])) # the second np.array is what I would like to pass a y's 

# fit data using SciPy's Levenberg-Marquart method 
nlfit, nlpcov = scipy.optimize.curve_fit(fitfunc, xdata, ydata, p0=(c), sigma=None) 

print (nlfit) 

+0

y = mx + b 형식의 선형 모델을 사용하려고하며 라인을 위아래로 이동시키는 상수 용어 b를 포함 하시겠습니까?아니면 데이터가 일련의 시간 계열인데 x 변수를 사용하는 데 걸리는 시간이 어떨지 확실하지 않습니다 (np.roll에 암시되어있을 수도 있음)? – David

+0

내 데이터는 스펙트럼입니다. 그래서 Xdata 배열은 열에 배열 된 두 스펙트럼의 행렬 일 수 있습니다. 이 주제에 대한 나의 이전 질문에서 나는 Xdata가 나의 ydata를 X * a + X * b ... 등으로 기술 할 수 있다고 믿는다. 적합성을 최적화하려고 할 때 x 데이터 열을 위아래로 이동하려는 이유는 실험적 오류가 그러한 변화가 실제 데이터에서 일반적이라는 것을 의미하기 때문에 계수로 각 Xdata 열을 곱하는 것은 물론, 잘하면 Xdata 열을 서로 맞춰 시범 변속하여 최상의 적합성을 찾는 방법이 있습니다. – steve

+0

나는 내가 성취하고자하는 바를 명확히하기를 희망한다. np.roll은 내가이 칼럼을 서로 상대적으로 옮길 수있을 것이라고 생각한 한 가지 방법 일뿐입니다. 관련된 스펙트럼에는 수천 개의 포인트가 있기 때문에 더 나은 적합성을 얻기 위해 한쪽 끝에서 다른 쪽으로 또는 그 반대로 롤을 돌리면이를 달성하는 방법이 될 수 있다고 생각했습니다. – steve

답변

0

curve_fit 당신은 그러나 당신이 fitfunc에서 원하는 사용할 수있는 매개 변수의 단일 배열을 기대하고 어떤 도움을 당신에게 미리 감사드립니다. 이 예제에서 우리는 p 개의 열을 가지며, 각 열은 기울기와 시프트를 가지므로 결국에는 2 * p 요소의 매개 변수 배열이 필요합니다. 초기 파라미터 배열 같을 필요 : 제 P 요소 소요 params[:cols]을 이용한 기울기 파라미터

  • slope_params

      , 배열 : fitfunc 안에서 난에 파라미터 배열 분할
      c = np.array([0.6, 0.3, 1, 1]) 
      

      , 및
    • shift_params, params[cols:]을 사용하는 시프트 매개 변수의 배열. 마지막 p 요소를 사용합니다. fitfunc에 대한

    전체 코드 : 우리가 [int(round(n)) for n in params[cols:]]를 사용하여, 정수로 시프트 매개 변수를 변환해야

    def fitfunc(xdata, *params): 
        # Get number of columns in data 
        cols = xdata.shape[1] 
    
        # Get slope parameters 
        slope_params = params[:cols] 
    
        # Get shift parameters and convert to int 
        shift_params = [int(round(n)) for n in params[cols:]] 
    
        # Calculate fit 
        ctx = 0.0 
        for n in range(len(slope_params)): 
         ctx = slope_params[n] * np.roll(xdata[:,n], shift_params[n], axis=0) + ctx 
    
        # Show progress 
        print(params) 
    
        return ctx 
    

    참고.

    전혀 시프트 매개 변수를 변경하지 않습니다 curve_fit이 사용

    및 경고 제공 :

    (0.59999999999999998, 0.29999999999999999, 1.0, 1.0) 
    (0.59999999999999998, 0.29999999999999999, 1.0, 1.0) 
    (0.59999999999999998, 0.29999999999999999, 1.0, 1.0) 
    (0.60000000894069672, 0.29999999999999999, 1.0, 1.0) 
    (0.59999999999999998, 0.30000000447034836, 1.0, 1.0) 
    (0.59999999999999998, 0.29999999999999999, 1.0000000149011612, 1.0) 
    (0.59999999999999998, 0.29999999999999999, 1.0, 1.0000000149011612) 
    (-0.40816307558733345, 3.6326528012731845, 1.0, 1.0) 
    (-0.40816306950522968, 3.6326528012731845, 1.0, 1.0) 
    (-0.40816307558733345, 3.6326528554039292, 1.0, 1.0) 
    (-0.40816307558733345, 3.6326528012731845, 1.0000000149011612, 1.0) 
    (-0.40816307558733345, 3.6326528012731845, 1.0, 1.0000000149011612) 
    (-0.40816327556523363, 3.632653071646589, 1.0, 1.0) 
    OptimizeWarning: Covariance of the parameters could not be estimated 
        category=OptimizeWarning) 
    [-0.40816328 3.63265307 1.   1.  ] 
    

    당신은 더 나은 결과를 얻기 위해 최적화 설정을 조정할 수 있습니다, 그러나 나는이 생각하지 않습니다 당신의 문제에 대한 가장 유망한 접근법입니다.

  • +0

    이 방법을 설명해 주셔서 고마워요. 역학을 보는 데 가장 유용하며 다른 사람들에게 유용 할 것입니다. 내 경우에는 원래 문제를 해결할 방법이 아닐지라도 – steve