Optimization Error: Box constraint optimization (Julia Optim.jl)

Optimization Error: Box constraint optimization (Julia Optim.jl)

我正在尝试 运行 以下代码片段来拟合一些经验数据的曲线,但 Julia Optim.jl 包中的 optimize() 方法一直出现问题。我正在使用 Julia v1.1.0 并安装了所有正确的软件包。我不断收到的错误是:

ERROR: LoadError: MethodError: no method matching optimize(::getfield(Main, Symbol("##13#14")), ::Array{Float64,1}, ::Array{Int32,1}, ::Array{Float64,1}, ::Fminbox{LBFGS{Nothing,LineSearches.InitialStatic{Float64},LineSearches.HagerZhang{Float64,Base.RefValue{Bool}},getfield(Optim, Symbol("##19#21"))},Float64,getfield(Optim, Symbol("##43#45"))})

这是我的代码:

# Loading in dependencies
using Distributions # To use probability & statistics library
using Plots # To visualize results
using Optim # For minimization (curve fitting)

# Empirical data for curve fitting
IM = [1, 2, 3, 4] # x axis variables
pfs = [0.0, 0.0, 0.13, 0.23] # associated probabilities y-axis
n = 1000 # assume this number of independent trials for each x value

# Create functions to evaluate fit between theoretical values and empirical values
theor_vals = x -> cdf.(LogNormal(log(x[1]), x[2]), IM) # Assume lognormal shape and construct CDF with arbitrary fit parameters
likelihood = x -> [pdf(Binomial(n,xx[1]), round(xx[2])) for xx in zip(theor_vals(x),n.*pfs)] # getting likelihood values from binomial distribution for n trials
log_likelihood = x -> log.([xi > 0 ? xi : 1e-30 for xi in likelihood(x)]) # getting log value of likelihood
min_function = x -> -sum(log_likelihood(x)) # summing and switching sign for optimization


# Set inputs for minimization - first index is for the median and second index is for the dispersion (uncertainty)
init_guess = [median(IM), 0.5] # reasonable initial guess
lx = [0.001, 5.0] # lower bound
ux = [5,10] # upper bound

# Using Optim to optimize the objective function and get best curve fit
result = optimize(min_function, lx, ux, init_guess, Fminbox(LBFGS())) # call optimize function
theta, beta_a = result.minimizer # retrieve lognormal fit params

我仍在熟悉 julia 语言,所以我很可能只是没有正确理解文档。在此先感谢您提供的任何帮助或指导!

您必须在代码中修复两件事,一切都会正常:

  1. ux 必须包含浮点数,因此您应该将其定义更改为 ux = [5.0,10.0]
  2. init_guess 必须在优化范围内,这样您就可以,例如将其设置为 init_guess = (lx+ux)/2

鉴于这些更改,您可以 运行 您的代码。这是我得到的结果(我没有从优化规范方面检查您的问题 - 我认为它是正确的;我只是提出了使您的示例 运行 可用的更改):

julia> result = optimize(min_function, lx, ux, init_guess, Fminbox(LBFGS()))
 * Status: success

 * Candidate solution
    Minimizer: [5.00e+00, 5.00e+00]
    Minimum:   1.417223e+03

 * Found with
    Algorithm:     Fminbox with L-BFGS
    Initial Point: [2.50e+00, 7.50e+00]

 * Convergence measures
    |x - x'|               = 8.88e-16 ≰ 0.0e+00
    |x - x'|/|x'|          = 1.26e-16 ≰ 0.0e+00
    |f(x) - f(x')|         = 0.00e+00 ≤ 0.0e+00
    |f(x) - f(x')|/|f(x')| = 0.00e+00 ≤ 0.0e+00
    |g(x)|                 = 8.87e+01 ≰ 1.0e-08

 * Work counters
    Seconds run:   0  (vs limit Inf)
    Iterations:    6
    f(x) calls:    2571
    ∇f(x) calls:   2571