PCA и кластерный анализ, очень медленные вычисления - PullRequest
0 голосов
/ 31 октября 2019

Мои данные имеют 30000 строк и 140 столбцов, и я пытаюсь кластеризовать данные. Я делаю PCA, а затем использую около 12 ПК для использования в кластерном анализе. Я взял случайную выборку из 3000 наблюдений и провел ее, и потребовалось 44 минуты, чтобы запустить и PCA, и иерархическую кластеризацию.

Сотрудник сделал то же самое в SPSS, и это заняло значительно меньше времени? Любая идея, почему?

Вот упрощенная версия моего кода, которая отлично работает, но очень медленно работает над чем-то более 2000 наблюдений. Я включил набор данных USArrest, который очень мал, поэтому он не отражает мою проблему, а показывает, что я пытаюсь сделать. Я не решаюсь публиковать большой набор данных, поскольку это кажется грубым.

Я не уверен, как ускорить кластеризацию. Я знаю, что могу делать случайные выборки данных, а затем использовать функцию прогнозирования для назначения кластеров тестовым данным. Но оптимально я хотел бы использовать все данные в кластеризации, так как данные являются статическими и никогда не будут изменяться или обновляться.

library(factoextra)
library(FactoMineR)       
library(FactoInvestigate) 

## Data

# mydata = My data has 32,000 rows with 139 variables.
# example data with small data set 
data("USArrests")
mydata <- USArrests

## Initial PCA on mydata

res.pca <- PCA(mydata, ncp=4, scale.unit=TRUE, graph = TRUE)

Investigate(res.pca)  # this report is very helpful!  I determined to keep 12 PC and start with 3 clusters.

## Keep PCA dataset with only 2 PC
res.pca1 <- PCA(mydata, ncp=2, scale.unit=TRUE, graph = TRUE)

## Run a HC on the PC:  Start with suggested number of PC and Clusters 
res.hcpc <- HCPC(res.pca1, nb.clust=4, graph = FALSE)

## Dendrogram
fviz_dend(res.hcpc,
          cex = 0.7, 
          palette = "jco",
          rect = TRUE, rect_fill = TRUE, 
          rect_border = "jco", 
          labels_track_height = 0.8 
)

## Cluster Viz
fviz_cluster(res.hcpc,
             geom = "point",  
             elipse.type = "convex", 
             #repel = TRUE, 
             show.clust.cent = TRUE, 
             palette = "jco", 
             ggtheme = theme_minimal(),
             main = "Factor map"
)


#### Cluster 1: Means of Variables
res.hcpc$desc.var$quanti$'1'

#### Cluster 2: Means of Variables
res.hcpc$desc.var$quanti$'2'

#### Cluster 3: Means of Variables
res.hcpc$desc.var$quanti$'3'

#### Cluster 4: Means of Variables
res.hcpc$desc.var$quanti$'4'

#### Number of Observations in each cluster
cluster_hd = res.hcpc$data.clust$clust
summary(cluster_hd)  

Есть идеи, почему SPSS намного быстрее?

Есть идеи, как это ускорить? Я знаю, что кластеризация является трудоемкой, но я не уверен, какой порог для эффективности, и мои данные о 30 000 записей и 140 переменных.

Являются ли некоторые другие пакеты кластеризации более эффективными? Предложения

1 Ответ

1 голос
/ 31 октября 2019

HCPC - это иерархическая кластеризация по основным компонентам с использованием критерия Уорда. Вместо этого вы можете использовать алгоритм k-средних для части кластеризации, что намного быстрее: иерархическая кластеризация имеет временную сложность O (n³), тогда как k-средних имеет сложность O (n), где n - количество наблюдений.

Поскольку критерии, оптимизированные с помощью k-средних и иерархической кластеризации с помощью Ward, одинаковы (минимизировать общую дисперсию внутри кластера), вы можете использовать первые k-средние с большим количеством кластеров (например, 300)а затем запустите иерархическую кластеризацию по центрам кластеров, если вам нужно сохранить иерархический аспект.

...