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 正则化逻辑回归 - 如何计算梯度的主要内容,如果未能解决你的问题,请参考以下文章

matlab中的正则化逻辑回归代码

回归问题及应用

python - 如何在python scikit-learn中找到逻辑回归中的正则化参数?

如何使用 scikit-learn 执行非正则化逻辑回归?

吴恩达机器学习第五天逻辑回归模型

吴恩达-coursera-机器学习-week3