Градиентный спуск не удается для нескольких переменных, приводит к 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 ответа:
Я реализовал этот алгоритм в 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, и это то, что предостерегает код давать неправильно выход