2015-10-08 3 views
2
function [J, grad] = costFunction(theta, X, y) 
m = length(y); 
h = sigmoid(X*theta); 
sh = sigmoid(h); 
grad = (1/m)*X'*(sh - y); 
J = (1/m)*sum(-y.*log(sh) - (1 - y).*log(1 - sh)); 

end 

Я пытаюсь вычислить функцию стоимости для логистической регрессии. Может кто-нибудь, пожалуйста, скажите мне, почему это не точно?Logisitic Regression Cost Function

enter image description here

Update: сигмовидной функция

function g = sigmoid(z) 

g = zeros(size(z)); 
g = 1./(1 + exp(1).^(-z)); 

end 
+2

Я просто посмотрел на это, и это кажется правильным ... Может быть, проблема с функцией 'sigmoid'? И правильно ли, что вы используете его дважды (для 'X * theta', а затем еще раз для' h')? Кстати, как вы понимаете, что это не точно? –

+0

Я отправил сигмовидную функцию. Насколько я могу судить, он работает нормально. –

+1

Какая у вас переменная 'm'?. Вы ссылаетесь на него в 'costFunction', но не передаете его. – Justin

ответ

6

Как заявил Дэн, ваш costFunction называет сигмовидной дважды. Во-первых, он выполняет функцию сигмоида на X*theta; то он снова выполняет сигмоидную функцию по результату sigmoid(X*theta). Таким образом, sh = sigmoid(sigmoid(X*theta)). Функция стоимости должна только один раз вызвать функцию сигмоида.

См. Приведенный ниже код, я удалил переменную sh и заменил ее на h везде. Это приводит к тому, что сигмоидальная функция вызывается только один раз.

function [J, grad] = costFunction(theta, X, y) 
m = length(y); 
h = sigmoid(X*theta); 
grad = (1/m)*X'*(h - y); 
J = (1/m)*sum(-y.*log(h) - (1 - y).*log(1 - h)); 

end 
+0

Благодарим вас за ответ. Мне очень важно иметь учетную запись в хорошем состоянии. Есть ли способ, которым я могу улучшить этот вопрос, чтобы у него не было головокружения? –

+0

Люди, возможно, отказались от вашего вопроса, поскольку, похоже, это связано с проблемой домашних заданий. Как новый пользователь сам, мой совет для вас повысить свою репутацию - ответить на некоторые вопросы, а не пытаться улучшить оценку этого сообщения :) –

+0

Хорошая работа. Я изначально не видел дублирующего сигмовидного звонка. – rayryeng