% x, y from exercise 8.3

% some arbitrary values for the slope and the intercept to start with:
position = [-2.0, 10.0];  

% gradient descent:
gradient = [];
errors = [];
count = 1;
eps = 0.0001;
while isempty(gradient) || norm(gradient) > 0.1
    gradient = meanSquaredGradient(x, y, position);
    errors(count) = meanSquaredError(x, y, position);
    position = position - eps .* gradient; 
    count = count + 1;
end

figure()
subplot(2,1,1)
hold on
scatter(x, y, 'displayname', 'data')
xx = min(x):0.01:max(x);
yy = position(1).*xx + position(2);
plot(xx, yy, 'displayname', 'fit')
xlabel('Input')
ylabel('Output')
grid on
legend show
subplot(2,1,2)
plot(errors)
xlabel('optimization steps')
ylabel('error')