我如何将购物篮项目划分为集群?
How can i partition market basket items into clusters?
我有一个数据集如下:(我举了一个简单的例子,但真实的数据集要大得多)
V1 V2 V3 V4
1 1 0 0 1
2 0 1 1 0
3 0 0 1 0
4 1 1 1 1
5 0 1 1 0
6 1 0 0 1
7 0 0 0 1
8 0 1 1 1
9 1 0 1 0
10 0 1 1 0
...
其中 V1、V2、V3...Vn 是项目,1、2、3、4...1000 是交易。我想将这些项目划分为 k 个集群,以便在每个集群中我拥有在同一交易中最常一起出现的项目。
为了确定每对项目一起出现的次数,我尝试了交叉表,得到以下结果:
V1 V2 V3 V4
V1 4 1 2 3
V2 1 5 5 2
V3 2 5 7 2
V4 3 2 2 5
对于这个小例子,如果我想创建 2 个集群 (k=2),这样一个集群必须包含 2 个项目(以保持集群之间的平衡),我将得到:
集群 1={V1,V4}
集群 2={V2,V3}
因为:
1) V1 出现频率更高,V4 (V1,V4)=3 > (V1,V3) > (V1,V2) 与 V4 相同。
2) V2 出现频率更高,V2 (V2,V3)=5 > (V2,V4) > (V2, V1) 与 V3 相同。
如何使用 R 进行此分区并获得更大的数据集?
library(data.table)
数据:
df<-
fread("
V1 V2 V3
1 1 0 0
2 0 0 1
3 0 0 1
4 1 1 1
5 0 0 1
6 1 0 0
7 0 0 0
8 0 1 1
9 1 0 1
10 0 1 1
")[,-1]
代码:
setDT(df)
sapply(names(df),function(x){
df[get(x)==1,lapply(.SD,sum,na.rm=T),.SDcols=names(df)]
})
结果:
V2 V3 V4
V2 4 1 2
V3 1 3 3
V4 2 3 7
df <- read.table(text="
ID V1 V2 V3
1 1 0 0
2 0 0 1
3 0 0 1
4 1 1 1
5 0 0 1
6 1 0 0
7 0 0 0
8 0 1 1
9 1 0 1
10 0 1 1
", header = TRUE)
k = 3 # number of clusters
library(dplyr)
df %>%
# group and count on all except the first id column
group_by_at(2:ncol(df)) %>%
# get the counts, and collect all the transaction ids
summarize(n = n(), tran_ids = paste(ID, collapse = ',')) %>%
ungroup() %>%
# grab the top k summarizations
top_n(k, n)
# V1 V2 V3 n tran_ids
# <int> <int> <int> <int> <chr>
# 1 0 0 1 3 2,3,5
# 2 0 1 1 2 8,10
# 3 1 0 0 2 1,6
我想你问的是集群。它与您在上面所做的不太一样,但您可以使用 hclust
来寻找具有合适距离度量的变量之间的相似性。
例如
plot(hclust(dist(t(df),method="binary")))
产生以下...
您应该查看 ?dist
以查看此距离度量在您的上下文中是否有意义,并查看 ?hclust
获得树状图后可以执行的其他操作(例如识别聚类)。
或者您可以将交叉表用作距离矩阵(也许取值的倒数,然后 as.dist
)。
您可以转置 table 并使用标准聚类方法。因此,您将对项目进行聚类。特征是交易。
几何方法可以像 kmeans 一样使用。或者,您可以使用提供信息标准(如 BIC)的混合模型来选择聚类数。这是一个 R 脚本
require(VarSelLCM)
my.data <- as.data.frame(t(df))
# To consider Gaussian mixture
# Alternatively Poisson mixture can be considered by converting each column into integer.
for (j in 1:ncol(my.data)) my.data[,j] <- as.numeric(my.data[,j])
## Clustering by considering all the variables as discriminative
# Number of clusters is between 1 and 6
res.all <- VarSelCluster(my.data, 1:6, vbleSelec = FALSE)
# partition
res.all@partitions@zMAP
# shiny application
VarSelShiny(res.all)
## Clustering with variable selection
# Number of clusters is between 1 and 6
res.selec <- VarSelCluster(my.data, 1:6, vbleSelec = TRUE)
# partition
res.selec@partitions@zMAP
# shiny application
VarSelShiny(res.selec)
我有一个数据集如下:(我举了一个简单的例子,但真实的数据集要大得多)
V1 V2 V3 V4
1 1 0 0 1
2 0 1 1 0
3 0 0 1 0
4 1 1 1 1
5 0 1 1 0
6 1 0 0 1
7 0 0 0 1
8 0 1 1 1
9 1 0 1 0
10 0 1 1 0
...
其中 V1、V2、V3...Vn 是项目,1、2、3、4...1000 是交易。我想将这些项目划分为 k 个集群,以便在每个集群中我拥有在同一交易中最常一起出现的项目。 为了确定每对项目一起出现的次数,我尝试了交叉表,得到以下结果:
V1 V2 V3 V4
V1 4 1 2 3
V2 1 5 5 2
V3 2 5 7 2
V4 3 2 2 5
对于这个小例子,如果我想创建 2 个集群 (k=2),这样一个集群必须包含 2 个项目(以保持集群之间的平衡),我将得到:
集群 1={V1,V4}
集群 2={V2,V3}
因为:
1) V1 出现频率更高,V4 (V1,V4)=3 > (V1,V3) > (V1,V2) 与 V4 相同。
2) V2 出现频率更高,V2 (V2,V3)=5 > (V2,V4) > (V2, V1) 与 V3 相同。
如何使用 R 进行此分区并获得更大的数据集?
library(data.table)
数据:
df<-
fread("
V1 V2 V3
1 1 0 0
2 0 0 1
3 0 0 1
4 1 1 1
5 0 0 1
6 1 0 0
7 0 0 0
8 0 1 1
9 1 0 1
10 0 1 1
")[,-1]
代码:
setDT(df)
sapply(names(df),function(x){
df[get(x)==1,lapply(.SD,sum,na.rm=T),.SDcols=names(df)]
})
结果:
V2 V3 V4
V2 4 1 2
V3 1 3 3
V4 2 3 7
df <- read.table(text="
ID V1 V2 V3
1 1 0 0
2 0 0 1
3 0 0 1
4 1 1 1
5 0 0 1
6 1 0 0
7 0 0 0
8 0 1 1
9 1 0 1
10 0 1 1
", header = TRUE)
k = 3 # number of clusters
library(dplyr)
df %>%
# group and count on all except the first id column
group_by_at(2:ncol(df)) %>%
# get the counts, and collect all the transaction ids
summarize(n = n(), tran_ids = paste(ID, collapse = ',')) %>%
ungroup() %>%
# grab the top k summarizations
top_n(k, n)
# V1 V2 V3 n tran_ids
# <int> <int> <int> <int> <chr>
# 1 0 0 1 3 2,3,5
# 2 0 1 1 2 8,10
# 3 1 0 0 2 1,6
我想你问的是集群。它与您在上面所做的不太一样,但您可以使用 hclust
来寻找具有合适距离度量的变量之间的相似性。
例如
plot(hclust(dist(t(df),method="binary")))
产生以下...
您应该查看 ?dist
以查看此距离度量在您的上下文中是否有意义,并查看 ?hclust
获得树状图后可以执行的其他操作(例如识别聚类)。
或者您可以将交叉表用作距离矩阵(也许取值的倒数,然后 as.dist
)。
您可以转置 table 并使用标准聚类方法。因此,您将对项目进行聚类。特征是交易。
几何方法可以像 kmeans 一样使用。或者,您可以使用提供信息标准(如 BIC)的混合模型来选择聚类数。这是一个 R 脚本
require(VarSelLCM)
my.data <- as.data.frame(t(df))
# To consider Gaussian mixture
# Alternatively Poisson mixture can be considered by converting each column into integer.
for (j in 1:ncol(my.data)) my.data[,j] <- as.numeric(my.data[,j])
## Clustering by considering all the variables as discriminative
# Number of clusters is between 1 and 6
res.all <- VarSelCluster(my.data, 1:6, vbleSelec = FALSE)
# partition
res.all@partitions@zMAP
# shiny application
VarSelShiny(res.all)
## Clustering with variable selection
# Number of clusters is between 1 and 6
res.selec <- VarSelCluster(my.data, 1:6, vbleSelec = TRUE)
# partition
res.selec@partitions@zMAP
# shiny application
VarSelShiny(res.selec)