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

机器算法验证 r 聚类
2022-01-22 04:19:42

我正在尝试编译以下聚类算法列表:

  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))

以下算法得到了尊敬的提及:它们不是完全聚类算法,而是在稀疏矩阵上运行。

apriori : 关联规则挖掘

来自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

还有哪些其他功能?

1个回答

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

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

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

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

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