Вопрос по – Реализация градиентного спуска в октаве

33

Я на самом деле боролся с этим вот уже как 2 месяца. Что отличает их?

hypotheses= X * theta
temp=(hypotheses-y)'
temp=X(:,1) * temp
temp=temp * (1 / m)
temp=temp * alpha
theta(1)=theta(1)-temp

hypotheses= X * theta
temp=(hypotheses-y)'
temp=temp * (1 / m)
temp=temp * alpha
theta(2)=theta(2)-temp



theta(1) = theta(1) - alpha * (1/m) * ((X * theta) - y)' * X(:, 1);
theta(2) = theta(2) - alpha * (1/m) * ((X * theta) - y)' * X(:, 2);

Последний работает. Я просто не знаю, почему ... Я изо всех сил пытаюсь понять необходимость обратной матрицы.

Я не думаю, что это правильная реализация градиентного спуска. Вам необходимо обновить. Обе ваши тэты одновременно должны быть точными.tmpTheta1= theta(1) - alpha * (1/m) * ((X * theta) - y)' * X(:, 1); tmpTheta2= theta(2) - alpha * (1/m) * ((X * theta) - y)' * X(:, 2); theta(1)=tmpTheta1; theta(2)=tmpTheta2; Einar Sundgren

Ваш Ответ

6   ответов
1

h = X * theta   % m-dimensional matrix (prediction, our hypothesis gives per training example)
std_err = h - y  % an m-dimensional matrix of errors (one per training example)
theta = theta - (alpha/m) * X' * std_err

ПомнитеX, это матрица дизайна, и, как таковая, каждая строкаX представляет собой учебный пример, и каждый столбецXXstd_err

3

Start Loop {

temp0 = theta0 - (equation_here);

temp1 = theta1 - (equation_here);


theta0 =  temp0;

theta1 =  temp1;

} End loop
6

Предполагая, что y является матрицей 3x1, вы можете выполнить (гипотезы - y) и получить матрицу 3x1, тогда транспонирование этой 3x1 является матрицей 1x3, назначенной для temp.

Тогда матрица 1x3 устанавливается в тета (2), но это не должно быть матрицей.

Последние две строки вашего кода работают, потому что, используя мои примеры mxn выше,

(X * theta)

(X * theta) - y

Таким образом, транспонирование матрицы 3x1 является матрицей 1x3.

((X * theta) - y)'

3
function [theta, J_history] = gradientDescent(X, y, theta, alpha, num_iters)
% Performs gradient descent to learn theta. Updates theta by taking num_iters 
% gradient steps with learning rate alpha.

% Number of training examples
m = length(y); 
% Save the cost J in every iteration in order to plot J vs. num_iters and check for convergence 
J_history = zeros(num_iters, 1);

for iter = 1:num_iters
    h = X * theta;
    stderr = h - y;
    theta = theta - (alpha/m) * (stderr' * X)';
    J_history(iter) = computeCost(X, y, theta);
end

end
61

Error: User Rate Limit Exceeded

   temp=X(:,2) * temp

Последний пример будет работать, но может быть еще более векторизован, чтобы быть более простым и эффективным.

Я предполагаю, что у вас есть только 1 функция. он будет работать одинаково с несколькими функциями, поскольку все, что происходит, - это добавление дополнительного столбца в матрицу X для каждой функции. В основном вы добавляете вектор единиц к x, чтобы векторизовать перехват.

Error: User Rate Limit Exceeded

Error: User Rate Limit Exceeded

X = data(:, 1); y = data(:, 2);
m = length(y);
X = [ones(m, 1), data(:,1)]; 
theta = zeros(2, 1);        

iterations = 2000;
alpha = 0.001;

for iter = 1:iterations
     theta = theta -((1/m) * ((X * theta) - y)' * X)' * alpha;
end
Error: User Rate Limit Exceeded((1/m) * ((X * theta) - y)' * X)Error: User Rate Limit ExceededthetaError: User Rate Limit Exceededtheta.
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
-8
.
.
.
.
.
.
.
.
.
Spoiler alert












m = length(y); % number of training examples
J_history = zeros(num_iters, 1);

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.
% ========================== BEGIN ===========================


t = zeros(2,1);
J = computeCost(X, y, theta);
t = theta - ((alpha*((theta'*X') - y'))*X/m)';
theta = t;
J1 = computeCost(X, y, theta);

if(J1>J),
    break,fprintf('Wrong alpha');
else if(J1==J)
    break;
end;


% ========================== END ==============================

% Save the cost J in every iteration    
J_history(iter) = sum(computeCost(X, y, theta));
end
end
Error: User Rate Limit Exceeded

Похожие вопросы