集群大数据集(定量/定性值)

时间:2016-07-06 14:51:33

标签: r k-means hierarchical-clustering bigdata

我有一个由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是这类问题的解决方案。

1 个答案:

答案 0 :(得分: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或其离散版本。 一些问题涉及这个问题: q1q2