Нужна помощь в выяснении того, что я сделал неправильно в своем коде градиентного спуска для линейной регрессии с одной переменной - PullRequest
0 голосов
/ 30 июня 2019

Я зачислен на курс машинного обучения Эндрю Нг. И есть задание, которое я, конечно, выполнил ... но код, который я использовал ранее, не работал ... и в конце концов мне пришлось искать правильный ответ в Интернете.

Но в любом случае, под "не работал" я имею в виду, что он работал для этого конкретного вопроса, но дело в том, что когда они проверяют мой код, тогда у них другой набор обучения, поэтому мой код должен работать со всеми типами учебных наборов. для того, чтобы считаться правильным кодом. Но проблема заключалась в том, что мой код не работал с другими обучающими наборами.

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

Так что я все сделал правильно до той части, где мы должны вычислить функцию стоимости. Но когда мне нужно было вычислить градиентный спуск, в этой функции мне нужно было просто написать код для шагов градиентного спуска.

Так вот мой код -

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

% First Step
Prediction = X*theta;
A = (Prediction - y);

theta(1) = theta(1) - ((alpha * (1/m)) * sum(A' * X(:,1)));

% Second Step
Prediction = X*theta;
A = (Prediction - y);

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



J_history(iter) = computeCost(X, y, theta);

end

end

Вот код, который работает, который я нашел в Интернете ... только в одном из потоков в переполнении стека -

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

Prediction = X*theta;
A = (Prediction - y);

theta = theta - ((alpha * (1/m)) * (A' * X)');


J_history(iter) = computeCost(X, y, theta);

end

end

Из того, что я вижу из своего кода, что он должен работать должным образом ... но не знаю, почему он не работает с другими обучающими наборами? Потому что независимо от того, сколько существует обучающих примеров, это всегда будет вектор столбца, или m * 2, если мы добавим x0. Так я не вижу, как мой код не будет работать?

...