使用Julia中的ForwardDiff自动区分

时间:2016-07-12 09:45:06

标签: julia automatic-differentiation

我在使用Julia中的ForwardDiff包时遇到了一些麻烦。我设法在下面的代码块中隔离了我的问题。

简而言之,我定义了函数:

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)

不幸的是,这失败了,我在屏幕上看到了:

  

错误:MethodError:convert没有方法匹配   convert(:: Type {Float64},:: ForwardDiff.Dual {2,Float64})这可能有   由于类型的调用而产生于对构造函数Float64(...)的调用   构造函数回退转换方法。最接近的候选人是:
  call {T&lt ;: AbstractFloat}(:: Type {T&lt ;: AbstractFloat},:: Real,   :: RoundingMode {T})调用{T}(:: Type {T},:: Any)
  转换(:: Type {Float64},:: Int8)...可能性为无:10英寸   无人匿名:1

我做错了什么?提前谢谢。

1 个答案:

答案 0 :(得分:4)

我刚刚被告知这是我身上的一个不小心的错误,虽然有点难以找到未经训练的眼睛。

错误是调用零:

aux = zeros(N)

将此更改为

aux = zeros(eltype(mu),N)

解决了这个问题。希望这对其他人有用。