Problem while implementing "Gradient Descent Algorithm" in Matlab

23 visualizzazioni (ultimi 30 giorni)
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
  3 Commenti
Nancy Irisarri
Nancy Irisarri il 13 Mag 2019
Calculation of k can be outside the for loop. Improves performance!

Accedi per commentare.

Risposta accettata

Matt J
Matt J il 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 Commenti
Atinesh S
Atinesh S il 11 Apr 2015
Why j2 is not scalar, the expression
(1/m)*sum((theta(1)+theta(2).*X(k,2))-y(k))
is producing scalar result which can be multiplied by
X(k,2)
to produce scalar result. But on the matlab, I've also seen the result that is going to be stored in j2 is a vector. But Why ??
Matt J
Matt J il 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.

Accedi per commentare.

Più risposte (11)

Jayan Joshi
Jayan Joshi il 15 Ott 2019
Modificato: Jayan Joshi il 15 Ott 2019
predictions =X*theta;
theta=theta-(alpha/m*sum((predictions-y).*X))';

Margo Khokhlova
Margo Khokhlova il 19 Ott 2015
Modificato: Walter Roberson il 19 Ott 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 il 19 Set 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 Commenti
Jayan Joshi
Jayan Joshi il 15 Ott 2019
Thank you this really helped. I tried more vectorized form of this and it worked.
predictions =X*theta;
theta=theta-(alpha/m*sum((predictions-y).*X))';
Lomg Ma
Lomg Ma il 24 Gen 2021
How did you manage to vectorize it that much? I don't understand how to translate the formula to code, seems confusing

Accedi per commentare.


Sesha Sai Anudeep Karnam
Sesha Sai Anudeep Karnam il 7 Ago 2019
Modificato: Sesha Sai Anudeep Karnam il 7 Ago 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 Commenti
Shekhar Raj
Shekhar Raj il 19 Set 2019
Below code gave the exact value -
for iter = 1:num_iters
% ====================== YOUR CODE HERE ======================
% Instructions: Perform a single gradient step on the parameter vector
% theta.
%
% Hint: While debugging, it can be useful to print out the values
% of the cost function (computeCost) and gradient here.
%
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;
% ============================================================
Amber Hall
Amber Hall il 15 Ago 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

Accedi per commentare.


ICHEN WU
ICHEN WU il 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 Commenti
pavan B
pavan B il 20 Feb 2017
above one works perfect .try below code of mine too
earlier i used h = X * theta; a0 = (1/m)*sum((h-y)); a1 = (1/m)*sum((h-y)'*x1); surprisingly it didn't work
working code: x1 = X(:,2); a0 = (1/m)*sum((X * theta-y)); a1 = (1/m)*sum((X * theta-y)'*x1); a = [a0;a1]; theta = theta- (alpha*a);
if anyone find out whats wrong with my earlier code it would be appreciated.
Leon Cai
Leon Cai il 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.

Accedi per commentare.


Ali Dezfooli
Ali Dezfooli il 17 Giu 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 il 17 Mar 2018
Looking at the problem, I also think that you cannot initiate Theta as Zero.

Rajeswari G
Rajeswari G il 2 Gen 2021
error = (X * theta) - y;
theta = theta - ((alpha/m) * X'*error);
In this equation why we take x'?
  1 Commento
Bee Ling TAN
Bee Ling TAN il 15 Ago 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.

Accedi per commentare.


Wamin Thammanusati
Wamin Thammanusati il 21 Feb 2021
Modificato: Wamin Thammanusati il 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 Commento
Amber Hall
Amber Hall il 15 Ago 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?

Accedi per commentare.


Chong Lu
Chong Lu il 16 Nov 2021
Modificato: Walter Roberson il 27 Nov 2021
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;

muhammad zohaib
muhammad zohaib il 27 Nov 2021

Categorie

Scopri di più su MATLAB in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by