Подтвердить что ты не робот

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

Я действительно боролся с этим, как через 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);

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

4b9b3361

Ответ 1

Что вы делаете в первом примере во втором блоке, который вы пропустили, не так ли? Я предполагаю, что вы связали X с вектором из них.

   temp=X(:,2) * temp

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

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

Вы можете обновить 2x1 матрицу данных в одной строке кода. При х конкатенировать вектор из тех, что делает его матрицей nx2, тогда вы можете вычислить h (x) путем умножения на тэта-вектор (2x1), это бит (X * theta).

Вторая часть векторизации - это транспонирование (X * theta) - y), которая дает вам 1 * n-матрицу, которая при умножении на X (матрица n * 2) будет в основном суммировать оба (h (x) - y) x0 и (h (x) -y) x1. По определению оба эти метода выполняются в одно и то же время. Это приводит к 1 * 2 матрице моей новой тета, которую я просто транспонирую снова, чтобы перевернуть вектор так же, как тета-вектор. Затем я могу сделать простое скалярное умножение путем альфа-и векторного вычитания с тета.

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

Ответ 2

В первом случае, если X была матрицей 3x2, а theta были матрицей 2x1, тогда "гипотезы" были бы матрицей 3x1.

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

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

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

(X * theta)

будет матрицей 3x1.

Затем эту матрицу 3x1 вычитают через y (матрица 3x1), а результат представляет собой матрицу 3x1.

(X * theta) - y

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

((X * theta) - y)'

Наконец, матрица 1x3, умноженная на матрицу 3x1, будет равна скалярной или 1x1-матрице, что и есть то, что вы ищете. Я уверен, что вы уже знали, но для тщательной проверки X (:, 2) является вторым столбцом матрицы 3x2, что делает его матрицей 3x1.

Ответ 3

При обновлении вам нужно сделать, например

Start Loop {

temp0 = theta0 - (equation_here);

temp1 = theta1 - (equation_here);


theta0 =  temp0;

theta1 =  temp1;

} End loop

Ответ 4

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

Ответ 5

.
.
.
.
.
.
.
.
.
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