gpt4 book ai didi

混合和大型数据集的 R 距离矩阵和聚类?

转载 作者:行者123 更新时间:2023-12-04 12:08:33 32 4
gpt4 key购买 nike

我的目的是在 r 中对零售数据进行聚类以进行客户分割。

我需要用于聚类的完整数据集,但在评估模型时将分为训练/测试。该数据集包含 36 个变量的 133,153 个观察值,包括数值、分类和缺失值 (14.1 MB)。

如何在 r 中使用混合和大型数据集进行聚类?

我的机器:

sessionInfo() R version 3.1.0 (2014-04-10) Platform: x86_64-apple-darwin13.1.0 (64-bit)



Mac OSX 版本 10.9.3
4GB 内存

这是一个线程,建议在使用聚类算法(例如 k-means)之前将 daisy () 包用于混合数据类型:
implementation of the Gower distance function .

由于无法分配向量的错误,我无法使用 daisy。在传统聚类方法(如 k 均值)之前,面向矩阵的方法存在可扩展性问题。

错误:
#Load Data
Store1 <- read.csv("/Users/scdavis6/Documents/Work/TowerData/TowerData/Client1.csv", head=FALSE)
#Convert csv to data.frame
df <-as.data.frame(Store1)
#Create dissimilarity matrix
daisy1 <- daisy(df)
Error: cannot allocate vector of size 66.0 Gb

另一个线程建议在 r 中使用 bigmemory 包进行内存管理: R memory management / cannot allocate vector of size n Mb .

我无法使用 read.big.matrix () 函数将数据存储在矩阵中,因为 bigmemory 包不允许混合数据类型。

如果我能提供更多信息,请告诉我。

最佳答案

我一直被困在同样的问题上。对于计算距离的方式,您可能需要使用 Gower 变换。如果您没有连续数据,您可以使用重叠函数,我还没有在 R 上找到它( this paper )。这是我发现的计算问题:

在一个非常大的数据集上计算距离太多 N观察结果在计算上是可行的,可以应用最近的论文 (this one) 中使用的解决方案。他们提出了一种明智的处理方式:他们创建一个新数据集,其中每个新行都是 d 上的值的可能组合。原始数据集中的属性。因此,这将给出一个带有 M < N 的新矩阵距离矩阵在计算上可行的观察。他们“创建了一个包含所有可能情况的网格,以及它们相应的距离(每个距离),并使用这个网格创建了我们的集群,我们随后将我们的观察分配给了这些集群”

我试图利用这个 answer 在 R 中重现它与 library(plyr) .在下面我将只使用 4 个观察值,但它应该适用于 N观察,只要你产生的组合会减少内存需求

id <- c(1,2,3,4)
a <- c(1,1,0,1)
b <- c(0,1,0,0)
c <- c(3,2,1,3)
d <- c(1,0,1,1)
Mydata <- as.data.frame(cbind(id, a,b,c,d))
Mydata
id a b c d
1 1 0 3 1
2 1 1 2 0
3 0 0 1 1
4 1 0 3 1

require(plyr)
Mydata_grid <- count(Mydata[,-1])
Mydata_grid
a b c d freq
1 0 3 1 2
1 1 2 0 1
0 0 1 1 1

哪里 freq是原始 Mydata 中组合的频率.然后我只应用我更喜欢的距离测量 Mydata_grid .在这种情况下,我的数据是分类数据,因此我应用了 jaccard(我不知道它对示例中的数据是否正确。也许我应该使用 overlap 匹配函数,但我还没有在 R 中找到它)
require(vegan)
dist_grid <- vegdist(Mydata_grid, method="jaccard")
d_matrix <- as.matrix(dist_grid)
d_matrix
1 2 3
1 0.0000000 0.5714286 0.6666667
2 0.5714286 0.0000000 0.5000000
3 0.6666667 0.5000000 0.0000000

这是我们的 distance_matrix。现在直接集群就足够了 d_grid
clusters_d <- hclust(dist_grid, method="ward.D2")
cluster <- cutree(clusters_d, k = 2) # k= number of clusters
cluster
1 2 1

这是将每个组合分配给每个集群的向量。现在回到原样就够了,大功告成。这样做只是做
Mydata_cluster <- cbind(Mydata_grid, cluster, Mydata_grid$freq)

然后使用 rep 将样本扩展到原始维度
Mydata_cluster_full <- Mydata_cluster[rep(row.names(Mydata_cluster), Mydata_cluster$freq), 1:(dim(Mydata_cluster)[2]-1)]
Mydata_cluster_full
a b c d freq cluster
0 0 1 1 1 1
1 0 3 1 2 2
1 0 3 1 2 2
1 1 2 0 1 1

也可以添加原版 id向量并删除 freq列式
Mydata_cluster_full$id <- id
Mydata_cluster_full$freq <- NULL

a b c d freq cluster id
0 0 1 1 1 1 1
1 0 3 1 2 2 2
1 0 3 1 2 2 3
1 1 2 0 1 2 4

如果您不是不走运,此过程会将计算距离矩阵所需的内存量减少到可行的水平。

关于混合和大型数据集的 R 距离矩阵和聚类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24196897/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com