Câu hỏi Vectorization chi phí hồi quy logistic


Tôi có mã này cho chi phí trong hồi quy logistic, trong 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

Và tôi cần phải vector hóa nó, nhưng tôi không biết làm thế nào để nó làm điều đó và tại sao? Tôi là một lập trình viên vì vậy tôi thích của for. Nhưng để vector hóa nó, tôi trống. Bất kỳ giúp đỡ? Cảm ơn.


13
2017-11-12 19:50


gốc




Các câu trả lời:


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

33
2017-11-12 19:56



Điều đó rất đơn giản, quan tâm để giải thích nó? :) - Pedro.Alonso
Bạn có thể loại bỏ for i=1:m và for i = 1:size(theta) bằng cách sử dụng phép nhân. Sau đó, mã trở nên nhỏ hơn :) - Franck Dernoncourt
J = - (1/m) * (log(hX') * y + log(1 - hX') * (1 - y)); - cppgnlearner
@FranckDernoncourt Tôi đã đưa ra giải pháp tương tự. Bực bội vì họ thường nhắc đến theta' * X nhưng nó không tương thích với cấu trúc vector của chúng. - Brian Vanover
@FranckDernoncourt tại sao số tiền cần thiết là gì? J không phải là một vector 1x1 sao? Hoặc là nó chỉ để trả lại nó như là một vô hướng và không phải là một véc tơ? - Lesscomfortable


Mã có nên là 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

2
2018-03-18 09:13