我试图在 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
我相信矢量化可能是一种至关重要的方法,不是吗?
在这种情况下,最大的收益是改变所使用的优化算法:
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),但通常很容易决定。