Julia의 CurveFit을 사용한 커브 피팅

9266 단어 Julia

이 기사는



줄리아에서 커브 피팅의 삼각 함수를 피팅하는 내용을 CurveFit 패키지로 실시했습니다.

구현 환경


  • macOS 10.14.6
  • julia 1.4.1

  • 데이터 만들기



    피팅되는 쪽의 곡선을 만듭니다. 이번에는 삼각 함수에 오차 항이 타고있는 데이터를 취급합니다.
    using Plots
    using CurveFit
    
    X = 0.01:0.01:1.0
    Y = @. 0.5 + 0.4 * sin(2pi*X) + 0.05randn()
    
    @.는 정의 된 수식을 벡터의 모든 요소에 적용하는 구문입니다.

    함수 정의는 매우 간단합니다. 또한 2pi와 같이 숫자를 변수 앞에 붙인 경우는 2*pi로 해석되므로 가독성이 높아집니다 (역시 2piX는 에러가 되었습니다). rand와 sin과 같은 수학 함수가 내장되어있는 것이 편리합니다.

    이 데이터를 살펴 보겠습니다.
    gr()
    scatter(X, Y)
    



    샘플



    피팅에 사용하는 샘플을 채취합니다. 이번은 등간격에 10점을 취합니다.
    X0 = X[1:10:91]
    Y0 = Y[1:10:91]
    

    Julia의 인덱스는 Matlab과 마찬가지로 1부터 시작합니다. 다른 언어에 익숙해지면 기분 나쁘게 느낄지도 모릅니다.

    피팅



    CurveFit에는 몇 가지 피팅 모델이 있지만 이번에는 다항식 모델의 Poly를 사용합니다.
    fit1 = curve_fit(Poly, X0, Y0, 1)
    Y1 = fit1.(X)
    

    매우 간단합니다. curve_fit의 첫 번째 인수는 모델의 Poly를 지정하고 두 번째 및 세 번째 인수는 피팅에 사용할 샘플을 지정합니다. 네 번째 인수는 다항식의 최대 차수입니다. 여기에서는 1차식에서의 피팅을 하고 있습니다.
    두 번째 행은 피팅 된 모델을 사용하여 근사선의 값을 계산합니다. 이제 플롯 해 봅시다.
    plot(X, Y, seriestype = :scatter, label="data")
    plot!(X, Y1, label="Poly deg1")
    

    두 번째 줄의 plot!가 붙은 이유는 첫 번째 줄의 플롯에 겹쳐서 그리기 때문입니다 (인수를 변경하는 함수 호출을 파괴적 메서드라고 부르는 것 같습니다). 만약 !를 붙이지 않고 2행째를 plot라고 쓴 경우, 1행째의 플롯 내용은 리프레시 되어 버려, 2행째의 플롯 내용 밖에 묘화되지 않습니다.



    1차 근사로는 무리가 있습니다만, 노력하고 있군요.

    3차 근사, 6차 근사, 9차 근사



    차수를 늘리자.
    fit3 = curve_fit(Poly, X0, Y0, 3)
    Y3 = fit3.(X)
    
    plot(X, Y, seriestype = :scatter, label="data")
    plot!(X, Y3, label="Poly deg3")
    



    3차 근사라고 이런 느낌. 좋은 느낌이군요.
    다음은 6 차 근사를 시도합니다.
    fit6 = curve_fit(Poly, X0, Y0, 6)
    Y6 = fit6.(X)
    
    plot(X, Y, seriestype = :scatter, label="data")
    plot!(X, Y6, label="Poly deg6")
    



    약간 오버 피팅하기 시작했습니다.
    또한 차수를 늘려 9 차로 해 보겠습니다.
    fit9 = curve_fit(Poly, X0, Y0, 9)
    Y9 = fit9.(X)
    
    plot(X, Y, seriestype = :scatter, label="data")
    plot!(X, Y9, label="Poly deg9")
    



    9차 근사에서는 훌륭할 때까지 오버피팅하여 다른 방향으로 하고 있습니다.

    이상, Julia의 CurveFit를 사용한 커브 피팅을 소개했습니다. CurveFit를 사용하면 매우 쉽게 피팅을 할 수있어 편리하네요.
    참고로 줄리아에서 커브 피팅에서는 10차 근사를 하고 있습니다만, curve_fit(Poly, X0, Y0, 10)는 에러가 되어 버려 피팅할 수 없었습니다. CurveFit에서는 모델 표현식의 변수가 샘플 수보다 많은 경우 오류를 반환하는 구현으로 보입니다.

    좋은 웹페이지 즐겨찾기