Trying to plot error
Informazioni
Questa domanda è chiusa. Riaprila per modificarla o per rispondere.
Mostra commenti meno recenti
I'm trying to run this code and get plot of the error as a function of epsilon but im getting blank plot, someone can help?
%
clear all;close all;clc
epsilon=0.0001;
X = randn(2,1000); % make some input data
w = [1;1]; % define a linear function
n = randn(1,1000)*0.1; % produce some noise
Y = w'*X + n; % produce outputs
% scatter3(X(1,:),X(2,:),Y);
for iteration = 1 : 500 %in practice: until stopping
%criterion satisfied
grad = 2*sum(repmat(w'*X-Y,size(X,1),1).*X,2);
w = w - epsilon * grad;
err = sum((Y - w'*X).^2) %just to check
end
plot(err,epsilon)
end
Risposte (1)
Star Strider
il 17 Apr 2018
You never change ‘epsilon’ in your code, so it remains a single scalar value. You need to create a vector from it if you want to plot with respect to it.
If you want to create a vector from ‘err’, subscript it:
err(iteration) = sum((Y - w'*X).^2); %just to check
9 Commenti
rivaldo rivaldo
il 17 Apr 2018
Star Strider
il 17 Apr 2018
You will get a blank plot unless you create a vector for °epsilon’ that is in some way related to it.
After you create a vector for ‘err’, I would just plot it as:
plot(err)
grid
rivaldo rivaldo
il 17 Apr 2018
Star Strider
il 17 Apr 2018
You never changed or updated ‘epsilon’, so it remains a single scalar value. Until you create it as a vector, you cannot plot with respect to it. It has to be a vector the same size as ‘err’ to work with the plot function.
You can plot it with respect to ‘w’ if you change your code in the loop to:
w = w - epsilon * grad;
wv(iteration) = w;
err(iteration) = sum((Y - w'*X).^2); %just to check
then after the loop:
plot(wv, err)
rivaldo rivaldo
il 17 Apr 2018
Make sure to preallocate w and err before the loop. w is a vector so wv(iteration) = w is indeed an error.
numiterations = 500;
wv = zeros(numiterations , 2);
er =zeros(numiterations, 1);
for iteration = 1:numiterations
grad = 2*sum(repmat(w'*X-Y,size(X,1),1).*X,2);
w = w - epsilon * grad;
wv(iteration, :) = w;
err(iteration) = sum((Y - w'*X).^2) %just to check
end
Still no idea what you want to plot against. It can't be epsilon which never changes or w which is a 1x2 vector that changes at each iteration.
rivaldo rivaldo
il 18 Apr 2018
Star Strider
il 18 Apr 2018
Please see my Answer and previous Comments.
You must create epsilon as a vector in order to plot with respect to it.
Try this:
epsilonv = ones(size(err))*epsilon; % Create Vector For ‘epsilon’
plot(epsilonv, err, 'p')
But epsilon is not changing.
What if you did this instead:
clear all;close all;clc
epsilon=0.0001:0.0001:0.0009; %nine entries into epsilon
X = randn(2,1000); % make some input data
w = [1;1]; % define a linear function
n = randn(1,1000)*0.1; % produce some noise
Y = w'*X + n; % produce outputs
numiterations = 500;
wv = zeros(numiterations , 2);
err =zeros(numiterations, 1);
for j = 1:numel(epsilon)
e = epsilon(j);
for iteration = 1:numiterations
grad = 2*sum(repmat(w'*X-Y,size(X,1),1).*X,2);
w = w - e * grad;
wv(iteration, :) = w;
err(iteration,j) = sum((Y - w'*X).^2); %just to check
end
end
plot(epsilon,err(end,:)); %plot err at the final iteration against epsilon
Questa domanda è chiusa.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!