곡선 적합에서 공분산 행렬을 어떻게 해석합니까?


15

나는 통계가 너무 좋지 않아서 이것이 단순한 질문이라면 사과드립니다. 일부 데이터에 곡선을 맞추고 때로는 내 데이터가 형식으로 음의 지수에 가장 잘 맞으며 때로는 적합이 a * e ( b * x 2 )에 더 가깝습니다 . + c . 그러나 때로는 둘 다 실패하고 선형 피팅으로 돌아가고 싶습니다. 내 질문은, 결과 데이터에서 반환되는 분산-공분산 행렬에서 특정 데이터 세트에 가장 적합한 모델을 결정하는 방법입니다.이자형(엑스)+이자형(엑스2)+scipy.optimize.curve_fit () 함수? 분산 이이 행렬의 대각선 중 하나에 있다고 생각하지만 어떻게 해석 해야할지 모르겠습니다.

업데이트 : 비슷한 질문 에 따라 분산 공분산 행렬이 가장 적합한 3 가지 모델 중 어느 것이 데이터에 가장 잘 맞는지를 알 수 있기를 바랍니다 (많은 데이터 세트를이 세 가지 모델 중 하나에 맞추려고합니다).

주어진 예제에서 결과 행렬은 다음과 같습니다.

pcov_lin 
[[  2.02186921e-05  -2.02186920e-04]
 [ -2.02186920e-04   2.76322124e-03]]
pcov_exp
[[  9.05390292e+00  -7.76201283e-02  -9.20475334e+00]
 [ -7.76201283e-02   6.69727245e-04   7.90218415e-02]
 [ -9.20475334e+00   7.90218415e-02   9.36160310e+00]]
pcov_exp_2 
[[  1.38338049e-03  -7.39204594e-07  -7.81208814e-04]
 [ -7.39204594e-07   8.99295434e-09   1.92970700e-06]
 [ -7.81208814e-04   1.92970700e-06   9.14746758e-04]]

내가하고있는 일의 예는 다음과 같습니다.

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

def exp_func(x, a, b, c):
    return a * np.exp(-b * x) + c

def exp_squared_func(x, a, b, c):
    return a * np.exp(-b * x*x*x) + c

def linear_func(x, a, b):
    return a*x + b

def main():
    x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], np.float)
    y = np.array([1, 1, 1, 1, 0.805621, 0.798992, 0.84231, 0.728796, 0.819471, 0.570414, 0.355124, 0.276447, 0.159058, 0.0762189, 0.0167807, 0.0118647, 0.000319948, 0.00118267, 0, 0, 0], np.float)

    p0 = [0.7746042467213462, 0.10347274384077858, -0.016253458007293588]
    popt_lin, pcov_lin      = scipy.optimize.curve_fit(linear_func, x, y)
    popt_exp, pcov_exp      = scipy.optimize.curve_fit(exp_func, x, y)
    popt_exp_2, pcov_exp_2  = scipy.optimize.curve_fit(exp_squared_func, x, y)

    plt.figure()
    plt.plot(x, y, 'ko', label="Original data")
    plt.plot(x, linear_func(x, *popt_lin), 'r-', label='linear')
    plt.plot(x, exp_func(x, *popt_exp), 'b-', label='exponential')
    plt.plot(x, exp_squared_func(x, *popt_exp_2), 'g-', label='exponential squared')
    plt.legend()
    plt.show()

if __name__ == '__main__':
    main()

이 CV 질문과 결과적으로 적합에 따라 모델 포스트 팩트를 선택하는 것이 적절한 지 묻는 중요한 주석 스레드 (b / w rolando2, Frank Harrell, ...)에 연결하는 것이 좋습니다. 아마도 시스템에 대한 사전 지식을 사용하여 모델을 선택하는 것이 좋습니다.
Aman

CV에 관한이 다른 질문이 도움이 될 것입니다 : stats.stackexchange.com/questions/50830/…
Aman

공분산 행렬 stats.stackexchange.com/questions/10795/… 를 해석하는 방법을 이해하는 데 도움이 될 수 있습니까? -세 번째 모델의 값이 더 작기 때문에 편차가 적습니다.
user4581

답변:


4

명확 하게 말하면, pcovfrom 의 변수 scipy.optimize.curve_fit는 모수 추정치의 추정 된 공분산입니다. 모델, 지정된 모델의 파라미터의 값을 결정하기 위해 데이터에 얼마나 많은 정보가있다. 따라서 선택한 모델이 좋은지 여부를 실제로 알려주지는 않습니다. 참조 .

좋은 모델의 문제는 실제로 어려운 문제입니다. 에 의해 주장대로통계 학자들이

모든 모델이 잘못되었지만 일부 모델이 유용합니다

따라서 다른 모델을 비교할 때 사용할 기준은 달성하려는 대상에 따라 다릅니다.

예를 들어, 데이터에 "가까운"곡선을 원한다면 가장 작은 잔차 를 제공하는 모델을 선택할 수 있습니다. 귀하의 경우 계산시 가장 낮은 값을 갖는 모델 func과 추정 매개 변수 popt입니다

numpy.linalg.norm(y-func(x, *popt))

그러나 더 많은 매개 변수가있는 모델을 선택하면 모델 복잡성이 높아짐에 따라 잔차가 자동으로 줄어 듭니다 . 그런 다음 모델의 목표가 무엇인지 다시 돌아옵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.