Problem while implementing "Gradient Descent Algorithm" in Matlab

1.388 views (last 30 days)
Atinesh S
Atinesh S on 11 Apr 2015
Edited: Walter Roberson on 27 Nov 2021 at 21:34
I'm solving a programming assignment in machine learning course. In which I've to implement "Gradient Descent Algorithm" like below
I'm using the following code
data = load('ex1data1.txt');
% text file conatins 2 values in each row separated by commas
X = [ones(m, 1), data(:,1)];
theta = zeros(2, 1);
iterations = 1500;
alpha = 0.01;
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
m = length(y); % number of training examples
J_history = zeros(num_iters, 1);
for iter = 1:num_iters
k=1:m;
j1=(1/m)*sum((theta(1)+theta(2).*X(k,2))-y(k))
j2=((1/m)*sum((theta(1)+theta(2).*X(k,2))-y(k)))*(X(k,2))
theta(1)=theta(1)-alpha*(j1);
theta(2)=theta(2)-alpha*(j2);
J_history(iter) = computeCost(X, y, theta);
end
end
theta = gradientDescent(X, y, theta, alpha, iterations);
On running the above code I'm getting this error message

Accepted Answer

Matt J
Matt J on 11 Apr 2015
j2 is not a scalar, but you are trying to assign it to a scalar location theta(2).
Did you intend for this line
k=1:m;
to be a for-loop
for k=1:m
  2 Comments
Matt J
Matt J on 12 Apr 2015
k is not a scalar. You defined it to be the vector 1:m. Therefore X(k,2) is also a vector.

Sign in to comment.

More Answers (11)

Jayan Joshi
Jayan Joshi on 15 Oct 2019
Edited: Jayan Joshi on 15 Oct 2019
predictions =X*theta;
theta=theta-(alpha/m*sum((predictions-y).*X))';

Margo Khokhlova
Margo Khokhlova on 19 Oct 2015
Edited: Walter Roberson on 19 Oct 2015
Well, sort of super late, but you just made it wrong with the brackets... This one works for me:
k=1:m;
j1=(1/m)*sum((theta(1)+theta(2).*X(k,2))-y(k))
j2=(1/m)*sum(((theta(1)+theta(2).*X(k,2))-y(k)).*X(k,2))
theta(1)=theta(1)-alpha*(j1);
theta(2)=theta(2)-alpha*(j2);

Shekhar Raj
Shekhar Raj on 19 Sep 2019
Below Code works for me -
Prediction = X * theta;
temp1 = alpha/m * sum((Prediction - y));
temp2 = alpha/m * sum((Prediction - y) .* X(:,2));
theta(1) = theta(1) - temp1;
theta(2) = theta(2) - temp2;
  2 Comments
Lomg Ma
Lomg Ma on 24 Jan 2021
How did you manage to vectorize it that much? I don't understand how to translate the formula to code, seems confusing

Sign in to comment.


Sesha Sai Anudeep Karnam
Sesha Sai Anudeep Karnam on 7 Aug 2019
Edited: Sesha Sai Anudeep Karnam on 7 Aug 2019
temp0 = theta(1)-alpha*((1/m)*(theta(1)+theta(2).*X(k,2)-y(k)));
temp1 = theta(2)- alpha*((1/m)*(theta(1)+theta(2).*X(k,2)-y(k)).*X(k,2));
theta(1) = temp0;
theta(2) = temp1;
% this code gives approximate values but while submitting I'm getting 0points for this
% Theta found by gradient descent:
% -3.588389
% 1.123667
% Expected theta values (approx)
% -3.6303
% 1.1664
% How to overcome this??
  2 Comments
Amber Hall
Amber Hall on 15 Aug 2021
i've tried this code but still get error due to not enough input arguments for m = length(y) ? do you know what may be the cause as it appears i have coded correctly

Sign in to comment.


ICHEN WU
ICHEN WU on 8 Nov 2015
Can you tell me why my answer is not correct? I felt they are the same.
theta(1)=theta(1)-(alpha/m)*sum( (X*theta)-y);
theta(2)=theta(2)-(alpha/m)*sum( ((X*theta)-y)'*X(:,2));
  5 Comments
Leon Cai
Leon Cai on 6 Apr 2017
yea I tried h = X*theta and it didn't work too, I'm thinking that when we use the variable h, as we update theta, the value of h will remain unchanged.

Sign in to comment.


Ali Dezfooli
Ali Dezfooli on 17 Jun 2016
In this line
X = [ones(m, 1), data(:,1)];
You add bias to your X, but in the formula of your picture (Ng's slides) when you want to compute theta(2) you should remove it.

Utkarsh Anand
Utkarsh Anand on 17 Mar 2018
Looking at the problem, I also think that you cannot initiate Theta as Zero.

Rajeswari G
Rajeswari G on 2 Jan 2021
error = (X * theta) - y;
theta = theta - ((alpha/m) * X'*error);
In this equation why we take x'?
  1 Comment
Bee Ling TAN
Bee Ling TAN on 15 Aug 2021
This is because X is a 97x2 matrix. To perform dot products, only X' (2x97)will make the answer valid to be 2x1 vectors, entrys are theta(1)&theta(2) respectively.

Sign in to comment.


Wamin Thammanusati
Wamin Thammanusati on 21 Feb 2021
Edited: Wamin Thammanusati on 21 Feb 2021
The code below works for this case (one variable) and also multiple variables -
for iter = 1:num_iters
Hypothesis = X * theta;
for i=1:size(X,2)
theta(i) = theta(i) - alpha/m * sum((Hypothesis-y) .* X(:,i));
end
end
  1 Comment
Amber Hall
Amber Hall on 15 Aug 2021
having tried the same code i am struggling to understand what i am doing wrong - i receive error due to not enough jnput arguments for m = length(y) line. do you have any ideas?

Sign in to comment.


Chong Lu
Chong Lu on 16 Nov 2021 at 22:37
Edited: Walter Roberson on 27 Nov 2021 at 21:34
temp1 = theta(1) - alpha*(sum(X*theta - y)/m);
temp2 = theta(2) - alpha*(sum((X*theta - y).*X(:,2))/m);
theta(1) = temp1;
theta(2) = temp2;

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by