This repository has been archived on 2021-05-17. You can view files and clone it, but cannot push or open issues or pull requests.
scientificComputing/regression/exercises/gradientdescent.m

40 lines
1.3 KiB
Matlab

function [p, ps, mses] = gradientdescent(t, x, func, p0, epsilon, threshold)
% Gradient descent for leas squares fit.
%
% Arguments: t, vector of time points.
% x, vector of the corresponding measured data values.
% p0, vector with initial parameter values.
% func, function to be fit to the data.
% epsilon: factor multiplying the gradient.
% threshold: minimum value for gradient
%
% Returns: p, vector with the final estimates of the parameter values.
% ps: 2D vector with all the parameter values traversed.
% mses: vector with the corresponding mean squared errors
p = p0;
gradient = ones(size(p0)) * 1000.0;
ps = [];
mses = [];
while norm(gradient) > threshold
ps = [ps, p(:)];
mses = [mses, meansquarederror(t, x, func, p)];
gradient = msegradient(t, x, func, p);
p = p - epsilon * gradient;
end
end
function mse = meansquarederror(t, x, func, p)
mse = mean((x - func(t, p)).^2);
end
function gradmse = msegradient(t, x, func, p)
gradmse = zeros(size(p));
h = 1e-7; % stepsize for derivative
ph = eye(length(p))*h; % ... for each parameter
mse = meansquarederror(t, x, func, p);
for i = 1:length(p) % for each coordinate ...
msepi = meansquarederror(t, x, func, p(:) + ph(:,i));
gradmse(i) = (msepi - mse)/h;
end
end