在R中为较高维空间中的矩阵创建距离矩阵

时间:2016-07-08 19:10:56

标签: r euclidean-distance

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

  

错误:无法分配大小为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

2 个答案:

答案 0 :(得分:1)

正如@Gopola所说:dist(.)计算所有成对距离,因此需要 O(n ^ 2)个记忆。实际上,dist()是有效的,只存储对称n x n矩阵的 half

如果我在具有足够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 当然是基质

答案 1 :(得分:0)

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

在python中有相同的InRAM约束,超出了

当然,需要付出一些代价,但这是值得的经验。

python numpy为这个场景无缝内置了一个很棒的功能 - .memmap()。有意识地强调了这个词,因为这对于您的问题重新制定/重新设计成本至关重要。有工具可用,但是你需要掌握它们并重新设计你的算法(库等),因为这些可以使用新工具 - 猜猜 - SEAMLESSLY 。这是冰山的隐藏部分。

方便的R工具:

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

  • ff ,允许library(ff)
    pt_coords <- ff( vmode = "double", dim = c(16809, 3), initdata = 0 ) pt_dists <- ff( vmode = "double", dim = c(16809, 16809), initdata = -1 ) 并以与矩阵相似的[row,column]模式一样简单地处理它们以填充点并处理它们的成对距离等等,
    有关保存结果距离数据的更多详细信息,请?ffsave

最后,但并非最不重要

  • mmap +索引

Parallel? No.
分发?
是的,可能有助于 PTIME

filebacked.big.matrix所述,有可能将计算PSPACE分段为较小的段以进行分布式处理和减少PTIME,但概念原则上只是一个并发(re) ) - 使用可用的资源,而不是[PARALLEL]系统行为(虽然有必要承认,许多营销(坏消息是即使技术营销加入了这种不公平和明知不正确的做法)文本误用地方中的并行/并行一词,其中观察到一个并发的系统行为(没有很多真实的,真正的PARALLEL系统)。

结论:

R 可以在 InRAM 限制之外使用大矩阵,选择最适合您的问题域的工具并利用所有您可以使用HPC资源。

  

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

除了资源之外,只有资源可以限制和延迟我们的计算就绪任务,所以当计算资源仍然可用于您的项目时,请不要犹豫,否则您将发现自己,所有的重新设计好的软件就绪,但在队列中等待计算资源。