gpt4 book ai didi

performance - 使用 `Optim` 优化非线性函数(样条近似)会产生低性能

转载 作者:行者123 更新时间:2023-12-05 04:22:56 28 4
gpt4 key购买 nike

我在使用 Optim 包时遇到问题。

我的优化问题涉及非线性函数。

目标函数及其梯度通过样条生成计算。

因此,我在它们上面添加了 Spline2 包的 s

然而,尽管它给出了预期的解决方案,但这个过程会消耗大量时间。

甚至是其 R 编程对手的 4 倍。

(如果需要我可以发布R代码)

我想知道 julia 的 Optim 包在解决这类问题时表现不佳,例如具有非代数部分的梯度。

这是我的代码的一个工作示例。

using Splines2
using LinearAlgebra
using Optim
using Distributions



## basic settings (its codes are irrelevant to questions)
n=200
p=100
q=100
r=10

X = randn(n, p)
Y = randn(n, q)
B = ones(p, r) ./ p
G = ones(q, r) ./ q
Z = (X * B + Y * G)
Z_c = Z .- mean(Z, dims = 1)
Z = Z_c ./ mapslices(std, Z_c, dims = 1)
theta = convert(Array{Float64}, LinRange(-3.8, 4, 5))
knots = convert(Array{Float64}, LinRange(-7.2, 7.5, 9))
coef = (3*diff(vcat(0, theta, 0)) ./ (knots[4:end] - knots[1:end-3]))[2:end-1]

function link_approx(x_v::Array)
local est; local der
est = bs(x_v, knots = knots, order = 4)[:, 3:end-3] * theta
der = bs(x_v, knots = knots, order = 3)[:, 3:end-3] * coef
return Dict{Symbol, Array{Float64}}(:est => est, :der => der)
end


## Why it takes so long time?

@time for j in 1:r
# for update G
function grad!(storage, gamma)
local linkfit
linkfit = link_approx(Y*gamma)

output = transpose(Y) * ((X*B[:,j] + linkfit[:est] - Z[:,j]) .* linkfit[:der])./n

for i in 1:size(Y)[2]
storage[i] = output[i]
end
end

function obj(gamma)
return norm(Z[:,j] - X* B[:,j] - link_approx(Y*gamma)[:est], 2)^2/(2*n)
end

temp = optimize(obj, grad!, G[:,j], BFGS(), Optim.Options(iterations = Int(5e1)))
G[:,j] = Optim.minimizer(temp)

end

这些代码在我的笔记本电脑(第 9 代 Intel CPU i7-9750H,16GB 内存)上花费了大约 5 秒。

我认为我的代码中的 grad! 有问题。

我应该使用 for 循环来填充它的存储空间,以避免我所知道的错误。

最佳答案

您也可以考虑使用 lbfgs 的另一种实现,我尝试了以下方法,这似乎更快。

using JSOSolvers, ManualNLPModels

@time for j in 1:r
function obj(gamma)
return norm(Z[:,j] - X* B[:,j] - link_approx(Y*gamma)[:est], 2)^2/(2*n)
end

function grad!(storage, gamma)
local linkfit
linkfit = link_approx(Y*gamma)

output = transpose(Y) * ((X*B[:,j] + linkfit[:est] - Z[:,j]) .* linkfit[:der])./n

for i in 1:size(Y)[2]
storage[i] = output[i]
end
return storage
end

nvar = size(Y)[2]
x0 = zeros(nvar)
nlp = NLPModel(x0, obj, grad = grad!)
stats = lbfgs(nlp, max_eval = Int(5e1))
G[:,j] = stats.solution

end

关于performance - 使用 `Optim` 优化非线性函数(样条近似)会产生低性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73862145/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com