I cant seem to figure out why I have a high percentage error.

I'm trying to get a perceptron between X1 and X2 which are Gaussian distributed data sets with distinct means and identical co-variances.

Below is my code:

C= [2 1; 1 2]; %Covariance
m1=[0 2];
m2=[1.5 0];%mean
X1 = mvnrnd(m1, C, N/2);
X2 = mvnrnd(m2, C, N/2);

X = [X1; X2];
X = [X ones(N,1)]; %bias
y = [-1*ones(N/2,1); ones(N/2,1)]; %classification

%Split data into training and test 
ii = randperm(N);
Xtr = X(ii(1:N/2),:);
ytr = X(ii(1:N/2),:);
Xts = X(ii(N/2+1:N),:);
yts = y(ii(N/2+1:N),:);
Nts = N/2;

w = randn(3,1);
eta = 0.001;
%learn from training set
for iter=1:500 
j = ceil(rand*N/2);
if( ytr(j)*Xtr(j,:)*w < 0)
w = w + eta*Xtr(j,:)'; 

%apply what you have learnt to test set
yhts = Xts * w;
disp([yts yhts])
PercentageError = 100*sum(yts .*yhts < 0)/Nts;

What am I doing wrong and how can I address this challenge?

  • 1
    $\begingroup$ I think you should explain the essence of what you are trying to do, and what you have investigated already. "What's wrong with this code" questions aren't that suitable for StackExchange. $\endgroup$
    – Sean Owen
    Commented Oct 29, 2014 at 8:10

2 Answers 2


You are altering weights in the wrong direction for the negative cases.

The line

w = w + eta*Xtr(j,:)';

should be

w = w + eta*Xtr(j,:)'*ytr(j);

With that change I got 12% error.


I think this line is wrong:

ytr = X(ii(1:N/2),:);

ytr should be the label of the training data. In this case, it should be

ytr = y(ii(1:N/2),:);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.