Matlab 正则化逻辑回归 - 如何计算梯度
Posted
技术标签:
【中文标题】Matlab 正则化逻辑回归 - 如何计算梯度【英文标题】:Matlab Regularized Logistic Regression - how to compute gradient 【发布时间】:2016-12-15 15:43:15 【问题描述】:我目前正在 Coursera 平台上学习机器学习,并且正在尝试实施逻辑回归。为了实现逻辑回归,我使用梯度下降来最小化成本函数,并且我将编写一个名为costFunctionReg.m
的函数,它返回在当前参数集下评估的每个参数的成本和梯度。
下面更好地描述了这个问题:
我的成本函数有效,但梯度函数无效。请注意,我更愿意使用循环来实现这一点,而不是逐个元素的操作。
我正在单独计算theta[0]
(在 MATLAB 中,theta(1)
),因为它没有被正则化,即我们不使用第一项(lambda
)。
function [J, grad] = costFunctionReg(theta, X, y, lambda)
%COSTFUNCTIONREG Compute cost and gradient for logistic regression with regularization
% J = COSTFUNCTIONREG(theta, X, y, lambda) computes the cost of using
% theta as the parameter for regularized logistic regression and the
% gradient of the cost w.r.t. to the parameters.
% Initialize some useful values
m = length(y); % number of training examples
n = length(theta); %number of parameters (features)
% You need to return the following variables correctly
J = 0;
grad = zeros(size(theta));
% ====================== YOUR CODE HERE ======================
% Instructions: Compute the cost of a particular choice of theta.
% You should set J to the cost.
% Compute the partial derivatives and set grad to the partial
% derivatives of the cost w.r.t. each parameter in theta
% ----------------------1. Compute the cost-------------------
%hypothesis
h = sigmoid(X * theta);
for i = 1 : m
% The cost for the ith term before regularization
J = J - ( y(i) * log(h(i)) ) - ( (1 - y(i)) * log(1 - h(i)) );
% Adding regularization term
for j = 2 : n
J = J + (lambda / (2*m) ) * ( theta(j) )^2;
end
end
J = J/m;
% ----------------------2. Compute the gradients-------------------
%not regularizing theta[0] i.e. theta(1) in matlab
j = 1;
for i = 1 : m
grad(j) = grad(j) + ( h(i) - y(i) ) * X(i,j);
end
for j = 2 : n
for i = 1 : m
grad(j) = grad(j) + ( h(i) - y(i) ) * X(i,j) + lambda * theta(j);
end
end
grad = (1/m) * grad;
% =============================================================
end
我做错了什么?
【问题讨论】:
请帮助编辑代码块格式...新用户,不知道如何:( Coursera 机器学习练习 嗯?向吴恩达问好。 我很久以前就学过这门课了。但我认为您必须在 X 的左侧添加一列0
,它表示您不必正则化的偏移项。现在您将非正则化项应用于第一个特征(第一列),而不是偏移项。尝试做X=[zeros(size(X,1),1) X]
@SembeiNorimaki 这不正确。需要添加一列 ones 来说明偏差项,但在偏差项未正则化的情况下,您是正确的。但是,在提交此函数以获取标记时,此函数会使用正确的输入进行测试,因此不需要添加额外的列。当您运行测试器代码时,它已经为您完成了。
没错,它必须是一列,因为它是乘以偏移值而不是相加。我记得必须添加这一额外的列,但也许这是在代码的另一部分完成的。
【参考方案1】:
您应用正则化的方式不正确。您在在对所有训练示例求和之后添加正则化,而是在在每个示例之后添加正则化。如果您将代码保留在更正之前的状态,您会无意中使梯度步长变大,最终会超出解决方案。这种过冲会累积,并且不可避免地会为您提供所有分量的梯度向量 Inf
或 -Inf
(偏置项除外)。
简单地说,将您的 lambda*theta(j)
语句放在第二个 for
循环终止之后:
for j = 2 : n
for i = 1 : m
grad(j) = grad(j) + ( h(i) - y(i) ) * X(i,j); % Change
end
grad(j) = grad(j) + lambda * theta(j); % Change
end
【讨论】:
不客气!如果我能说明一点,你应该完全花时间学习元素明智的方法。它们在 MATLAB 中速度更快,并且是称为矢量化的过程的一部分。祝你好运! 你能回答这个吗? ***.com/questions/63666436/…以上是关于Matlab 正则化逻辑回归 - 如何计算梯度的主要内容,如果未能解决你的问题,请参考以下文章