MATLAB中正则化逻辑回归代码

我在尝试正则化逻辑回归,使用以下公式在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 termfor jj = 2:length(theta)    temp_theta(jj) = theta(jj)^2;endtheta_reg = lambda/(2*m)*sum(temp_theta);temp_sum =[];%for the sum in the cost functionfor ii =1:m   temp_sum(ii) = -y(ii)*log(sigmoid(theta'*X(ii,:)'))-(1-y(ii))*log(1-sigmoid(theta'*X(ii,:)'));endtempo = sum(temp_sum);J = (1/m)*tempo+theta_reg;%regulatization%theta 0reg_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 thetasreg_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 = []endfor i=1:size(theta)    if i == 1        grad(i) = grad_temp(i)    else        grad(i) = thetas_sum(i)    endendend

成本函数给出的结果是正确的,但我不明白为什么梯度(一步)不是,成本函数给出J = 0.6931,这是正确的,而梯度grad = 0.3603 -0.1476 0.0320,这是错误的,成本从2开始,因为参数theta(1)不需要正则化,有什么帮助吗?我猜代码有问题,但经过4天我还是看不出来。谢谢


回答:

终于搞定了,经过第四次重写,这是正确的代码:

function [J, grad] = costFunctionReg(theta, X, y, lambda)J = 0;grad = zeros(size(theta));temp_theta = [];for jj = 2:length(theta)    temp_theta(jj) = theta(jj)^2;endtheta_reg = lambda/(2*m)*sum(temp_theta);temp_sum =[];for ii =1:m   temp_sum(ii) = -y(ii)*log(sigmoid(theta'*X(ii,:)'))-(1-y(ii))*log(1-sigmoid(theta'*X(ii,:)'));endtempo = sum(temp_sum);J = (1/m)*tempo+theta_reg;%regulatization%theta 0reg_theta0 = 0;for i=1:m    reg_theta0(i) = ((sigmoid(theta'*X(i,:)'))-y(i))*X(i,1)endtheta_temp(1) = (1/m)*sum(reg_theta0)grad(1) = theta_tempsum_thetas = []thetas_sum = []for j = 2:size(theta)    for i = 1:m        sum_thetas(i) = ((sigmoid(theta'*X(i,:)'))-y(i))*X(i,j)    end    thetas_sum(j) = (1/m)*sum(sum_thetas)+((lambda/m)*theta(j))    sum_thetas = []endfor z=2:size(theta)    grad(z) = thetas_sum(z)end% =============================================================end

如果这对任何人有帮助,或者有人对我如何做得更好有任何评论。:)

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注