Julia 使用梯度误差的Optim:“;“无方法匹配”;

Julia 使用梯度误差的Optim:“;“无方法匹配”;,julia,Julia,我试图用一种需要梯度的算法来优化函数。基本上,我想学习如何使用Julia中的梯度优化函数。我很有信心我的梯度是正确指定的。我知道这一点,因为类似定义的梯度的Matlab函数给出的值与Julia中的参数测试值相同。此外,Matlab版本使用带有梯度的fminunc似乎可以很好地优化函数 但是,当我运行Julia脚本时,似乎出现以下错误: julia> include("ex2b.jl") ERROR: `g!` has no method matching g!(::Array{Float6

我试图用一种需要梯度的算法来优化函数。基本上,我想学习如何使用Julia中的梯度优化函数。我很有信心我的梯度是正确指定的。我知道这一点,因为类似定义的梯度的Matlab函数给出的值与Julia中的参数测试值相同。此外,Matlab版本使用带有梯度的fminunc似乎可以很好地优化函数

但是,当我运行Julia脚本时,似乎出现以下错误:

julia> include("ex2b.jl")
ERROR: `g!` has no method matching g!(::Array{Float64,1}, ::Array{Float64,1})
while loading ...\ex2b.jl, in ex
pression starting on line 64
我正在Windows7 32位机器上运行Julia 0.3.2。以下是代码(基本上是一些Matlab到Julia的翻译):

以下是一些数据:

0.051267,0.69956,1
-0.092742,0.68494,1
-0.21371,0.69225,1
-0.375,0.50219,1
-0.51325,0.46564,1
-0.52477,0.2098,1
-0.39804,0.034357,1
-0.30588,-0.19225,1
0.016705,-0.40424,1
0.13191,-0.51389,1
0.38537,-0.56506,1
0.52938,-0.5212,1
0.63882,-0.24342,1
0.73675,-0.18494,1
0.54666,0.48757,1
0.322,0.5826,1
0.16647,0.53874,1
-0.046659,0.81652,1
-0.17339,0.69956,1
-0.47869,0.63377,1
-0.60541,0.59722,1
-0.62846,0.33406,1
-0.59389,0.005117,1
-0.42108,-0.27266,1
-0.11578,-0.39693,1
0.20104,-0.60161,1
0.46601,-0.53582,1
0.67339,-0.53582,1
-0.13882,0.54605,1
-0.29435,0.77997,1
-0.26555,0.96272,1
-0.16187,0.8019,1
-0.17339,0.64839,1
-0.28283,0.47295,1
-0.36348,0.31213,1
-0.30012,0.027047,1
-0.23675,-0.21418,1
-0.06394,-0.18494,1
0.062788,-0.16301,1
0.22984,-0.41155,1
0.2932,-0.2288,1
0.48329,-0.18494,1
0.64459,-0.14108,1
0.46025,0.012427,1
0.6273,0.15863,1
0.57546,0.26827,1
0.72523,0.44371,1
0.22408,0.52412,1
0.44297,0.67032,1
0.322,0.69225,1
0.13767,0.57529,1
-0.0063364,0.39985,1
-0.092742,0.55336,1
-0.20795,0.35599,1
-0.20795,0.17325,1
-0.43836,0.21711,1
-0.21947,-0.016813,1
-0.13882,-0.27266,1
0.18376,0.93348,0
0.22408,0.77997,0

如果你们需要更多的细节,请告诉我。顺便说一句,如果好奇,这与coursera机器学习课程有关。

梯度不应该是计算梯度的函数, 而是一个存储它的函数 (因此函数名中有感叹号,错误消息中有第二个参数)

下面的方法似乎有效

function g!(theta::Array, storage::Array) 
  storage[:] = costFunc_logistic_gradient!(theta, X, y, lam, m)
end
optimize(f, g!, theta, method = :l_bfgs)

使用闭包和currying(对于那些习惯于返回成本和梯度的函数的人来说,版本是相同的):

然后,在代码中的某个地方:

initialθ = zeros(n,1);
f, g! = cost_gradient(initialθ, X, y, λ);
res = optimize(f, g!, initialθ, method = :cg, iterations = your_iterations);
θ = res.minimum;

对我来说,
g
是在一个数组上定义的,但随后用两个数组作为输入调用。这可能是问题的一部分吗?文森特,确实如此。谢谢你的帮助。
function cost_gradient(θ, X, y, λ)
    m = length(y);
    return (θ::Array) -> begin 
        h = sigmoid(X * θ); #(m,n+1)*(n+1,1) -> (m,1)
        J = (1 / m) * sum(-y .* log(h) .- (1 - y) .* log(1 - h)) + λ / (2 * m) * sum(θ[2:end] .^ 2);        
    end, (θ::Array, storage::Array) -> begin  
        h = sigmoid(X * θ); #(m,n+1)*(n+1,1) -> (m,1)
        storage[:] = (1 / m) * (X' * (h .- y)) + (λ / m) * [0; θ[2:end]];       
    end
end
initialθ = zeros(n,1);
f, g! = cost_gradient(initialθ, X, y, λ);
res = optimize(f, g!, initialθ, method = :cg, iterations = your_iterations);
θ = res.minimum;