【问题标题】:Creating distance matrix in R for a matrix in a higher dimensional space在 R 中为高维空间中的矩阵创建距离矩阵
【发布时间】:2016-07-08 19:10:55
【问题描述】:

我使用 R 中的dist() 函数创建了一个欧几里得距离矩阵。 下面是我的R 脚本。由于在R 中运行此脚本时矩阵的尺寸为16809 * 16809,因此我收到了错误消息:

错误:无法分配大小为 1.1 Gb 的向量

那么有什么办法可以摆脱这个错误呢?

我之前没有在R 中使用并行化。可以使用并行化来完成吗?

rnd.points = matrix(runif(3 * 16809), ncol = 3)
rnd.points <- rnd.points[1:5,]
ds <- dist(rnd.points)
as.matrix(ds) -> nt
nt

【问题讨论】:

标签: r euclidean-distance


【解决方案1】:

正如@Gopola 所说:dist(.) 计算所有成对距离,因此需要 O(n^2) 内存。事实上,dist() 是高效的,并且只存储对称 n x n 矩阵的 一半

如果我在具有足够 RAM 的计算机上计算 dist(),它会很好地工作,并且确实会创建一个大小为 1.1 Gb 的对象 ds ... 这对于当今的计算机来说并不是那么 .

rnd.points <- matrix(runif(3 * 16809), ncol = 3)
ds <- dist(rnd.points)
object.size(ds)

但请注意,您的

as.matrix(ds) -> nt

不是一个好主意,因为生成的矩阵nt 确实(几乎)是ds 大小的两倍,因为nt 当然是一个 n x n 矩阵。

【讨论】:

  • 我想从距离矩阵创建一个网络。因此,为了创建一个网络,我想要一个方阵,它应该是我的邻接矩阵,并基于该矩阵创建一个网络。
【解决方案2】:

O/S 对RAM-寻址有主要限制(对于 32 位系统较小,对于 64 位系统较大)
操作系统接下来有一个基于设计的限制,一个进程可以分配的最大RAM(之后是+kill-s)


在 python 中具有相同的 InRAM 约束并超越了这一点

当然,需要付出一些代价,但值得体验。

python numpy 为这种场景无缝内置了一个奇妙的功能 - .memmap()。有意强调无缝这个词,因为这对于您的问题重新制定/重新设计成本具有核心重要性。有可用的工具,但现在是您掌握它们并重新设计算法(库等)的时候了,因为这些工具可以使用新工具 - 猜猜看 - 无缝。这是冰山的隐藏部分。


方便的R 工具可用:

  • filebacked.big.matrix 还支持用于分布式处理的 HPC 集群范围共享(从而解决 PSPACE PTIME HPC 处理挑战的维度,除非你幸运地达到了文件系统fileSize 上限)

  • ff 允许
    library(ff)
    pt_coords &lt;- ff( vmode = "double", dim = c(16809, 3), initdata = 0 )
    pt_dists &lt;- ff( vmode = "double", dim = c(16809, 16809), initdata = -1 )
    并像在矩阵中一样简单地使用它-类似 [row,column] 模式来填充点并处理它们的成对距离等,
    ?ffsave 了解有关保存结果距离数据的更多详细信息

最后,但并非最不重要

  • mmap + 索引

Parallel? No.
分布式?
是的,可能对 PTIME 有帮助:

正如filebacked.big.matrix 所指出的,有机会将计算PSPACE 分割成更小的部分,以进行分布式处理和减少PTIME,但这个概念原则上只是对可用资源的并发(重新)使用,而不是 [ PARALLEL ] 系统行为(虽然有必要承认,很多营销(坏消息是,即使是技术营销也加入了这种不公平和故意不正确的做法)文本在观察到只是并发系统行为的地方(没有很多真实的、真正的并行系统)。


结论:

大矩阵在 R 中是可行的,远远超出 InRAM 的限制,选择最适合您的问题领域的工具并利用所有 HPC 资源你可以。

Error: cannot allocate vector of size 1.1 Gb 已解决。

除了资源之外别无其他,这会对我们的计算就绪任务施加限制和延迟,因此请不要犹豫,在您的项目仍有计算资源可用的情况下采取行动,否则您会发现自己,所有的重新工程软件已准备就绪,但正在排队等待计算资源。

【讨论】:

  • 感谢您分享您的知识。这里的 ff 是什么,它是 R.. 中的内置函数吗?
  • 我想在 3D 空间中找到一个均匀分布的 16809 个点的距离矩阵。那么我如何使用 big.matrix 来实现它。你能提供一个你解释过的示例R代码吗?
  • library(ff) 是第一条评论的答案并更新了文本,请查看库文档,包括 fffilebacked.big.matrix 库语法详细信息。 R ^ 3中的欧几里得距离?小学。
  • 是 R^3 中的欧几里得距离。如何关联距离矩阵并将其点输入到 ff 矩阵?
  • 亲爱的@seemaaswani StackOverflow 不是我的家庭作业网站。 您指出的 MCVE 错误已解决到合理的详细程度,包括。指导您进一步项目开发的替代方法。 StackOverflow 不认为“给我一个代码”的做法是一种公平的社区关系。 在必要的方向上进一步努力以扩大你的成就(也请参阅你重复尝试索取代码的尝试对于其他帖子中的欧几里得距离 >>> stackoverflow.com/questions/37549154/… )
猜你喜欢
  • 2014-09-19
  • 1970-01-01
  • 2015-06-11
  • 2016-12-29
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2022-08-17
相关资源
最近更新 更多