什么时候在Matlab中使用矩阵乘法,sum()或for循环有很好的经验法则?

ste*_*use 3 matlab matrix gradient-descent

我正在尝试开发用于将方程转换为代码的通用启发式算法.这个特殊的问题解决了如何在Matlab中实现带求和函数的方程.

使用sum()与矩阵乘法的示例:

我实现了这个等式,并认为我需要使用sum()函数:

公式1

J = 1/(2*m) * sum( (X*theta - y).^2 );
Run Code Online (Sandbox Code Playgroud)

然后我实现了这个类似的等式,而不需要使用sum()函数!

方程2

theta = theta - (alpha/m) * ((X*theta - y)'*X)';
Run Code Online (Sandbox Code Playgroud)

哪里:

X: 100x2 (training input plus a 'ones' vector)
y: 100x1 (training output) 
theta:  2x1 (parameters)
m: 100 (length of y)
alpha: 0.01 (learning rate) 
Run Code Online (Sandbox Code Playgroud)

当Matlab的矩阵乘法"处理"求和时,有哪些原理?

谢谢!

ray*_*ica 6

始终在线性代数上下文中使用矩阵乘法或处理矩阵或向量的任何事物.具体来说,如果你可以使用线性代数(矩阵上的加法,减法,乘法等的组合)计算你需要计算的任何东西,那就去做吧.创建MATLAB的原因是尽可能快地使用线性代数执行操作.使用sum肯定会慢一些.例如,看看这篇文章:Matlab中的快速矩阵乘法

这篇文章还提供了见解:Matlab矩阵乘法速度.MATLAB还执行此多线程,并针对多个内核进行了大量优化.


如果你想要一个测试,让我们解决更容易的情况(等式1),我们可以看到你可以使用sum或矩阵乘法来计算这个数量.您也J可以使用矩阵乘法计算:

d = X*theta - y;
J = 1/(2*m)*(d.'*d);
Run Code Online (Sandbox Code Playgroud)

以上使用点积的定义来计算平方差的和,其可以使用矩阵乘法来计算,其中X*theta - y被视为m x 1矩阵.有了上述内容,您具体计算的是线性回归的成本函数,该函数将通过梯度下降最小化.让我们创建一个相当大的参数向量为theta100 x 1,数据矩阵为10000000 x 100100个参数的1000万个数据点.我的机器上有很多RAM,因此您可能无法运行此测试.我还将这些全部初始化为随机数并设置种子以确保重现性.让我们一起使用timeit,看看这两者需要多长时间.这是我写的测试函数:

function test_grad

rng(123);
theta = rand(100,1);
X = rand(1e7, 100);
y = rand(1e7, 1);
m = size(X, 1);

    function test1
    out = 1/(2*m) * sum( (X*theta - y).^2 );
    end

    function test2
    d = X*theta - y;
    out = 1/(2*m)*(d.'*d);
    end

t1 = timeit(@test1);
t2 = timeit(@test2);
fprintf('The timing for sum: %f seconds\n', t1);
fprintf('The timing for matrix multiplication: %f seconds\n', t2);
end
Run Code Online (Sandbox Code Playgroud)

在MATLAB中运行此函数时,它会在使用sum和使用矩阵乘法之间进行大量测试.

这是我运行此功能时得到的.我在带有i7 Intel Core 2.3 GHz CPU的MacBook Pro上有16 GB的RAM:

>> test_grad
The timing for sum: 0.594337 seconds
The timing for matrix multiplication: 0.393643 seconds
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,矩阵乘法(至少在我的机器上)每次运行的平均差值为0.2秒timeit.


tl;dr:如果你可以使用矩阵乘法,那就去做吧.它是您能够运行代码的最快速度.