1

我正在尝试使用自定义距离度量执行层次聚类。我在 Python 中执行所有计算,然后将数据结构传递给 R 进行聚类

import rpy2.robjects as robjects
r=robjects.r
from rpy2.robjects.packages import importr
stats = importr('stats')

m = r.matrix(robjects.FloatVector(list_of_data), ncol=size, byrow=True)
dist_mat=stats.as_dist(m) 
hc=stats.hclust(new_dist_mat)

所以我的距离度量保存在 Python 列表中,转换为 R 矩阵,然后转换为dist聚类所需的对象。这在一定程度上有效。但是,当矩阵变得太大并且我收到此错误时:

python(18944,0xb0081000) malloc: *** mmap(size=168898560) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Error: cannot allocate vector of size 161.1 Mb

这发生在我转换为dist对象 ( as.dist) 的位置。我还没有测试它分崩离析的大小,但它适用于 3000x3000 矩阵,但适用于 6500x6500 矩阵,所以介于两者之间。我正在使用delPython 中的函数来尝试从内存中删除任何不必要的对象,但是从我所读到的内容来看,这并不能保证内存将立即可供使用。

那么,最终,是否有一种更高效的方式来获取dist对象?或者有没有我可以使用的替代方法?我在 R 的cluster库中找到了一些其他方法,它们不使用dist对象,但这些方法使用内置的距离度量。

提前致谢!

4

1 回答 1

2

调用 Python 的 del() 并不能保证内存立即可供使用。显式调用垃圾收集器会有所帮助。此处另一个问题的答案(清除 rpy2 使用的内存)指向 rpy2 文档中的相关部分。

关于聚类算法,使用 hclust() 进行分层聚类确实需要一个“距离”矩阵(大小为 n * (n + 1) / 2 ;由于矩阵是对称的,R 节省了一点内存)。存在其他聚类算法,或者如果热衷于分层聚类技巧,通过创建初始块来最小化起始矩阵的大小,但这超出了编程相关问题的范围。

于 2011-03-19T09:06:51.563 回答