2024-04-19 07:00:59 发布
网友
我是numpy的新手,发现了这种奇怪的行为。 我正在实现logistic回归成本函数,这里有两个相同维度和相同类型的列向量(dfloat)。y包含一串0和1,a包含范围(-1,1)内的浮点数。 在某个时刻,我应该得到点积,所以我转置一并乘它们:
x = y.T @ a
但当我使用
x = y @ a.T
偶尔性能会下降约3倍,但结果是相同的 为什么会这样?操作不一样吗? 谢谢。你知道吗
性能下降,和你得到了完全不同的答案!你知道吗
对于向量乘法(不同于数字乘法)a @ b != b @ a。在您的例子中(假设列向量),a.T @ b是一个数,但是a @ b.T是一个完整的矩阵!所以,如果你的向量都是形状(1,y),最后一个操作将产生一个(y,y)矩阵,这个矩阵可能非常大。当然,计算这样一个矩阵(也就是说,加上大量的数字,产生大量的数字)要比加上一堆数字,产生一个单一的数字花费更多的时间。你知道吗
a @ b != b @ a
a.T @ b
a @ b.T
这就是矩阵(或向量)乘法的工作原理。你知道吗
那是完全不同的事情。考虑
(a.T @ b).size (a @ b.T).size
如果a和b都是大小n,则第一个的结果是1,第二个的结果是n^2。原因是标准的标量乘法-单元i,j是i行和j列的点积的乘积。就你而言:
a
b
n
n^2
底线-第二个表达式必须做更多的运算(可能更多,取决于维度)。你知道吗
性能下降,和你得到了完全不同的答案!你知道吗
对于向量乘法(不同于数字乘法)
a @ b != b @ a
。在您的例子中(假设列向量),a.T @ b
是一个数,但是a @ b.T
是一个完整的矩阵!所以,如果你的向量都是形状(1,y),最后一个操作将产生一个(y,y)矩阵,这个矩阵可能非常大。当然,计算这样一个矩阵(也就是说,加上大量的数字,产生大量的数字)要比加上一堆数字,产生一个单一的数字花费更多的时间。你知道吗这就是矩阵(或向量)乘法的工作原理。你知道吗
那是完全不同的事情。考虑
如果
a
和b
都是大小n
,则第一个的结果是1,第二个的结果是n^2
。原因是标准的标量乘法-单元i,j是i行和j列的点积的乘积。就你而言:n
结果,单元格(1,1)…(1,n)。冲洗并重复n
次(列的大小),矩阵就会大得多。你知道吗底线-第二个表达式必须做更多的运算(可能更多,取决于维度)。你知道吗
相关问题 更多 >
编程相关推荐