您的位置:首页 > 编程语言 > MATLAB

utilities(matlab)—— 多元函数的数值梯度

2016-05-08 10:04 756 查看
多元函数的数值梯度,用于校验多元函数的解析解(或者书写是否有误)的准确性。

function numgrad = computeNumericGradient(J, theta)
epsilon = 1e-4;
n = size(theta, 1);
numgrad = zeros(n, 1);
for i = 1:n,
tmp1 = theta;
tmp2 = theta;
tmp1(i) = tmp1(i) + epsilon;
tmp2(i) = tmp2(i) - epsilon;
numgrad(i) = (J(tmp1) - J(tmp2))/2/epsilon;
end


简单起见,我们仅以二元函数为例,进行演示,如何进行梯度校验:

>> f = @(x) x(1)^2+x(2)^3;
% 其在 x=[2, 3]' 处的梯度为(解析解)[4, 27]

% 采用数值分析的方式,梯度为:
>> computeNumbericGradient(f, [2, 3]')
ans =
4.0000
27.0000


代码的优化

numgrad = zeros(n, 1);
for i = 1:n,
numgrad(i) = ...;
end


一般都能改造为矢量化的运算方式,暂时我还没想到改造方法。不过 computeNumericGradient 还是太丑陋了,一种稍微矢量化的运算方法如下:

function numgrad = computeNumericGrad(J, theta)
n = length(theta);
numgrad = zeros(n, 1);
epsilon = 1e-4;
thetaMinus = bsxfun(@minus, theta, epsilon*eye(n)) ;
thetaPlus = bsxfun(@plus, theta, epsilon*eye(n));
for i = 1:n,
numgrad(i) = (J(thetaPlus(:, i)) - J(thetaMinus(:, i)))/2/epsilon;
end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: