问题描述
我想问这个方程式
可以这样写成八度音
predictions = X * theta;
delta = (1/m) * X' * (predictions - y);
theta = theta - alpha * delta;
我不了解转置从何而来以及如何通过这种方式将等式转换为ve?
解决方法
标量积X.Y
在数学上是sum (xi * yi)
,当X' * Y
和X
是向量时,可以八度表示为Y
。
还有其他方法可以在八度中编写标量积,请参见 https://octave.sourceforge.io/octave/function/dot.html
,这个问题似乎是一个例子,
X = randn(m,k); % m 'input' horizontal-vectors of dimensionality k
y = randn(m,n); % m 'target' horizontal-vectors of dimensionality n
theta = randn(k,n); % a (right) transformation from k to n dimensional
% horizontal-vectors
h = X * theta; % creates m rows of n-dimensional horizontal vectors
下面的代码怎么样
delta = zeros(k,n)
for j = 1 : k % iterating over all dimensions of the input
for l = 1 : n % iterating over all dimensions of the output
for i = 1 : m % iterating over all observations for that j,l pair
delta(j,l) += (1/m) * (h(i,l) - y(i,l)) * x(i,j);
end
theta(j,l) = theta(j,l) - alpha * delta(j,l);
end
end
可以向量化为:
h = X * theta ;
delta = (1/ m) * X' * (h - y);
theta = theta - alpha * delta;
为确认这种向量化公式是否有意义,始终有助于指出(例如,在每行下方)矩阵/向量化运算中涉及的对象的尺寸:
h = X * theta ;
% [m,n] [m,k] [k,n]
delta = (1/ m) * X' * (h - y);
% [k,n] [1,1] [k,m] [m,n]
theta = theta - alpha * delta;
% [k,n] [k,n]
希望现在它们变得等效了。
用X' * D
计算(其中D = predictions - y
),您可以看到:
用X'
的第一行和D的第一列执行矩阵乘法,等于对所有 m 个观测值的k=1
和n=1
求和,并将其结果在矩阵输出中的位置[k = 1,n = 1]。然后,沿着D列移动并仍然乘以X'
的第一行,您会看到我们只是沿着D中的n个维移动,并将结果相应地放置在输出中。类似地,沿着X'
的行移动,沿着X'
的k个维度移动,对该D中的所有n执行相同的过程,并相应地放置结果,直到完成矩阵乘法X的所有行和D的所有列。
如果遵循上述逻辑,您将看到所涉及的求和与for循环公式完全相同,但是我们设法避免使用for循环,而改为使用矩阵运算。