Cython平方范数的快速计算

2024-05-03 03:48:09 发布

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

我想计算平方范数,可以写成 enter image description here

W是一个矩阵,有V行。u是一个向量。我有两个裸体W和u

import numpy as np
import numpy.random as npr
V = 10
W = npr.normal(size=(V, 3))
u = npr.normal(size=(1,3))

如果我逐行计算,我可以这样做:

^{pr2}$

但一旦V变大(比如5000),它可能会很慢,我需要一次又一次地重新计算。 所以我尝试了矩阵乘法,但是没有成功,因为它不是一个逐行的乘法。在

((W - u).transpose()).dot(W - u)

我怎样才能快速计算出平方范数?在

我计划使用Cython,那么循环中的逐行乘法会比Numpy快吗?我了解到Cython有parallelization,但是如果我在里面使用Numpy对象,Cython似乎不能并行化{}(添加于11月20日:可能我不能在prange内使用Python对象,但我可以使用Numpy对象)。在


Tags: 对象importnumpy范数sizeasnp矩阵
1条回答
网友
1楼 · 发布于 2024-05-03 03:48:09

方法1

您可以利用基于fastblas的^{}与NumPy一起使用,而无需任何循环,如下-

res = (W**2).sum(1) + (u**2).sum(1) -2*W.dot(u.ravel())

引入^{}来获得W和{}的u-

^{pr2}$

方法说明

在每次迭代中使用(W[v] - u).dot((W[v] - u),我们正在做内点积。因为,我们对W的所有行执行此操作,这在利用广播时转换为((W - u)**2).sum(1)。在

现在

(Xik-Yjk)**2 = Xik**2 + Yjk**2 - 2*Xik*Yjk

因此

sum_k((Xik-Yjk)**2) = sum_k(Xik**2) + sum_k(Yjk**2) - 2*sum_k(Xik*Yjk)

RHS的最后一个术语基本上是矩阵乘法,我们用np.dot来利用它。在

方法2

或者,使用更多的np.einsum,应该是这样-

d = W -u
res = np.einsum('ij,ij->i',d,d)

相关问题 更多 >