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

时间:2017-07-05 07:15:44

标签: python r cluster-analysis

我有一组样本观察如下

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

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

(行不必完全相同)。是否有预先建立的数学算法来根据相似度/频率对这些行进行分组?任何人都可以建议一个好方法吗?或者我应该使用单热编码?

1 个答案:

答案 0 :(得分:1)

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

以下示例:

# 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)