Mercurial > hg > camir-aes2014
diff toolboxes/FullBNT-1.0.7/netlab3.3/gradchek.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/FullBNT-1.0.7/netlab3.3/gradchek.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,49 @@ +function [gradient, delta] = gradchek(w, func, grad, varargin) +%GRADCHEK Checks a user-defined gradient function using finite differences. +% +% Description +% This function is intended as a utility for other netlab functions +% (particularly optimisation functions) to use. It enables the user to +% check whether a gradient calculation has been correctly implmented +% for a given function. GRADCHEK(W, FUNC, GRAD) checks how accurate the +% gradient GRAD of a function FUNC is at a parameter vector X. A +% central difference formula with step size 1.0e-6 is used, and the +% results for both gradient function and finite difference +% approximation are printed. The optional return value GRADIENT is the +% gradient calculated using the function GRAD and the return value +% DELTA is the difference between the functional and finite difference +% methods of calculating the graident. +% +% GRADCHEK(X, FUNC, GRAD, P1, P2, ...) allows additional arguments to +% be passed to FUNC and GRAD. +% +% See also +% CONJGRAD, GRADDESC, HMC, OLGD, QUASINEW, SCG +% + +% Copyright (c) Ian T Nabney (1996-2001) + +% Reasonable value for step size +epsilon = 1.0e-6; + +func = fcnchk(func, length(varargin)); +grad = fcnchk(grad, length(varargin)); + +% Treat +nparams = length(w); +deltaf = zeros(1, nparams); +step = zeros(1, nparams); +for i = 1:nparams + % Move a small way in the ith coordinate of w + step(i) = 1.0; + fplus = feval('linef', epsilon, func, w, step, varargin{:}); + fminus = feval('linef', -epsilon, func, w, step, varargin{:}); + % Use central difference formula for approximation + deltaf(i) = 0.5*(fplus - fminus)/epsilon; + step(i) = 0.0; +end +gradient = feval(grad, w, varargin{:}); +fprintf(1, 'Checking gradient ...\n\n'); +delta = gradient - deltaf; +fprintf(1, ' analytic diffs delta\n\n'); +disp([gradient', deltaf', delta'])