Julia의 CurveFit을 사용한 커브 피팅
9266 단어 Julia
이 기사는
줄리아에서 커브 피팅의 삼각 함수를 피팅하는 내용을 CurveFit 패키지로 실시했습니다.
구현 환경
데이터 만들기
피팅되는 쪽의 곡선을 만듭니다. 이번에는 삼각 함수에 오차 항이 타고있는 데이터를 취급합니다.
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
에서는 모델 표현식의 변수가 샘플 수보다 많은 경우 오류를 반환하는 구현으로 보입니다.
Reference
이 문제에 관하여(Julia의 CurveFit을 사용한 커브 피팅), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gotz_surf/items/aa09582bb6d6cbf9aa88텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)