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

我的意图涉及将客户细分的零售数据集中在r。

我需要完整的数据集进行聚类,但是在评估模型时会分解为训练/测试。 该数据集有133,153个观测数据,包括数值,分类和缺失值(14.1 MB)。

我如何用r混合大型数据集?

我的机器:

sessionInfo()R版本3.1.0(2014-04-10)平台:x86_64-apple-darwin13.1.0(64位)

Mac OSX版本10.9.3 4GB RAM

下面是一个线程,建议在使用聚类算法(如k-means:实现Gower距离函数)之前,将daisy()包用于混合数据类型。

由于无法分配矢量的错误,我无法使用雏菊。 在像k-means这样的传统聚类方法之前,存在基于矩阵的方法的可扩展性问题。

错误:

#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软件包进行内存管理/不能分配大小为n Mb的向量。

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

请让我知道我是否可以提供更多信息。


我一直被困在同一个问题上。 对于计算距离的方式,您可能需要使用高尔转换。 如果你没有连续的数据,你可以使用一个重叠函数,这在我还没有设法找到(本文)。 在这里,我发现了计算问题:

为了计算N观测值过大的超大数据集上的距离以便计算可行,可以应用本文最近使用的解决方案(本文)。 他们提出了一个聪明的方法来进行:他们创建一个新的数据集,其中每个新行都是原始数据集中d属性值的可能组合。 因此,这将给出具有M < N观测值的新矩阵,其中距离矩阵在计算上可行。 他们“创建一个包含所有可能情况的网格,以及它们相应的距离(来自每个热点的距离),并使用这个网格创建我们的聚类,我们随后将其分配给我们的观察结果”

我试图在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

如果你不是不巧,这个过程将减少计算距离矩阵到可行的水平所需的内存量。

链接地址: http://www.djcxy.com/p/31857.html

上一篇: R distance matrix and clustering for mixed and large dataset?

下一篇: Big Data convert to "transactions" from arules package