Градиентный спуск не удается для нескольких переменных, приводит к NaN


Я пытаюсь реализовать алгоритм градиентного спуска, чтобы минимизировать функцию стоимости для множественного линейного алгоритма. Я использую концепции, объясненные в классе машинного обучения Эндрю Нг. Я использую Октаву. Однако, когда я пытаюсь выполнить код, он, кажется, не может предоставить решение, поскольку мои значения тета вычисляются до "NaN". Я прикрепил код функции затрат и код градиентного спуска. Может кто-нибудь, пожалуйста, поможет.

Функция затрат:

function J = computeCostMulti(X, y, theta)

m = length(y); % number of training examples

J = 0;

h=(X*theta);
s= sum((h-y).^2);
J= s/(2*m);

Градиент Код Спуска:

function [theta, J_history] = gradientDescentMulti(X, y, theta, alpha, num_iters)

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

for iter = 1:num_iters

  a= X*theta -y;
  b = alpha*(X'*a);
  theta = theta - (b/m);

  J_history(iter) = computeCostMulti(X, y, theta);  
end
2 2

2 ответа:

Я реализовал этот алгоритм в GNU Octave и разделил его на 2 различные функции, сначала вам нужно определить функцию градиента

function [thetaNew] = compute_gradient (X, y, theta, m)
    thetaNew = (X'*(X*theta'-y))*1/m;
end

Затем для вычисления алгоритма градиентного спуска используют другую функцию

function [theta] = gd (X, y, alpha, num_iters)
    theta = zeros(1,columns(X));
    for iter = 1:num_iters,
        theta = theta - alpha*compute_gradient(X,y,theta,rows(y))';                
    end
end

Edit 1 Этот алгоритм работает как для множественной линейной регрессии (множественная независимая переменная) , так и для линейной регрессии 1 независимой переменной, я проверил это с помощью этого набора данных

age height  weight
41  62  115
21  62  140
31  62  125
21  64  125
31  64  145
41  64  135
41  72  165
31  72  190
21  72  175
31  66  150
31  66  155
21  64  140

Для этого примера мы хотим предсказать

predicted weight = theta0 + theta1*age + theta2*height

Я использовал эти входные значения для alpha и num_iters

alpha=0.00037
num_iters=3000000

Результат выполнения градиентного спуска для этого эксперимента выглядит следующим образом:

theta =
-170.10392    -0.40601     4.99799

Таким образом, уравнение

predicted weight = -170.10392 - .406*age + 4.997*height

Это почти абсолютный минимум градиента, так как истинные результаты для эта проблема при использовании PSPP (open source alternative of SPSS) является

predicted weight = -175.17 - .40*age + 5.07*height

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

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

Это тупая ошибка:

То, что я делал раньше

mu= mean(a);
sigma = std(a);
b=(X.-mu);
X= b./sigma;

Вместо того, что я буду делать

function [X_norm, mu, sigma] = featureNormalize(X)
%FEATURENORMALIZE Normalizes the features in X 
%   FEATURENORMALIZE(X) returns a normalized version of X where
%   the mean value of each feature is 0 and the standard deviation
%   is 1. This is often a good preprocessing step to do when
%   working with learning algorithms.

% You need to set these values correctly
X_norm = X;
mu = zeros(1, size(X, 2));
sigma = zeros(1, size(X, 2));

% ====================== YOUR CODE HERE ======================


mu= mean(X);
sigma = std(X);
a=(X.-mu);
X_norm= a./sigma;

% ============================================================

end

Так что ясно, что я должен использовать X_norm insated из X, и это то, что предостерегает код давать неправильно выход