Julia 茱莉亚的例子?
Julia的Julia 茱莉亚的例子?,julia,Julia,Julia的ForwardDiff文档表明,可以使用DiffResultsAPI一次性计算函数值、梯度和Hessian,但没有示例。DiffResults包本身也没有示例,也没有文档可言。这个用例是不言而喻的:假设我有一个向量参数x的函数f,我想用牛顿方法最小化它。下面是一种直截了当的方法,在这种方法中,事情会被重新计算三次——我如何使用衍射结果来编写它呢 function NewtMin(f, x0, eps) fgrad = x-> ForwardDiff.gradient(f
ForwardDiff
文档表明,可以使用DiffResults
API一次性计算函数值、梯度和Hessian,但没有示例。DiffResults
包本身也没有示例,也没有文档可言。这个用例是不言而喻的:假设我有一个向量参数x
的函数f
,我想用牛顿方法最小化它。下面是一种直截了当的方法,在这种方法中,事情会被重新计算三次——我如何使用衍射结果来编写它呢
function NewtMin(f, x0, eps)
fgrad = x-> ForwardDiff.gradient(f, x)
fhess = x-> ForwardDiff.hessian(f, x)
oldval = f(x0)
newx = x0 - fhess(x0)\fgrad(x0)
newval = f(newx)
while abs(newval - oldval) > eps
oldval = newval
newx = newx - fhess(newx)\fgrad(newx)
newval = f(newx)
end
return newx
end
中的衍射结果.jl
文档中有一些示例
这是一个使用衍射结果对Newtmin的简单重写,它在julia v0.6.4中运行。但我想它可以进行重构和优化,使其更加优雅和性能
using ForwardDiff
using DiffResults
function NewtMin(f, x0, eps)
result = DiffResults.HessianResult(x0)
ForwardDiff.hessian!(result, f, x0)
fhess_x0 = DiffResults.hessian(result)
fgrad_x0 = DiffResults.gradient(result)
oldval = DiffResults.value(result)
newx = x0 - fhess_x0\fgrad_x0
newval = f(newx)
while abs(newval - oldval) > eps
oldval = newval
ForwardDiff.hessian!(result, f, newx)
fhess_newx = DiffResults.hessian(result)
fgrad_newx = DiffResults.gradient(result)
newx = newx - fhess_newx\fgrad_newx
newval = f(newx)
end
return newx
end
foo(x) = sum(x.^2)
NewtMin(foo, [1.,1.,1.], 0.01)
## which should give a correct result at [0., 0., 0.]
谢谢那很容易!