矢量乘法速度?

2024-04-19 07:00:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我是numpy的新手,发现了这种奇怪的行为。 我正在实现logistic回归成本函数,这里有两个相同维度和相同类型的列向量(dfloat)。y包含一串0和1,a包含范围(-1,1)内的浮点数。 在某个时刻,我应该得到点积,所以我转置一并乘它们:

   x = y.T @ a

但当我使用

   x = y @ a.T

偶尔性能会下降约3倍,但结果是相同的 为什么会这样?操作不一样吗? 谢谢。你知道吗


Tags: 函数numpy类型性能向量成本浮点数logistic
2条回答

性能下降,你得到了完全不同的答案!你知道吗

对于向量乘法(不同于数字乘法)a @ b != b @ a。在您的例子中(假设列向量),a.T @ b是一个,但是a @ b.T是一个完整的矩阵!所以,如果你的向量都是形状(1,y),最后一个操作将产生一个(y,y)矩阵,这个矩阵可能非常大。当然,计算这样一个矩阵(也就是说,加上大量的数字,产生大量的数字)要比加上一堆数字,产生一个单一的数字花费更多的时间。你知道吗

这就是矩阵(或向量)乘法的工作原理。你知道吗

那是完全不同的事情。考虑

(a.T @ b).size
(a @ b.T).size

如果ab都是大小n,则第一个的结果是1,第二个的结果是n^2。原因是标准的标量乘法-单元i,j是i行和j列的点积的乘积。就你而言:

  1. 第一个是行乘以列。所以这里只有向量的点积到-1维。你知道吗
  2. 第二个是一列乘以一行。乘法仍然是row*column,因此您将第一个向量的行(一列,因此是单个单元格)与第二个向量的第一列(一行,仍然是单个单元格)相乘-这将得到结果单元格(1,1)。您可以在整行的第一列单元格中重复相同的操作,这是第二个向量-n结果,单元格(1,1)…(1,n)。冲洗并重复n次(列的大小),矩阵就会大得多。你知道吗

底线-第二个表达式必须做更多的运算(可能更多,取决于维度)。你知道吗

相关问题 更多 >