微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

给定 Python 中全图的 SciPy CSR 距离矩阵,有效地计算子图的稀疏距离矩阵

如何解决给定 Python 中全图的 SciPy CSR 距离矩阵,有效地计算子图的稀疏距离矩阵

我有一个稀疏的 SciPy CSR 距离矩阵 D,它定义了一个G,顶点 V=[1,..,n] 和一些大 n>100000i 的每一行 D 正好有 k 距离,归纳出顶点 ki 最近邻居。

此外,我有顶点 W 的子集 V,它比 V一个数量级。从距离 D,我想有效地计算 E 顶点的稀疏 CSR 距离矩阵 W,每个都有 k 个邻居。


简单地对D进行切片,即选择E=D[W,W]是行不通的,因为一般情况下,子集的点在D中甚至不会有距离。通过切片,我最终得到一个矩阵 E,它在每行中包含 0k 项之间的某个位置,正是我想要的 k


我可以转向一些 compressed sparse graph routines,例如 Dijkstra 算法。然后,我可以计算:

E = dijkstra(csgraph=D,directed=False,indices=W)

原则上,这给了我我想要的,但是,在此操作之后,E一个 ndarray,具有所有顶点 W 的完整距离矩阵,而我只想要k 最近的邻居。显然,我可以从 E 的行中挑选那些并将所有东西都扔掉,但是当我什至不使用它们时计算这些是浪费时间。

同样的问题出现在其他可用的方法中,例如 Floyd WarshallBellman-FordJohnson在这方法中我总是为我的子图获得一个完整的距离矩阵。


我可以尝试逐行构建矩阵 E,而不是一次性构建。这原则上可以通过在 i 中固定一个顶点 W 并构建和遍历一个i 为根的 breadth-first tree 或通过创建一个 breadth-first order 开始于 i 来实现{1}}。两者都表示与 k 最接近的 W 元素,但是,它们还会在此之后对其他所有元素进行排序,这在我的应用程序中是多余的。

沿着类似的路线,我可以从 i 开始专门计算 shortest pathW 中的所有其他顶点,并保持 k 最接近的顶点。但是,根据我的图形布局和 i 的位置,我可能必须重复某些操作,这不会产生有效的算法。


理想情况下,我想要的是将 Wk 传递给 Dijkstra 算法的选项,以便它停止为某些顶点 {{1 }} 一旦它遇到 i 中的第 k 个元素。关于如何比我上面的概述更有效地实现这一目标有什么建议吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。