R 大型稀疏矩阵上的亲和传播聚类

R 大型稀疏矩阵上的亲和传播聚类,r,matrix,cluster-analysis,sparse-matrix,R,Matrix,Cluster Analysis,Sparse Matrix,我试图对一组我想要集群的对象使用R packageapcluster,但我遇到了性能/内存问题,我怀疑我做得不对。我想听听你的意见 简而言之:我有一套大约13000个对象。每个对象都与一组2到5个“特征”相关联。任意两个对象I和j之间的相似性(最终我想通过它进行聚类)等于它们共有的特征数除以它们“跨越”的不同特征总数。例如,如果i={a,b,c}和j={c,d},那么sim[i,j]=1/4=0.25,因为它们只有一个共同特征({c}),并且它们总共描述了4个不同的特征({a,b,c,d}) 计

我试图对一组我想要集群的对象使用R package
apcluster
,但我遇到了性能/内存问题,我怀疑我做得不对。我想听听你的意见

简而言之:我有一套大约13000个对象。每个对象都与一组2到5个“特征”相关联。任意两个对象I和j之间的相似性(最终我想通过它进行聚类)等于它们共有的特征数除以它们“跨越”的不同特征总数。例如,如果i={a,b,c}和j={c,d},那么sim[i,j]=1/4=0.25,因为它们只有一个共同特征({c}),并且它们总共描述了4个不同的特征({a,b,c,d})

计算我的NxN相似度矩阵在理论上不是问题:如果每个对象的特征都存储为列表,则可以使用集合操作来完成;或者特征可以旋转到1和0的矩阵,其中每列都是一个特征,然后R的函数
dist
method=“binary”
就可以实现这一点

然而,在实践中,第一个问题是,这种相似性计算非常缓慢。对于13K物体,大约有84.5m的相似性需要计算,但对于现代计算机来说,这听起来并不是那么糟糕。我不明白为什么要花几个小时才能完成。而set操作版本,据我所知应该更快,实际上比
dist
慢得多。[另一个名为
fingerprint
的软件包应该能够更有效地处理此类情况,但到目前为止,我还无法使其正常工作,它在尝试创建他们所谓的“featvec”对象时会出现很多错误]

另一个要考虑的是,每个对象的2-5个特征不是非常重复的。可能有一组大约100个对象,它们之间至少有一个共同特征,但其他12.9 K对象中没有一个与这100个对象具有任何共同特征。其结果是枢转特征矩阵非常稀疏(如果我们认为0是空的)。数据透视矩阵中大约有4000列,每行最多有5个1。我想知道这是否会对dist的性能产生负面影响,因为它必须乘以许多可以忽略的0

您认为将
dist
应用到我描述的矩阵需要几个小时,这是否正常?你能推荐一种利用矩阵稀疏性计算相似度的不同方法吗

无论如何,我设法从
dist
获得了输出,但是它有类'dist',是一个距离矩阵,而不是一个相似矩阵,所以我必须使用
1-as.matrix(distance\u matrix)
才能使相似矩阵
apcluster
需要作为输入

那是我第一个“记忆”问题。R说,由于载体的大小,无法分配。我尝试了通常的技巧,但最终我无法获得超过4GB的内存,而且我的矩阵(显然)更大

我克服了这一点,每次都将新的矩阵分配给它们的旧“自我”

然后,当我将这个精心拼凑的相似性矩阵提交给
apcluster
时,向量大小错误再次出现,好像
apcluster
所做的第一件事就是从我喂给它的东西中创建其他一些大对象

我在
apcluster
中查看了
as.Sparse…
,但考虑到您必须首先计算完整矩阵,它似乎没有多大帮助

最后,唯一起作用的是
apclusterL
的“杠杆亲和传播”,这是一个近似值

有人知道我是否能做得更好,以及如何做得更好吗?例如,首先透视数据是明智的,还是应该坚持列表和设置操作?或者,初始矩阵是稀疏的这一事实是否可以直接用于计算稀疏相似矩阵,而不是完全计算并在以后将其简化为稀疏

如有任何建议,将不胜感激。谢谢


顺便说一句,是的,我看到了这个帖子:;这似乎没有得到确切的回答。

R解释器真的很慢

因此,您应该主要使用R来“驱动”您的程序,但要用C或FORTRAN实现所有计算量大的东西

您没有显示正在使用的代码,但我猜它涉及嵌套for循环?尝试在R中重写它而不使用任何for循环,或者在C中重写它


但无论如何,AP群集始终保持非常缓慢的速度。它涉及到O(n²)矩阵的多次传递,即它的伸缩性非常差。

谢谢!与此同时,我发现我的R工作室运行了错误的R版本;我切换到64位版本,大约有8GB的内存。现在它可以处理我的矩阵了。仍然很慢,但至少不会崩溃,我不需要使用杠杆方法。我还发现了如何编写自定义相似性矩阵函数,可以直接在
apcluster
中使用,而无需生成中间矩阵。我会看看我是否能执行你的建议。