代码之家  ›  专栏  ›  技术社区  ›  maja

正则逻辑回归的ML-八度梯度函数

  •  1
  • maja  · 技术社区  · 6 年前

    我编写了这两个代码实现来计算正则逻辑回归算法的梯度增量,输入是一个标量变量。 N1 表示一个值 N+ 1 ,列向量 θ 大小 N+ 1 ,矩阵 X 大小 [米x(n+1)] ,列向量 Y 大小 和一个标量因子 兰姆达 .

    第一个代码计算成功,第二个代码输出错误的结果。我相信这些实现都在做同样的事情,它们如何输出不同的结果?

    %correct
    tmp = zeros(n1, 1);
    tmp(2:n1,:) = (lambda / m) * theta(2:n1);
    grad = (1 / m) * (X' * (sigmoid(X * theta) - y)) + tmp;
    
    %wrong
    grad(1,:) = (1 / m) * (X(:,1)' * (sigmoid(X(:,1) * theta(1,:)) - y));
    grad(2:n1,:) = (1 / m) * (X(:,2:n1)' * (sigmoid(X(:,2:n1) * theta(2:n1,:)) - y)) + ((lambda / m) * theta(2:n1));
    

    在哪里? 乙状结肠(Z) 退货 G 如:

    g = zeros(size(z));
    g = 1 ./ (1 + exp( -z ));
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   amahmud    6 年前

    问题在于矩阵乘法。

    首先假设m=5,n1=5,这意味着x是一个5*5的矩阵,θ和y都是5个元素的向量。

    在第一种情况下,sigmoid函数提供一个5*5的矩阵,x的倒数也是5*5。因为它是一个矩阵乘法,所以x'的第一行乘以g的第一列,这意味着您需要所有g值来计算第一行梯度。

    在第二种情况下,对于梯度的第一行,sigmoid函数也提供了一个5*5的矩阵,但是它是不同的,因为现在x是一个1*5的矩阵。这意味着矩阵乘法将提供不同的输出,因此结果是不同的。

    希望现在一切都清楚了。

    **之前我假设theta和y是行向量,但在您的示例中,您已经清楚地提到您使用的是列向量。然而,矩阵乘法仍然是个问题。如果你对矩阵乘法有一个清晰的理解,那么你很容易理解这个问题。

    让我们从正确的方程开始,

    (x*theta)-y=m*1矩阵,因此乙状结肠为m*1矩阵。

    x'*乙状结肠是这里的主要部分,因为其他两个术语是标量,x'*乙状结肠=m*1矩阵,最后你的梯度是m*1矩阵。

    如果仔细观察,梯度(1,1)取决于x'(1,:)和乙状结肠,并且使用所有theta值计算乙状结肠。所以,梯度(1,1)不仅依赖于θ(1),你不能简单地用θ(1)代替θ,你在错误的情况下做了什么。