我有10,00,000个代理,每个代理都与(x,y)
坐标相关联。我试图找到彼此接近的代理(radius=1.5
)。我试着用PyTorch实现这个:
X = torch.DoubleTensor(1000000,2).uniform_(0,10000)
torch.cdist(X,X,p=2)
然而,这样会话就崩溃了。我在google colab上运行这个。当我尝试使用scikit-learn包的radius_neighbors_graph
构建图时,也发生了同样的情况。如果有人提出一种内存有效的方法来实现同样的功能,那将是非常有帮助的。
3条答案
按热度按时间6rvt4ljy1#
你不太可能在不仔细考虑的情况下完整地计算出一个1M*1M的矩阵。您可能需要沿着
scipy.spatial.KDTree
行的内容。一旦构建了一棵树,就可以将代理的坐标传递给query
方法,以获取特定半径内的邻居。为了一次得到所有的邻居,你可以计算树的sparse_distance_matrix
,它本身在一个适当的阈值。或者,您可以研究任意数量的高效聚类算法。
sirbozc52#
我找到了三个解决方案,解决方案1
溶液2
溶液3
虽然三种解决方案的执行时间都是一样的,一分钟,但对内存的需求分别约为2GB、1GB和1.3GB。这将是伟大的听到的想法,以降低执行时间。
5sxhfpxr3#
一个简单的解决方案,没有任何花哨的库:
然后运行
batch_nn(X, X, 10)
。这在我的笔记本电脑上大约需要一分钟,你提到的
X
。但它不会坠毁。这是很容易扩展到寻找更多的比最近的邻居以及。使用torch.argpartition
或torch.topk
代替torch.argmin
。