Problem while implementing "Gradient Descent Algorithm" in Matlab

23 ビュー (過去 30 日間)
Atinesh S
Atinesh S 2015 年 4 月 11 日
コメント済み: Ashok Saini 2022 年 7 月 4 日
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 件のコメント
Nancy Irisarri
Nancy Irisarri 2019 年 5 月 13 日
Calculation of k can be outside the for loop. Improves performance!
Ashok Saini
Ashok Saini 2022 年 7 月 4 日
hey have u found answer of your question

サインインしてコメントする。

採用された回答

Matt J
Matt J 2015 年 4 月 11 日
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 件のコメント
Atinesh S
Atinesh S 2015 年 4 月 11 日
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 2015 年 4 月 12 日
k is not a scalar. You defined it to be the vector 1:m. Therefore X(k,2) is also a vector.

サインインしてコメントする。

その他の回答 (11 件)

Jayan Joshi
Jayan Joshi 2019 年 10 月 15 日
編集済み: Jayan Joshi 2019 年 10 月 15 日
predictions =X*theta;
theta=theta-(alpha/m*sum((predictions-y).*X))';

Margo Khokhlova
Margo Khokhlova 2015 年 10 月 19 日
編集済み: Walter Roberson 2015 年 10 月 19 日
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);
  1 件のコメント
Nancy Irisarri
Nancy Irisarri 2019 年 5 月 13 日
Calculation of k can be outside the for loop. Improves performance!

サインインしてコメントする。


Shekhar Raj
Shekhar Raj 2019 年 9 月 19 日
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 件のコメント
Jayan Joshi
Jayan Joshi 2019 年 10 月 15 日
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 2021 年 1 月 24 日
How did you manage to vectorize it that much? I don't understand how to translate the formula to code, seems confusing

サインインしてコメントする。


Sesha Sai Anudeep Karnam
Sesha Sai Anudeep Karnam 2019 年 8 月 7 日
編集済み: Sesha Sai Anudeep Karnam 2019 年 8 月 7 日
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 件のコメント
Shekhar Raj
Shekhar Raj 2019 年 9 月 19 日
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 2021 年 8 月 15 日
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

サインインしてコメントする。


ICHEN WU
ICHEN WU 2015 年 11 月 8 日
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 件のコメント
pavan B
pavan B 2017 年 2 月 20 日
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 2017 年 4 月 6 日
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.

サインインしてコメントする。


Ali Dezfooli
Ali Dezfooli 2016 年 6 月 17 日
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 2018 年 3 月 17 日
Looking at the problem, I also think that you cannot initiate Theta as Zero.

Rajeswari G
Rajeswari G 2021 年 1 月 2 日
error = (X * theta) - y;
theta = theta - ((alpha/m) * X'*error);
In this equation why we take x'?
  1 件のコメント
Bee Ling TAN
Bee Ling TAN 2021 年 8 月 15 日
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.

サインインしてコメントする。


Wamin Thammanusati
Wamin Thammanusati 2021 年 2 月 21 日
編集済み: Wamin Thammanusati 2021 年 2 月 21 日
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 件のコメント
Amber Hall
Amber Hall 2021 年 8 月 15 日
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?

サインインしてコメントする。


Chong Lu
Chong Lu 2021 年 11 月 16 日
編集済み: Walter Roberson 2021 年 11 月 27 日
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 2021 年 11 月 27 日

カテゴリ

Help Center および File ExchangeMATLAB についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by