pca和聚类分析,计算速度非常慢

pca and cluster analysis, very slow computing

我的数据有 30,000 行和 140 列,我正在尝试对数据进行聚类。我正在做一个 pca,然后使用大约 12 个 pc 用于聚类分析。我从 3000 个观测值中提取了 运行dom 样本并 运行 它花了 44 分钟来 运行 pca 和层次聚类。

一位同事在 SPSS 中做了同样的事情并且花费了更少的时间?知道为什么吗?

这是我的代码的简化版本,它运行良好,但在超过 2000 次观察时确实很慢。我包括了 USArrest 数据集,它非常小,所以它并不能真正代表我的问题,但显示了我正在尝试做的事情。我对 post 大型数据集犹豫不决,因为这看起来很粗鲁。

我不确定如何加快集群速度。我知道我可以对数据进行 运行dom 样本,然后使用预测函数将聚类分配给测试数据。但最佳情况下,我想使用集群中的所有数据,因为数据是静态的,永远不会更改或更新。

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 个变量的数据。

其他一些集群包是否更有效?建议?

HCPC 是使用 Ward 标准对主成分进行的层次聚类。您可以对聚类部分使用 k-means 算法,这样速度更快:层次聚类的时间复杂度为 O(n³),而 k-means 的复杂度为 O(n),其中 n 是观察次数。

由于通过 k-means 优化的标准和使用 Ward 的层次聚类是相同的(最小化簇内总方差),您可以首先使用具有大量簇(例如 300)的 k-means然后 运行 如果您需要保持层次方面,则在聚类的中心进行层次聚类。