Проблемы при вычислении функции стоимости и градиента регуляризованной логистической регрессии

Я выполняю задание 4-й недели курса Эндрю Нг по машинному обучению на Coursera. Я должен вычислить функцию стоимости и градиент регуляризованной логистической регрессии. Вот что я написал:

function [J, grad] = lrCostFunction(theta, X, y, lambda)
m = length(y); % number of training examples
J = 0;
grad = zeros(size(theta));

n=length(theta);
thetat=theta';
t=thetat(:,[2:n]);
t=t';

J = (-1/m*(sum((log(sigmoid(X*theta)))'*y)+((log(1-sigmoid(X*theta)))'*(1-y))))+((lambda/(2*m))*(sum(t.^2)));

grad=(1/m)*(X'*(sigmoid(X*theta)-y))+((lambda/m)*theta);
grad(1)=(1/m)*(sum(sigmoid(X*theta)-y));

end

Я получаю эту ошибку:

!! Submission failed: operator *: nonconformant arguments (op1 is 16x3, op2 is 4x3)


Function: lrCostFunction
FileName: c:\users\syed\desktop\machine-learning-ex3\ex3\lrCostFunction.m
LineNumber: 19

Please correct your code and resubmit.

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


person Syed Souban    schedule 28.10.2018    source источник


Ответы (1)


вы делаете внутренний продукт матрицы 16x3 с матрицей 4x3 в строке 19, как говорит сама ошибка. переставьте вторую матрицу, и эта ошибка исчезнет.

когда вы хотите сделать внутренний продукт, второе измерение первой матрицы/вектора должно соответствовать первому измерению второй матрицы/вектора.

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

-1/m * sum( ( y .* log(y^) ) + ( (1-y) .* (log(1-y^)) ) )
person leo    schedule 28.10.2018
comment
Я знаю, что вы говорите о соответствии матричного умножения. Я пробовал транспонировать вторую матрицу, но это не помогло. Я попытался отправить тот же код в задании недели 3, и он работает абсолютно нормально. PS: ошибка отображается в строке, в которой вычисляется J. - person Syed Souban; 28.10.2018
comment
Я только что посмотрел вашу ошибку, не посмотрел на код, извините, теперь вы сказали, какая это была строка, я думаю, вы вычисляете потерю перекрестной энтропии, верно? у вас есть ошибки в расчетах. я думаю, в Matlab должно быть что-то вроде этого: -1/m * sum(( y .* log(y^)) + ((1-y).* (log(1-y^)) )) - person leo; 29.10.2018
comment
Я пытаюсь вычислить не перекрестную энтропию. Я пытаюсь вычислить функцию стоимости, т.е. J в приведенном выше коде. кстати, что представляет собой y^? - person Syed Souban; 30.10.2018
comment
перекрестная энтропия — это название функции потерь, которую вы используете для вычисления средней стоимости. y^ означает ваш прогнозируемый результат, который является сигмовидным (X * theta) в вашем коде. - person leo; 31.10.2018