>我有一个由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 矩阵),因此限制来自我的计算机。我已经在统计/快速集群/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 均值方法非常适合由数值组成的大型数据集。在我的示例中,我得到了数字和字母数字值。我试图将我的定性变量转换为二进制数值变量来执行 k 均值的过程:
第一个数据帧(示例):
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
如果我只有几个模态没关系,但在真实的数据集中,我们可以为 10.000k 行的基础获得大约 50 个模态。我不认为k-means是这类问题的解决方案。
从阅读您的问题来看,似乎有两个问题:
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 或它的离散版本。有几个问题涉及这个问题:第 1 季度、第 2 季度