如何解决给定 Python 中全图的 SciPy CSR 距离矩阵,有效地计算子图的稀疏距离矩阵
我有一个稀疏的 SciPy CSR 距离矩阵 D
,它定义了一个图 G
,顶点 V=[1,..,n]
和一些大 n>100000
。 i
的每一行 D
正好有 k
距离,归纳出顶点 k
的 i
最近邻居。
此外,我有顶点 W
的子集 V
,它比 V
小一个数量级。从距离 D
,我想有效地计算 E
顶点的稀疏 CSR 距离矩阵 W
,每个都有 k
个邻居。
简单地对D
进行切片,即选择E=D[W,W]
是行不通的,因为一般情况下,子集的点在D
中甚至不会有距离。通过切片,我最终得到一个矩阵 E
,它在每行中包含 0
和 k
项之间的某个位置,正是我想要的 k
。
我可以转向一些 compressed sparse graph routines,例如 Dijkstra 算法。然后,我可以计算:
E = dijkstra(csgraph=D,directed=False,indices=W)
原则上,这给了我我想要的,但是,在此操作之后,E
是一个 ndarray
,具有所有顶点 W
的完整距离矩阵,而我只想要k
最近的邻居。显然,我可以从 E
的行中挑选那些并将所有东西都扔掉,但是当我什至不使用它们时计算这些是浪费时间。
同样的问题出现在其他可用的方法中,例如 Floyd Warshall、Bellman-Ford 和 Johnson,在这些方法中我总是为我的子图获得一个完整的距离矩阵。
我可以尝试逐行构建矩阵 E
,而不是一次性构建。这原则上可以通过在 i
中固定一个顶点 W
并构建和遍历一个以 i
为根的 breadth-first tree 或通过创建一个 breadth-first order 开始于 i
来实现{1}}。两者都表示与 k
最接近的 W
元素,但是,它们还会在此之后对其他所有元素进行排序,这在我的应用程序中是多余的。
沿着类似的路线,我可以从 i
开始专门计算 shortest path 到 W
中的所有其他顶点,并保持 k
最接近的顶点。但是,根据我的图形布局和 i
的位置,我可能必须重复某些操作,这不会产生有效的算法。
理想情况下,我想要的是将 W
和 k
传递给 Dijkstra 算法的选项,以便它停止为某些顶点 {{1 }} 一旦它遇到 i
中的第 k
个元素。关于如何比我上面的概述更有效地实现这一目标有什么建议吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。