在稀疏数据矩阵上运行的聚类算法


18

我正在尝试编译以下群集算法列表:

  1. 在R中实施
  2. 对稀疏数据矩阵(不是(非)相似性矩阵)进行操作,例如由sparseMatrix函数创建的矩阵

关于CV的其他几个问题都在讨论这个概念,但是这些问题都没有链接到可以直接在稀疏矩阵上运行的R包:

  1. 聚类大型稀疏数据集
  2. 聚类高维稀疏二进制数据
  3. 寻找稀疏和高维聚类实现
  4. 节省空间的集群

到目前为止,我已经在R中找到了一个可以聚类稀疏矩阵的函数:

skmeans:球形kmeans

来自skmeans包。kmeans使用余弦距离。在dgTMatrix对象上操作。提供与遗传k均值算法,pclust,CLUTO,gmeans和kmndirs的接口。

例:

library(Matrix)
set.seed(42)

nrow <- 1000
ncol <- 10000
i <- rep(1:nrow, sample(5:100, nrow, replace=TRUE))
nnz <- length(i)
M1 <- sparseMatrix(i = i,
                   j = sample(ncol, nnz, replace = TRUE),
                   x = sample(0:1 , nnz, replace = TRUE), 
                   dims = c(nrow, ncol))
M1 <- M1[rowSums(M1) != 0, colSums(M1) != 0]

library(skmeans)
library(cluster)
clust_sk <- skmeans(M1, 10, method='pclust', control=list(verbose=TRUE))
summary(silhouette(clust_sk))

以下算法值得一提:它们不是完全的聚类算法,而是在稀疏矩阵上运行。

先验:关联规则挖掘

arules包。在“交易”对象上操作,该对象可以从ngCMatrix对象强制转换。可以用来提出建议。

例:

library(arules)
M1_trans <- as(as(t(M1), 'ngCMatrix'), 'transactions')
rules <- apriori(M1_trans, parameter = 
list(supp = 0.01, conf = 0.01, target = "rules"))
summary(rules)

irlba:稀疏SVD

来自irlba包。在稀疏矩阵上执行SVD。在与传统R包聚类之前,可用于减少稀疏矩阵的维数。

例:

library(irlba)
s <- irlba(M1, nu = 0, nv=10)
M1_reduced <- as.matrix(M1 %*% s$v)
clust_kmeans <- kmeans(M1, 10)
summary(silhouette(clust_kmeans$cluster, dist(M1_reduced)))

apcluster:亲和力传播聚类

library(apcluster)
sim <- crossprod(M1)
sim <- sim / sqrt(sim)
clust_ap <- apcluster(sim) #Takes a while

还有哪些其他功能?


您是说稀疏,如“大量零”还是“缺少许多值”?
cbeleites支持Monica 2014年

根据stats.stackexchange.com/help/dont-ask上的多个标准,这个问题似乎不合时宜:每个答案都同样有效,除了提供的答案之外,您还希望有更多答案,并且没有实际问题解决了。
Whuber

我意识到这个问题已经解决了,但是当我浏览类似的问题时,我浏览了所有关于此的问题;)我发现该库使用的亲和力倾向适用于稀疏矩阵:bioinf.jku.at /软件/ apcluster
标志着

1
@MarkeD非常感谢!实在太糟糕了,这里的软件建议不合时宜,因为我在网上找不到其他地方可以提出建议。
Zach 2015年

3
再次关闭了一个非常有用的问题:(如果您不知道答案,请不要投票关闭!
MonsterMMORPG '16

Answers:


1

我不使用R。它通常非常慢,几乎没有索引支持。但是无论如何,软件推荐都被认为是题外话。

请注意,许多算法并不关心您如何存储数据。如果您更喜欢稀疏矩阵,那应该是您的选择,而不是算法的选择。

使用过多R的人往往会陷入矩阵运算的思维中(因为这是用R编写快速代码的唯一方法)。但这是一种有限的思维方式。例如k-均值:不在乎。特别是,它根本不使用成对距离。它只需要一种计算方差贡献的方法即可。这等效于计算平方的欧几里得距离。

或DBSCAN。它所需要的只是一个“邻居”谓词。它可以与任意图一起使用;只是欧几里得距离和Epsilon阈值是计算它使用的邻域图的最常用方法。

PS:您的问题不是很准确。您是指稀疏数据矩阵还是稀疏相似矩阵


1
稀疏数据矩阵
Zach 2014年

大多数算法可以对稀疏数据矩阵进行操作。例如,AGNESS,PAM,DBSCAN,OPTICS,CLARA,...
Anony-Mousse -Reinstate Monica

不知道为什么你连回答,如果你不知道R.
user3932000

我知道R。可能比一般R用户更好。我知道R中的非标准评估,而且我知道大多数模块都是用C编写的,因此当您传递稀疏矩阵时,首先将其复制到有义矩阵中,然后再将其传递给实际代码。而且每个程序包都使用不同的方式...效率不高。如果您需要效率或良好的集成或向后兼容性或协调开发,则不要选择R。
Anony-Mousse-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.