Optim.jl로 최적화됨

27343 단어 Juliaoptimizationtech

개시하다


이 기사에서 옵티엠은Julia 언어의 제약 없이 비선형 최적화 패키지를 사용하는 방법을 설명합니다.구체적으로 데이터(예를 들어 가장 유사한 실행 방법 등)를 사용하는 최적화 실행 방법을 설명할 것이다.또 독자가 주리아 언어의 방법(문법)에 대해 한 번 아는 사람을 가정한다.

Optim.무엇이 jl입니까?


Optim.jl는 언어 제약이 없는 비선형 최적화 패키지입니다.이 패키지에는 비선형 최적화 방법으로 Nelder-Mead법, 공멍 사다리법, 준뉴턴법 등의 함수가 제공된다.또한 The Journal of Open Source Software를 통해 검색한 결과 함수의 신뢰성이 높다고 할 수 있다.현대 과학에서 최적화 이론은 기계 학습과 스케줄링 문제 등 각종 분야의 기초를 맡고 그 중요성이 매일 증가하고 있다.그래서 이 기사에서 옵티엠은jl의 최적화 방법을 사용한 것에 대해 설명하다.구체적으로 말하면
  • 함수에 대한 최적화
  • Nelder – Mead 법
  • 공멍 사다리법
  • 준뉴턴법
  • 데이터 사용 최적화
  • 를 참고하십시오.

    함수 최적화


    우선, 일반적인 함수에 대한 최적화 문제를 설명한다.여기 있다
    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)
    
    이 과정에 따라 데이터를 사용하는 최적화 방법을 사용할 수 있다.

    좋은 웹페이지 즐겨찾기