对大数据集进行聚类(定量/定性值)

Posted

技术标签:

【中文标题】对大数据集进行聚类(定量/定性值)【英文标题】:Cluster a big data set (quantitative/qualitative values) 【发布时间】:2016-11-08 16:29:42 【问题描述】:

我有一个由 54 000 行和几列 (7) 组成的数据集。我的值是数字和字母数字(定性和定量变量)。我想使用 R 中的函数 hclust 对其进行聚类。

举个例子:

X <- data.frame(rnorm(54000, sd = 0.3),
                rnorm(54000, mean = 1, sd = 0.3),
                sample( LETTERS[1:24], 54000, replace=TRUE),
                sample( letters[1:10], 54000, replace=TRUE),
                round(rnorm(54000,mean=25, sd=3)),
                round(runif(n = 54000,min = 1000,max = 25000)),
                round(runif(54000,0,200000)))
colnames(X) <- c("A","B","C","D","E","F","G") 

如果我像这样使用 hclust 函数:

hclust(dist(X), method = "ward.D")

我收到此错误消息:

Error: cannot allocate vector of size 10.9 Gb

有什么问题?我正在尝试创建一个 54k * 54k 矩阵,该矩阵太大而无法由我的 PC(4Go RAM)计算。我读到自 R3.0.0 以来,该软件现在为 64 位(能够与我的示例中的 2.916e+09 矩阵一起使用),因此限制来自我的计算机。我已经在 stats/fastcluster/flashClust 中尝试使用 hclust 并遇到同样的问题。

在这个包中,hclust 是这样描述的:

hclust(d, method="complete", members=NULL)
flashClust(d, method = "complete", members=NULL)

d   a dissimilarity structure as produced by dist.

我们总是需要一个dist 矩阵来使这个函数工作。我还尝试使用以下方法为 R 会话设置更高的计算机限制:

memory.limit(size = 4014)
memory.size(max = TRUE)

问题:

是否可以在不使用此dist() 矩阵的情况下使用层次聚类(或类似的方式来聚类数据)用于具有 R 的定量/定性数据集?

编辑:

关于k-means:

k-means 方法适用于由数值组成的大型数据集。在我的示例中,我得到了数字和字母数字值。我试图将我的定性变量转换为二进制数值变量来执行 k-means 的过程:

第一个数据帧(示例):

Col1     Col2  Col3
1   12 43.93145 Alpha
2   45 44.76081  Beta
3   48 45.09708 Gamma
4   31 45.42278 Alpha
5   12 46.53709 Delta
6    7 39.07841  Beta
7   78 49.60947 Alpha

如果我把它转换成二进制变量,我会得到这个:

Col1     Col2 Alpha Beta Gamma Delta
1   12 44.29369     1    0     0     0
2   45 43.90610     0    1     0     0
3   48 44.82659     0    0     1     0
4   31 43.09096     1    0     0     0
5   12 42.71190     0    0     0     1
6    7 43.71710     0    1     0     0
7   78 42.24293     1    0     0     0

如果我只有几个模态也没关系,但在一个真实的数据集中,我们可以为 50k 行的基础获得大约 10.000 个模态。我不认为 k-means 是这类问题的解决方案。

【问题讨论】:

我相信在这种情况下,你唯一的选择,AFAIK,是直接使用kmeans,或者在FactorMineR::HCPC 函数中使用here @cedeterman :谢谢,感谢您的帮助。我尝试了 2 个使用 k-means 的新模型,但它不能很好地回答我的问题。 【参考方案1】:

从阅读您的问题来看,似乎有两个问题:

1. You have a fairly large amount of observations for clustering
2. The categorical variables have high cardinality

我的建议:

1) 您可以只取样并使用fastcluster::hclust,或使用clara。 可能在整理出 2) 之后,您可以使用更多的观察结果,无论如何使用样本都可以。尝试对类别进行分层抽样。

2)您基本上需要以数字格式表示这些类别,而不需要多出 10000 列。您可以使用 PCA 或它的离散版本。 几个问题处理这个问题: q1, q2

【讨论】:

感谢您的宝贵时间,不胜感激。我会根据你的建议尝试一些事情,稍后我会发布我的代码作为答案。

以上是关于对大数据集进行聚类(定量/定性值)的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在 Python 中对多元时间序列数据集进行聚类吗

使用 Python 对大数据集进行模糊逻辑

k-means聚类分析 python 代码实现(不使用现成聚类库)

k-means聚类分析 python 代码实现(不使用现成聚类库)

使用 4 个参数对数据集进行聚类和标记

稀疏数据集上的光谱聚类