我正在尝试使用正则化逻辑回归,这里有Matlab中的简单公式:
成本函数:
J(theta) = 1/m*sum((-y_i)*log(h(x_i)-(1-y_i)*log(1-h(x_i))))+(lambda/2*m)*sum(theta_j)
梯度:
∂J(theta)/∂theta_0 = [(1/m)*(sum((h(x_i)-y_i)*x_j)] if j=0
∂j(theta)/∂theta_n = [(1/m)*(sum((h(x_i)-y_i)*x_j)]+(lambda/m)*(theta_j) if j>1
这不是Matlab代码,只是公式。
到目前为止,我已经完成了以下内容:
function [J, grad] = costFunctionReg(theta, X, y, lambda)
J = 0;
grad = zeros(size(theta));
temp_theta = [];
%cost function
%get the regularization term
for jj = 2:length(theta)
temp_theta(jj) = theta(jj)^2;
end
theta_reg = lambda/(2*m)*sum(temp_theta);
temp_sum =[];
%for the sum in the cost function
for ii =1:m
temp_sum(ii) = -y(ii)*log(sigmoid(theta'*X(ii,:)'))-(1-y(ii))*log(1-sigmoid(theta'*X(ii,:)'));
end
tempo = sum(temp_sum);
J = (1/m)*tempo+theta_reg;
%regulatization
%theta 0
reg_theta0 = 0;
for jj=1:m
reg_theta0(jj) = (sigmoid(theta'*X(m,:)') -y(jj))*X(jj,1)
end
reg_theta0 = (1/m)*sum(reg_theta0)
grad_temp(1) = reg_theta0
%for the rest of thetas
reg_theta = [];
thetas_sum = 0;
for ii=2:size(theta)
for kk =1:m
reg_theta(kk) = (sigmoid(theta'*X(m,:)') - y(kk))*X(kk,ii)
end
thetas_sum(ii) = (1/m)*sum(reg_theta)+(lambda/m)*theta(ii)
reg_theta = []
end
for i=1:size(theta)
if i == 1
grad(i) = grad_temp(i)
else
grad(i) = thetas_sum(i)
end
end
end
成本函数得出的结果是正确的,但我不知道为什么梯度(一步)就不对了。成本函数得出的J = 0.6931是正确的,而梯度grad = 0.3603 -0.1476 0.0320则不正确,成本从2开始是因为参数theta(1)不需要规则化,有没有帮助?我想代码有问题,但四天后我还是找不到错误。谢谢。
J
中添加正则化项+lambda * sum(theta(2:end).^2) / (2*m)
的意义是什么,因为我们传递的initial_theta = zeros(size(X, 2), 1);
,当乘以该项时会得到值为0,那么这样做有什么意义呢?因为代价函数仍将保持不变... - IncpetorcostFunctionReg
时,theta
的值为0,但在第一次迭代后它们将被更改。 - Franck DernoncourtJ = (sum(...
中的第一个sum
是多余的,因为它的参数已经具有 {1x1} 的维度,也就是一个数字。 - ratijas