【问题标题】:How to perform clustering/grouping on categorical variables based on frequencies?如何根据频率对分类变量进行聚类/分组?
【发布时间】:2017-07-05 16:05:49
【问题描述】:

我有一组观察样本如下

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 编码在这种情况下无效,因为分类变量不具有任何等级,它们本质上是纯名义的。

(行也不必完全相同)。是否有预先构建的数学算法根据相似性/频率对这些行进行分组?任何人都可以提出一个好的方法吗?还是我应该使用 one-hot 编码?

【问题讨论】:

  • 如果我没记错的话,也可以使用围绕 medoids 算法的分区中的 gower 距离对分类数据进行聚类。

标签: python r cluster-analysis


【解决方案1】:

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

下面是一个例子:

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

【讨论】:

  • 我是这种方法的新手。如果我问错了问题,请原谅我?那么,是否可以将各自的集群名称添加到每一行?你能告诉我怎么做吗?
  • @EdwinVarghese 添加了一个示例,但如果您想使用这些方法,您应该阅读它们。例如从第 10 章统计学习简介开始:www-bcf.usc.edu/~gareth/ISL/ISLR%20Seventh%20Printing.pdf
猜你喜欢
  • 2013-02-10
  • 2017-08-14
  • 2013-12-05
  • 2020-11-17
  • 2014-03-23
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多