кластеризация очень большого набора данных в R

У меня есть набор данных, состоящий из 70 000 числовых значений, представляющих расстояния от 0 до 50, и я хочу сгруппировать эти числа; однако, если я пытаюсь классический подход кластеризации,то мне нужно будет установить матрицу расстояний 70 000X70 000,представляющую расстояния между каждым из двух чисел в моем наборе данных, которые не будут вписываться в память, поэтому мне было интересно, есть ли какой-либо умный способ решить эту проблему без необходимости делать стратифицированную выборку? Я также попробовал bigmemory и большие библиотеки аналитики в R, но все еще не могут поместить данные в память

3 ответов


можно использовать kmeans, который нормально соответствующий для этого количества данных, высчитать важное число центров (1000, 2000,...) и выполнять иерархический кластерный подход по координатам этих центров.Так матрица расстояний будет меньше.

## Example
# Data
x <- rbind(matrix(rnorm(70000, sd = 0.3), ncol = 2),
           matrix(rnorm(70000, mean = 1, sd = 0.3), ncol = 2))
colnames(x) <- c("x", "y")

# CAH without kmeans : dont work necessarily
library(FactoMineR)
cah.test <- HCPC(x, graph=FALSE, nb.clust=-1)

# CAH with kmeans : work quickly
cl <- kmeans(x, 1000, iter.max=20)
cah <- HCPC(cl$centers, graph=FALSE, nb.clust=-1)
plot.HCPC(cah, choice="tree")

70000 не большой. Он не маленький, но и не очень большой... Проблема заключается в ограниченной масштабируемости матрица-ориентированный подходы.

но есть много алгоритмов кластеризации, которые не используют матрицы и не нужен O(n^2) (или еще хуже, O(n^3)) во время выполнения.

вы можете попробовать елки, который имеет большую поддержку индекса (попробуйте R*-дерево с sorttimerecursive массовой загрузкой). Поддержка индекса делает его много много много быстрее.

если вы настаиваете на использовании R, дайте хотя бы kmeans попробовать и fastcluster пакета. K-means имеет сложность выполнения O(n*k*i) (где k-параметр k, а i-количество итераций); fastcluster имеет O(n) память и O(n^2) реализация выполнения кластеризации с одной связью, сопоставимой с алгоритмом SLINK в ELKI. (Иерархическая кластеризация R "agnes" будет использовать O(n^3) runtime и O(n^2) памяти).

вопросы реализации. Часто реализации в R не являются лучшими IMHO, за исключением core R, который обычно имеет конкурентоспособную численную точность. Но R был построен статистиками, а не шахтерами данных. Основное внимание уделяется статистической выразительности, а не масштабируемости. Так что авторы не виноваты. Это просто неправильный инструмент для больших данных.

О, и если ваши данные одномерны, не используйте кластеризацию вообще. Используйте оценку плотности ядра. 1 размерные данные являются особыми: они упорядочены. Любой товар алгоритм для взлома 1-мерных данных в inverals следует использовать, что вы можете сортировать данные.


другим нематричным ориентированным подходом, по крайней мере для визуализации кластера в больших данных, является алгоритм largeVis от Tang et al. (2016). Пакет largeVis R, к сожалению, был осиротел на CRAN из-за отсутствия обслуживания пакета, но a (поддерживается?) версия все еще может быть скомпилирована из репозитория gitHub через (установив Rtools), например,

library(devtools)     
install_github(repo = "elbamos/largeVis")

версия пакета python также существует. Базовый алгоритм использует деревья сегментации и neigbourhood изысканность, чтобы найти K большинство подобных экземпляров для каждого наблюдения, а затем проецирует результирующую сеть соседства в dim более низкие размеры. Ее реализовали в C++ и использует OpenMP (если поддерживается при компиляции) для многопроцессорной обработки; таким образом, он был достаточно быстрым для кластеризации любых больших наборов данных, которые я тестировал до сих пор.