我编写了这两个代码实现来计算正则逻辑回归算法的梯度增量,输入是表示值 n的标量变量 n1 +1 ,大小为 n + 1 的列矢量 theta ,矩阵 X ,大小为 [mx(n + 1)] ,列向量 y ,大小为 m 和标量因子 lambda 。
第一个代码成功计算,第二个代码输出错误结果。我相信这些实现都在做同一件事,如何才能输出不同的结果?
%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)返回 g 的地方,例如:
g = zeros(size(z));
g = 1 ./ (1 + exp( -z ));
答案 0 :(得分:1)
问题出在矩阵乘法上。
首先假设,m = 5,n1 = 5,这意味着X是5 * 5的矩阵,θ和y都是5个元素的向量。
现在,在第一种情况下,S型函数提供了5 * 5的矩阵,X的倒数也是5 * 5。由于这是矩阵乘法,因此X'的第一行与g的第一列相乘,这意味着您需要所有g值来计算grad的第一行。
现在在第二种情况下,对于grad的第一行,S形函数也提供了5 * 5矩阵,但是它有所不同,因为现在X是1 * 5矩阵。这意味着矩阵乘法将提供不同的输出,因此结果也不同。
我希望现在已经清楚了。
**以前,我是在假设theta和y是行向量的情况下编写答案的,但是在您的示例中,您明确提到了您正在使用列向量。然而,矩阵乘法仍然是问题。如果您对矩阵乘法有清晰的了解,那么您将很容易理解问题。
让我们从正确的方程式开始
(X * theta)-y = m * 1矩阵,因此,S形是m * 1矩阵。
X'* sigmoid是这里的主要部分,因为其他两个项是标量,X'* sigmoid = m * 1矩阵,最后您的grad是m * 1矩阵。
如果仔细观察,grad(1,1)取决于X'(1,:)和Sigmoid,并且已经使用所有theta值计算了Sigmoid。因此,grad(1,1)不仅取决于theta(1),而且您不能简单地用theta(1)替换theta在错误情况下的操作。