Optim.jl로 최적화됨
27343 단어 Juliaoptimizationtech
개시하다
이 기사에서 옵티엠은Julia 언어의 제약 없이 비선형 최적화 패키지를 사용하는 방법을 설명합니다.구체적으로 데이터(예를 들어 가장 유사한 실행 방법 등)를 사용하는 최적화 실행 방법을 설명할 것이다.또 독자가 주리아 언어의 방법(문법)에 대해 한 번 아는 사람을 가정한다.
Optim.무엇이 jl입니까?
Optim.jl는 언어 제약이 없는 비선형 최적화 패키지입니다.이 패키지에는 비선형 최적화 방법으로 Nelder-Mead법, 공멍 사다리법, 준뉴턴법 등의 함수가 제공된다.또한 The Journal of Open Source Software를 통해 검색한 결과 함수의 신뢰성이 높다고 할 수 있다.현대 과학에서 최적화 이론은 기계 학습과 스케줄링 문제 등 각종 분야의 기초를 맡고 그 중요성이 매일 증가하고 있다.그래서 이 기사에서 옵티엠은jl의 최적화 방법을 사용한 것에 대해 설명하다.구체적으로 말하면
함수 최적화
우선, 일반적인 함수에 대한 최적화 문제를 설명한다.여기 있다
y = (x-2)^2 + 4
함수의 최소화 문제를 예로 들다.이 함수의 최소값의 이론은 x=2에서 y=4의 값을 얻는다.이 이론적 해석을 바탕으로 Optim이 제공한 최적화 방법을 사용하여 수치해석을 도출한다.
뉴스 매체법
Nelder Mead 메서드는 제약이 없는 비선형 최적화 문제를 해결하는 데 사용되는 알고리즘입니다.이 알고리즘은 목적 함수만 정의하면 실행할 수 있는 최적화 알고리즘이다.따라서 뒤에 소개한 방법에 비해 정밀도와 수렴 속도가 느리다.
그럼 제가 Nelder Mead법의 집행 방법을 설명하겠습니다.Optim에서 최적화를 수행하려면 optimize 함수를 사용합니다.구체적으로 말하면
using Optim
# target variable
f(x) = (x[1]-2)^2 + 4
#template: optmize(目的関数, 初期値, method = NelderMead())
optimize(f, [1.], method = NelderMead())
공멍 사다리법
멍에 사다리법은 Nelder Mead법과 달리 사다리(Jacobbian)가 필요하다.반면 Nelder Mead보다 정밀도와 수렴 속도가 더 좋은 성능을 가졌다.
그러면 공멍 사다리법의 집행 방법을 설명한다.Optim에서 사용할 수 있는 Jacobbian의 함수 j의 형식이 결정되었습니다.구체적으로 j(jaccobian:Vector, 최적화 매개 변수,other independent variables...)이렇게 결정하다.따라서 다음과 같은 공멍 사다리법을 집행한다.
using Optim
# target variable
f(x) = (x[1] - 2)^2 + 4
function j(J::Vector, x)
J[1] = 2 *(x[1] - 2)
end
#template: optmize(目的関数, jacobbian, 初期値, method = ConjugateGradient())
optimize(f,j , [1.], method = ConjugateGradient())
준뉴턴법
준뉴턴법에는 Hessian과 Jacobbian 두 개를 입력해야 한다.이것은 가장 자주 사용하는 최적화 방법으로 정확도와 수렴 속도가 모두 매우 좋다.
그럼, 내가 뉴턴법의 집행 방법을 설명할게.Optim에서 사용할 수 있는 Hessian의 함수 j의 형식이 결정됩니다.구체적으로 h(Hessian:Matrix, 최적화 매개변수, other independent variables...)이렇게 결정하다.따라서 다음과 같은 공멍 사다리법을 집행한다.
using Optim
# target variable
f(x) = (x[1] - 2)^2 + 4
function j(J, x)
J[1] = 2 *(x[1] - 2)
end
function h(H::Matrix, x)
H[1,1] = 2
end
#template: optmize(目的関数, jacobbian, 初期値, method = ConjugateGradient())
optimize(f,j , H, [1.], method = Newton())
데이터 최적화 사용
Optim.jl에서 psyhon 언어의 scipy입니다.optimize에서 제공하는 kwarg={"x":x} 형식의 데이터를 전달할 인자가 준비되지 않았습니다.따라서 Optim에서 사용 데이터의 최적화를 위해서는 function-like object를 사용해야 한다.functi-like object는 "Juria에 정의된 모든 객체가 함수 기능을 동시에 유지할 수 있는 성질"을 말합니다.예를 들어 구조struct가functi-likeobject의 성질을 동시에 가지도록 하는 방법을 설명한다.
# I strongly recommend you to define the type of struct obviously.
struct test{Type}
x::Type
end
s = test(2.0)
# add function onto test object.
function (s::test)(x)
# test型の構造体 sが参照可能
# 今回の例だと、s.x = 2.0を参照できる
return s.x^(x)
end
function-like object를 이렇게 정의할 수 있습니다.그 가장 큰 특성은 함수 내에서 Object의 상태를 매개 변수로 찾을 수 있다는 것이다.예를 들어 이번에 정의된'test'구조's'의 행위는 하나의 예이다.'s'대상은 이 정의의function-like object로 함수에서 선언할 때의 상태's.x=2'를 참고할 수 있습니다.따라서 정의된 s(x) 함수는's.x^x=2^x'의 값을 되돌려줍니다.이 성질을 이용하면 Optim.매개 변수는 jl의 최적화 함수로 전달할 수 있습니다.마지막으로 데이터 전달의 최적화 방법의 구체적인 예를 소개한다.여기 있다
y = (x-2)^2 + 4 +\epsilon,
where\epsilon\sim N(0,1).생성된 데이터 세트
\argmin_{\beta}\sum (y - x\beta)^2
예.
struct target
y::Vector
x::Matrix
end
x = collect(-10:0.1:100)
y = (x .-2).^2 .+ 4 .+ randn(length(x))
X = ones(length(x),3)
X[:,2] .= x
X[:,3] .= x.^2
F = target(y,X)
function (F::target)(β)
return sum( (F.y .- F.x *β).^2 )
end
JJ = target(y,X)
function (JJ::target)(G,β)
G[1] = sum( -2 .*(JJ.y - JJ.x * β) .* JJ.x[:,1] )
G[2] = sum( -2 .*(JJ.y - JJ.x * β) .* JJ.x[:,2] )
G[3] = sum( -2 .*(JJ.y - JJ.x * β) .* JJ.x[:,3] )
end
HH = target(y,X)
function (HH::target)(H::Matrix,β)
H[1,1] = sum( -2 .*(HH.x[:,1] .* HH.x[:,1]) )
H[1,2] = sum( 2 .* (HH.x[:,2] .* HH.x[:,1]) )
H[1,3] = sum( 2 .* (HH.x[:,3] .* HH.x[:,1]) )
H[2,1] = sum( 2 .* (HH.x[:,1] .* HH.x[:,2]) )
H[2,2] = sum( -2 .*(HH.x[:,2] .* HH.x[:,2]) )
H[2,3] = sum( 2 .*(HH.x[:,3] .* HH.x[:,2]) )
H[3,1] = sum( 2 .* (HH.x[:,1] .* HH.x[:,3]) )
H[3,2] = sum( 2 .* (HH.x[:,2] .* HH.x[:,3]) )
H[3,3] = sum( -2 .*(HH.x[:,3] .* HH.x[:,3]) )
end
opt = optimize(F,JJ,HH,[1.,1.,1.], method= Newton())
Optim.minimizer(opt)
이 과정에 따라 데이터를 사용하는 최적화 방법을 사용할 수 있다.
Reference
이 문제에 관하여(Optim.jl로 최적화됨), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/yukisato_jpn/articles/35a33de64af84d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)