Machine learning 正则Logistic回归的ML-倍频程梯度函数

Machine learning 正则Logistic回归的ML-倍频程梯度函数,machine-learning,octave,Machine Learning,Octave,我编写了这两个代码实现来计算正则化逻辑回归算法的梯度增量,输入是表示值n+1的标量变量n1,大小为n+1的列向量theta,大小为[mx(n+1)]的矩阵X,大小为m的列向量y和标量因子lambda 第一个代码计算成功,第二个代码输出错误的结果。我相信这些实现都在做同样的事情——它们如何输出不同的结果 %correct tmp = zeros(n1, 1); tmp(2:n1,:) = (lambda / m) * theta(2:n1); grad = (1 / m) * (X' * (sig

我编写了这两个代码实现来计算正则化逻辑回归算法的梯度增量,输入是表示值n+1的标量变量n1,大小为n+1的列向量theta,大小为[mx(n+1)]的矩阵X,大小为m的列向量y和标量因子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,如下所示:


问题在于矩阵乘法

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

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

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

我希望这一点现在已经清楚了

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

让我们从正确的等式开始

(X*θ)-y=m*1矩阵,因此sigmoid是m*1矩阵

X'*sigmoid是这里的主要部分,因为其他两项是标量,X'*sigmoid=m*1矩阵,最后你的梯度是m*1矩阵


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

我对matlab不太确定,但在我的例子中,我使用的是倍频程,结果与您在这里看到的相同:。顺便说一句,预期的值是(λ/m)*θ(2:n1)。不过我很确定括号使用时存在问题。否则,它们都是相同的。你能检查一下这个吗?您在第二个代码中使用了括号。我已经正确地设置了代码的父项(请参阅原始问题中的更新),并且我确认正确代码的结果被接受,而另一个结果不被接受。您可以提供sigmoid函数的详细信息吗?我已将sigmoid代码添加到原始答案的末尾。
g = zeros(size(z));
g = 1 ./ (1 + exp( -z ));