Julia 中 for 循环的向量化

问题描述 投票:0回答:1

我试图在 Julia 中解决一个简单的优化问题,但由于冗长的 for 循环,执行速度大大减慢。有什么方法可以提高性能吗?

using Optim

function f(a, b, x)
    obj = (x[1] - a)^2 + b
    return obj
end

initial_guess = [1.0]

a = randn(5000000)
b = repeat([0, 1], inner = 2500000)
result = Vector()


for i in 1:5000000
    param_q = optimize(x -> f(a[i], b[i], x), initial_guess, NelderMead())
    param_q = Optim.minimizer(param_q)
    result = push!(result, param_q)
end

我相信矢量化可能是一种至关重要的方法,不是吗?

performance optimization julia vectorization mathematical-optimization
1个回答
0
投票

在这种情况下,最大的收益是改变所使用的优化算法:

julia> function f(a, b, x)
           obj = (x - a)^2 + b
           return obj
       end
f (generic function with 1 method)

julia> @time result = map(a, b) do ai, bi
           param_q = optimize(x -> f(ai, bi, x), -10.0, 10.0)
           param_q = Optim.minimizer(param_q)
           return param_q
       end;
  1.194795 seconds (10.08 M allocations: 806.584 MiB, 21.98% gc time, 3.63% compilation time)

唯一的缺点是我使用的变体需要提供搜索范围(我输入-10到10),但通常很容易决定。

© www.soinside.com 2019 - 2024. All rights reserved.