2013-11-12 4 views
12

У меня есть этот код для стоимости в логистической регрессии, в MATLAB:Векторизация логистической регрессии стоимость

function [J, grad] = costFunction(theta, X, y) 

m = length(y); % number of training examples 
thetas = size(theta,1); 
features = size(X,2); 
steps = 100; 
alpha = 0.1; 

J = 0; 
grad = zeros(size(theta)); 


sums = []; 
result = 0; 

for i=1:m 

% sums = [sums; (y(i))*log10(sigmoid(X(i,:)*theta))+(1-y(i))*log10(1-sigmoid(X(i,:)*theta))] 

    sums = [sums; -y(i)*log(sigmoid(theta'*X(i,:)'))-(1-y(i))*log(1-sigmoid(theta'*X(i,:)'))]; 

    %use log simple not log10, mistake 
end 

result = sum(sums); 
J = (1/m)* result; 


%gradient one step 

tempo = []; 
thetas_update = 0; 
temp_thetas = []; 


grad = temp_thetas; 

for i = 1:size(theta) 
    for j = 1:m 
     tempo(j) = (sigmoid(theta'*X(j,:)')-y(j))*X(j,i); 
    end 
    temp_thetas(i) = sum(tempo); 
    tempo = []; 
end 

grad = (1/m).*temp_thetas; 

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

end 

И мне нужно векторизации, но я не знаю, как это сделать и почему? Я программист, поэтому мне нравится. Но для векторизации, я пуст. Любая помощь? Благодарю.

ответ

31
function [J, grad] = costFunction(theta, X, y) 
hx = sigmoid(X * theta); 
m = length(X); 

J = (-y' * log(hx) - (1 - y')*log(1 - hx))/m; 
grad = X' * (hx - y)/m; 

end 
+0

Это так просто, все равно объяснить это? :) –

+5

Вы можете избавиться от 'for i = 1: m' и' for i = 1: size (theta) ', используя умножение матрицы. Тогда код становится меньше :) –

+2

'J = - (1/m) * (log (hX ') * y + log (1 - hX') * (1 - y));' – cppgnlearner

2

ли код должен быть function [J, grad] = costFunction(theta, X, y)

hx = sigmoid(X' * theta); 
m = length(X); 

J = sum(-y * log(hx) - (1 - y)*log(1 - hx))/m; 
grad = X' * (hx - y)/m; 



end 
Смежные вопросы