2016-07-12 11 views
3

У меня возникли проблемы с правильной настройкой пакета ForwardDiff в Julia. Мне удалось изолировать мою проблему в следующем фрагменте кода.Автоматическая дифференциация с ForwardDiff в Julia

Короче говоря, я определить функцию:

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 

я затем проверить, если функция работает:

# 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 

Затем я пытаюсь получить градиент с помощью:

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

К сожалению, это не удается, и я вижу на своем экране:

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

Что я делаю неправильно? Заранее спасибо.

+0

В ходе дальнейшего расследования мне удалось воспроизвести эту ошибку в еще более простой версии вышеприведенного кода. Я открыл проблему в GIDUB ForwardDiff. Я также отправлю комментарий здесь, как только я получу ответ. – user1438310

ответ

3

Мне только что сообщили, что это была неосторожная ошибка на моей стороне, хотя немного трудно заметить неподготовленный глаз.

Ошибка при вызове нулей:

aux = zeros(N) 

Изменения этого

aux = zeros(eltype(mu),N) 

решает эту проблему. Надеюсь, это полезно для других.