ML - Octave - 正则化逻辑回归的梯度函数
ML - Octave - gradient function for Regularized Logistic Regression
我编写了这两个代码实现来计算正则化逻辑回归算法的梯度增量,输入是标量变量 n1表示值 n+1,大小为 n 的列向量 theta +1,大小为 [m x (n+1)][=34= 的矩阵 X ],一个大小为 m 的列向量 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));
其中 sigmoid(z) returns g 如:
g = zeros(size(z));
g = 1 ./ (1 + exp( -z ));
问题出在矩阵乘法
首先假设,m = 5,n1 = 5,这意味着X是一个5*5的矩阵,theta和y都是5个元素的向量。
现在在第一种情况下,sigmoid 函数提供一个 5*5 矩阵,X 的逆矩阵也是 5*5。由于它是矩阵乘法,因此 X' 的第一行与 g 的第一列相乘,这意味着您需要所有 g 值来计算 grad 的第一行。
现在在第二种情况下,对于 grad 的第一行,sigmoid 函数也提供了一个 5*5 矩阵,但它是不同的,因为现在 X 是一个 1*5 矩阵。这意味着矩阵乘法将提供不同的输出,因此结果不同。
我希望现在一切都清楚了。
** 之前我在假设 theta 和 y 是行向量的情况下写我的答案,但在你的例子中你已经明确提到你正在使用列向量。但是,矩阵乘法仍然是问题所在。如果你对矩阵乘法有一个清晰的认识,那么你就会很容易理解这个问题。
让我们从正确的等式开始,
( X * theta) - y = m*1 矩阵,因此 sigmoid 是 m*1 矩阵。
X' * sigmoid 是这里的主要部分,因为其他两项是标量,X' * sigmoid = m*1 矩阵,最后你的梯度是 m*1 矩阵。
如果仔细观察 grad(1,1) 取决于 X'(1,:) 和 sigmoid,并且您已经使用所有 theta 值计算了 sigmoid。因此,grad(1,1) 不仅取决于 theta(1),而且您不能简单地将 theta 替换为 theta(1) 在错误的情况下您在做什么。
我编写了这两个代码实现来计算正则化逻辑回归算法的梯度增量,输入是标量变量 n1表示值 n+1,大小为 n 的列向量 theta +1,大小为 [m x (n+1)][=34= 的矩阵 X ],一个大小为 m 的列向量 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));
其中 sigmoid(z) returns g 如:
g = zeros(size(z));
g = 1 ./ (1 + exp( -z ));
问题出在矩阵乘法
首先假设,m = 5,n1 = 5,这意味着X是一个5*5的矩阵,theta和y都是5个元素的向量。
现在在第一种情况下,sigmoid 函数提供一个 5*5 矩阵,X 的逆矩阵也是 5*5。由于它是矩阵乘法,因此 X' 的第一行与 g 的第一列相乘,这意味着您需要所有 g 值来计算 grad 的第一行。
现在在第二种情况下,对于 grad 的第一行,sigmoid 函数也提供了一个 5*5 矩阵,但它是不同的,因为现在 X 是一个 1*5 矩阵。这意味着矩阵乘法将提供不同的输出,因此结果不同。
我希望现在一切都清楚了。
** 之前我在假设 theta 和 y 是行向量的情况下写我的答案,但在你的例子中你已经明确提到你正在使用列向量。但是,矩阵乘法仍然是问题所在。如果你对矩阵乘法有一个清晰的认识,那么你就会很容易理解这个问题。
让我们从正确的等式开始,
( X * theta) - y = m*1 矩阵,因此 sigmoid 是 m*1 矩阵。
X' * sigmoid 是这里的主要部分,因为其他两项是标量,X' * sigmoid = m*1 矩阵,最后你的梯度是 m*1 矩阵。
如果仔细观察 grad(1,1) 取决于 X'(1,:) 和 sigmoid,并且您已经使用所有 theta 值计算了 sigmoid。因此,grad(1,1) 不仅取决于 theta(1),而且您不能简单地将 theta 替换为 theta(1) 在错误的情况下您在做什么。