2016-07-12 7 views
3

Ich habe Probleme mit der Verwendung der ForwardDiff-Paket in Julia. Ich habe es geschafft, mein Problem in den folgenden Code zu isolieren.Automatische Differenzierung mit ForwardDiff in Julia

Kurz gesagt, definiere ich die Funktion:

using ForwardDiff 

function likelihood(mu,X) 

    N = size(X,2) 

    # Calculate likelihood 
    aux = zeros(N) 
    for nn=1:N 
    aux[nn] = exp(-0.5 * (X[:,nn]-mu)' * (X[:,nn]-mu))[1] 
    end 

    # return log-likelihood 
    return sum(log(aux)) 

end 

ich dann prüfen, ob die Funktion funktioniert:

# Check if function works at all 
X = randn(2,3) # some random data 
mu = [1.0;2.0] # arbitrary mean 
@show likelihood(mu,X) # works fine for me 

ich dann versuchen, den Gradienten zu erhalten, unter Verwendung von:

ForwardDiff.gradient(ARG -> likelihood(ARG, X), mu) 

Leider schlägt das fehl und ich sehe auf meinem Bildschirm:

ERROR: MethodError: convert has no method matching convert(::Type{Float64}, ::ForwardDiff.Dual{2,Float64}) This may have arisen from a call to the constructor Float64(...), since type constructors fall back to convert methods. Closest candidates are:
call{T<:AbstractFloat}(::Type{T<:AbstractFloat}, ::Real, ::RoundingMode{T}) call{T}(::Type{T}, ::Any)
convert(::Type{Float64}, ::Int8) ... in likelihood at none:10 in anonymous at none:1

Was mache ich falsch? Danke im Voraus.

+0

In weiteren Untersuchungen habe ich es geschafft, diesen Fehler in einer noch einfacheren Version des obigen Codes zu reproduzieren. Ich habe ein Problem im ForwardDiff Github geöffnet. Ich werde hier auch einen Kommentar schreiben, sobald ich eine Antwort bekomme. – user1438310

Antwort

3

Ich wurde gerade informiert, dass dies ein unvorsichtiger Fehler auf meiner Seite war, obwohl ein bisschen schwer für das ungeschulte Auge zu erkennen war.

Der Fehler ist auf den Ruf zu Nullen:

aux = zeros(N) 

Ändern dies

aux = zeros(eltype(mu),N) 

löst das Problem. Ich hoffe, dies ist nützlich für andere.