我在实施逻辑回归方面遇到了一些困难,我应该如何逐步进行。根据我到目前为止所做的事情,我将通过以下方式实现它:
首先将theta
等于要素数量并使其成为n*1
零向量。现在使用此theta
来计算以下内容
htheta = sigmoid(theta' * X');
theta = theta - (alpha/m) * sum (htheta' - y)'*X
现在使用第一步中计算的theta
来计算成本函数
J= 1/m *((sum(-y*log(htheta))) - (sum((1-y) * log(1 - htheta)))) + lambda/(2*m) * sum(theta).^2
最后计算梯度
grad = (1/m) * sum ((sigmoid(X*theta) - y')*X);
因为我将theta
视为零。我在整个向量中得到J
的相同值,这是正确的输出吗?
答案 0 :(得分:1)
您正在计算最后一步中的渐变,而在计算新theta
之前计算过梯度。此外,您对成本函数的定义包含正则化参数,但这并未包含在梯度计算中。没有正规化的工作版本:
% generate dummy data for testing
y=randi(2,[10,1])-1;
X=[ones(10,1) randn([10,1])];
% initialize
alpha = 0.1;
theta = zeros(1,size(X,2));
J = NaN(100,1);
% loop a fixed number of times => can improve this by stopping when the
% cost function no longer decreases
htheta = sigmoid(X*theta');
for n=1:100
grad = X' * (htheta-y); % gradient
theta = theta - alpha*grad'; % update theta
htheta = sigmoid(X*theta');
J(n) = sum(-y'*log(htheta)) - sum((1-y)' * log(1 - htheta)); % cost function
end
如果您现在绘制成本函数,您将看到(随机性除外)它在大约15次迭代后收敛。