Estou tentando compilar uma lista de algoritmos de clustering que são:
- Implementado em R
- Opere em matrizes de dados esparsas (não matrizes de (des) similaridade), como aquelas criadas pela função sparseMatrix .
Existem várias outras perguntas no CV que discutem esse conceito, mas nenhuma delas se vincula aos pacotes R que podem operar diretamente em matrizes esparsas:
- Agrupando conjuntos de dados grandes e esparsos
- Agrupando dados binários esparsos de alta dimensão
- Procurando implementação de cluster esparsa e de alta dimensão
- Cluster com economia de espaço
Até agora, encontrei exatamente uma função no R que pode agrupar matrizes esparsas:
skmeans : km esféricos
Do pacote skmeans . kmeans usando a distância do cosseno . Opera em objetos dgTMatrix. Fornece uma interface para um algoritmo genético k-means, pclust, CLUTO, gmeans e kmndirs.
Exemplo:
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))
Os algoritmos a seguir recebem menções honrosas: não são algoritmos de cluster, mas operam em matrizes esparsas.
apriori : associação regras mineração
Do pacote arules . Opera em objetos "transações", que podem ser coagidos a partir de objetos ngCMatrix. Pode ser usado para fazer recomendações.
exemplo:
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 esparso
Do pacote irlba . Faz SVD em matrizes esparsas. Pode ser usado para reduzir a dimensionalidade de matrizes esparsas antes do agrupamento com pacotes R tradicionais.
exemplo:
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 : Agrupamento de propagação de afinidade
library(apcluster)
sim <- crossprod(M1)
sim <- sim / sqrt(sim)
clust_ap <- apcluster(sim) #Takes a while
Que outras funções existem por aí?
fonte
Respostas:
Eu não uso R. Geralmente, é muito lento e quase não tem suporte à indexação. Mas as recomendações de software são consideradas fora de tópico de qualquer maneira.
Observe que muitos algoritmos não se importam com a maneira como você armazena seus dados. Se você preferir ter uma matriz esparsa, essa deve ser sua escolha, não a escolha dos algoritmos.
Pessoas que usam muito R tendem a ficar presas no pensamento em operações de matriz (porque essa é a única maneira de escrever código rápido em R). Mas essa é uma maneira limitada de pensar. Por exemplo, k-significa: não se importa. Em particular, ele não usa distâncias aos pares. Ele só precisa de uma maneira de calcular a contribuição da variação; o que equivale a calcular a distância euclidiana ao quadrado.
Ou DBSCAN. Tudo o que precisa é de um predicado "vizinho". Pode trabalhar com gráficos arbitrários; a distância euclidiana e o limiar de Epsilon é a maneira mais comum de calcular o gráfico de vizinhança que ele usa.
PS Sua pergunta não é muito precisa. Você se refere a matrizes de dados esparsas ou matrizes de similaridade esparsas ?
fonte