如何根据频率对分类变量进行聚类/分组?



>我有一组观察结果示例,如下所示

var1 var2 var3 var4
1    2    1     1
3    2    1     3
1    2    0     1
3    2    2     3

所有值本质上都是分类的。我想将第 1 行和第 3 行分组到一个集群,将第 2 行和第 4 行分组到另一个集群。我相信 One-hot 编码在这种情况下是无效的,因为分类变量不具有任何等级,而且它们本质上纯粹是名义上的。

(行不必也完全相同)。是否有预先构建的数学算法可以根据相似性/频率对这些行进行分组?谁能建议一个好方法?还是我应该使用一键编码?

您可以使用高尔距离来计算分类变量之间的距离。

下面是一个示例:

# Import data
dta <- read.table(header = TRUE, textConnection("Var1 var2 var3 var4
1    2    1     1
3    2    1     3
1    2    0     1
3    2    2     3"))
dta <- as.data.frame(lapply(dta, as.factor))

# Create distance matrix using gower distance using gower package (fast)
# The code below computes the complete distance matrix, while only the upper
# or lower half is needed; so this could be improved. 
library(gower)
pairs <- expand.grid(x = seq_len(nrow(dta)), y = seq_len(nrow(dta)))
dist <- gower_dist(dta[pairs$x,], dta[pairs$y, ])
dist <- array(dist, dim = c(nrow(dta), nrow(dta)))
# Convert matrix to distance object
dist <- as.dist(dist)
# Cluster using distance matrix; for this there are numerous options
# Use hierarchical clustering in this case
cl <- hclust(dist)
plot(cl)

另一种使用群集包的解决方案(als 包含大量 聚类方法)

library(cluster)
dist <- daisy(dta, metric = "gower")
cl <- hclust(dist)
plot(cl)

为了从分层聚类中派生聚类,需要将树"切割"到聚类中。这可以通过指定需要砍伐树的高度或指定聚类数来完成。下面我指定集群的数量:

dta$cluster <- cutree(cl, k = 2)

最新更新