【问题标题】:from Octave's fminunc to Julia's optimize with gradient function with parameters从 Octave 的 fminunc 到 Julia 的带参数的梯度函数优化
【发布时间】:2021-02-06 17:36:02
【问题描述】:

我将我的代码从 octave 传递给 julia,在这种情况下是逻辑回归。除了初始 theta 之外,梯度函数还需要 X 和我的特征,Y 和寻找的值。

在 Octave 作品中

function [J, grad] = costFunction(theta, X, y)
options = optimset('GradObj', 'on', 'MaxIter', 400);
[theta, cost] = fminunc(@(t)(costFunction(t, X, y)), initial_theta, options);

关于 Julia 的第一次尝试

optimize(t->CostFunction(t, X1, y), initial_theta, BFGS())

MethodError: 没有方法匹配 -(::Tuple{Float64,Array{Float64,2}}, ::Tuple{Float64,Array{Float64,2}})

所以我将函数分为两部分:成本和梯度

function CostFunction2(theta, X, y)
J = 0;
#m = length(y);
m = size(y,1);
grad = zeros(size(theta));
J = 1/m * sum( (-y .* log.(sigmoid(X*theta))) - ((1.0 .- y) .* log.(1.0 .- sigmoid(X*theta))) );
return J;
end


function Gradient2(X, y, theta)
grad = zeros(size(theta));
grad = (1/m) .* (sum((sigmoid(X*theta).-y) .* X, dims=1))';
return grad;
end

我只输入了成本函数并且它有效,但我没有最后的 theta 值。不知道怎么弄

optimize(t->CostFunction2(t, X1, y), initial_theta, BFGS())

我试过了,但没有用,我找不到任何说明如何或提供示例的参考

optimize(t->CostFunction2(t, X1, y), Gradient2(X, y, t), initial_theta, BFGS())

UndefVarError: t 未定义

如何获得获得的 theta 值?以及如何将我自己的梯度函数包含在各种参数中?

希望你能帮帮我,非常感谢

【问题讨论】:

  • 您能否一次性发布您的整个代码。似乎存在一些简单的问题(很可能是您以不正确的方式混合了标量和向量)。特别注意,在对optimize 的调用中,initial_theta 变量应该是向量而不是标量。
  • data = load('data.txt'); 987654331 [m, n] = size(X); 987654333 initial_theta = zeros(n + 1, 1); 987654335 J = 0; 987654337 grad = zeros(size(theta)); 987654339 grad = (1/m) * (sum((sigmoid(X*theta)-y) .* X))'; 987654341 options = optimset('GradObj', 'on', 'MaxIter', 400); 987654343 @ fprintf('Cost:%f theta:%f \n',cost,theta);
  • ` 使用 DelimitedFiles;数据 = readdlm("ex2data1.txt", ',', Float64); X = 数据[:,1:2]; y = 数据[:,3]; m = 长度(y); `` m,n = 大小(X); X = [个(m,1) X]; initial_theta = zeros(n + 1, 1); `` 函数 CostFunction2(theta, X, y) J = 0; #m = 长度(y); m = 大小(y,1);毕业=零(大小(θ)); J = 1/m * sum( (-y .* log.(sigmoid(Xtheta))) - ((1.0 .- y) .​​ log.(1.0 .- sigmoid(Xθ))));返回 J;结束函数 Gradient2(X, y, theta) grad = zeros(size(theta)); grad = (1/m) . (sum((sigmoid(Xtheta).-y) . X, dims=1))';返回毕业生;结束`
  • ` 使用 Optim;优化(t->CostFunction2(t, X1, y), Gradient2(X, y, t), initial_theta, BFGS()); `
  • 对不起代码格式。第一部分是我在 Octave 中是如何做到的,另外两个是我在 Julia 中是如何做到的。谢谢

标签: matlab optimization julia octave gradient


【解决方案1】:

我已经清除了您代码中的拼写错误,添加了缺失的定义,并删除了不必要的操作。

在这些更改之后,以下工作:

using DelimitedFiles

Data = readdlm("ex2data1.txt", ',', Float64)
X = Data[:,1:2]
y = Data[:,3]
m, n = size(X)
X = [ones(m) X]
initial_theta = zeros(n + 1)

sigmoid(x) = 1 / (1 + exp(-x))

function CostFunction2(theta, X, y)
    Xt = X*theta # do this step outside as it is repeated twice otherwise
    return sum(-y .* log.(sigmoid.(Xt)) .- (1.0 .- y) .* log.(1.0 .- sigmoid.(Xt)))
end

using Optim
optimize(t->CostFunction2(t, X, Y), initial_theta, BFGS())

【讨论】:

  • 感谢这段更清晰的代码,帮助我继续学习更好地编写线性代数和 Julia 的代码。虽然正如我一开始所说,没有梯度函数,它确实对我有用,并且它很好地返回了成本函数的值,只是在这部分我不知道如何取 Theta 的值,解决和我可以用它来获得这笔费用。
  • 我认为的另一部分是语法问题,如何放置我自己的梯度函数,以及它可以接收额外的参数。这不仅仅是我想按原样传递我的 Octave 代码,这只是一个能够传递我有兴趣测试的其他更复杂算法的示例。非常感谢您的关注和帮助。
  • 在这里julianlsolvers.github.io/Optim.jl/latest/#user/… 你可以找到如何传递梯度的解释(我没有用它更新我的答案,因为我没有计算梯度公式,但一般的想法是你传递一个向量也就是说,将梯度作为函数的参数,并且应该在适当的位置进行更新)。为了让梯度函数依赖于一些外部参数,使用闭包(在函数中定义函数)。
  • 非常感谢,这个例子比我见过的更完整。现在我可以得到 Theta,最重要的是它已经对我有用,我错过了“Optim.minimizer”。现在我有了 theta Optim.minimizer(optimize(t->CostFunction2(t, X1, y), initial_theta, BFGS())) Out[21]: 3×1 Array{Float64,2}: -25.16133454707563 0.20623172126187428 0.20147160832867456 现在我将继续尝试如何输入更多参数的梯度函数,这对我来说仍然不清楚。如果我找到方法,我会上传示例,其他人可以使用它。
猜你喜欢
  • 2011-10-28
  • 1970-01-01
  • 2013-07-26
  • 2023-04-04
  • 2018-05-16
  • 2021-07-16
  • 2017-08-05
  • 1970-01-01
  • 2023-03-04
相关资源
最近更新 更多