Estoy tratando de compilar una lista de algoritmos de agrupamiento que son:
- Implementado en R
- Opere en matrices de datos dispersos (no (des) matrices de similitud), como las creadas por la función sparseMatrix .
Hay varias otras preguntas en CV que discuten este concepto, pero ninguna de ellas se vincula a paquetes R que pueden operar directamente en matrices dispersas:
- Agrupación de conjuntos de datos grandes y dispersos
- Agrupación de datos binarios dispersos de alta dimensión
- Buscando una implementación de agrupación dispersa y de alta dimensión
- Agrupación de espacio eficiente
Hasta ahora, he encontrado exactamente una función en R que puede agrupar matrices dispersas:
skmeans : kmeans esféricos
Del paquete skmeans . k significa que usa la distancia cosenoidal . Opera en objetos dgTMatrix. Proporciona una interfaz para un algoritmo genético k-means, pclust, CLUTO, gmeans y kmndirs.
Ejemplo:
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))
Los siguientes algoritmos obtienen menciones honestas: no son algoritmos de agrupación, sino que funcionan en matrices dispersas.
a priori : la asociación gobierna la minería
Del paquete arules . Opera en objetos de "transacciones", que pueden ser forzados a partir de objetos ngCMatrix. Se puede usar para hacer recomendaciones.
ejemplo:
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 escasa
Del paquete irlba . Hace SVD en matrices dispersas. Se puede utilizar para reducir la dimensionalidad de matrices dispersas antes de la agrupación con paquetes R tradicionales.
ejemplo:
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 : agrupación de propagación de afinidad
library(apcluster)
sim <- crossprod(M1)
sim <- sim / sqrt(sim)
clust_ap <- apcluster(sim) #Takes a while
¿Qué otras funciones hay por ahí?
fuente
Respuestas:
No uso R. A menudo es muy lento y casi no tiene soporte de indexación. Pero las recomendaciones de software se consideran fuera de tema de todos modos.
Tenga en cuenta que a muchos algoritmos no les importa cómo almacena sus datos. Si prefiere tener una matriz dispersa, esa debería ser su elección, no la elección de algoritmos.
Las personas que usan demasiado R tienden a atascarse en pensar en operaciones matriciales (porque esa es la única forma de escribir código rápido en R). Pero esa es una forma limitada de pensar. Por ejemplo k-significa: no le importa. En particular, no utiliza distancias por pares en absoluto. Solo necesita una manera de calcular la contribución de la varianza; que es equivalente a calcular la distancia euclidiana al cuadrado.
O DBSCAN. Todo lo que necesita es un predicado "vecino". Puede funcionar con gráficos arbitrarios; es solo que la distancia euclidiana y el umbral de Epsilon es la forma más común de calcular el gráfico de vecindad que usa.
PD: Tu pregunta no es muy precisa. ¿Se refiere a matrices de datos dispersas o matrices de similitud dispersas ?
fuente