кластеризация очень большого набора данных в 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
(если поддерживается при компиляции) для многопроцессорной обработки; таким образом, он был достаточно быстрым для кластеризации любых больших наборов данных, которые я тестировал до сих пор.