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

Python 如何根据频率对分类变量进行聚类/分组?,python,r,cluster-analysis,Python,R,Cluster Analysis,我有一组观察结果样本,如下所示 var1 var2 var3 var4 1 2 1 1 3 2 1 3 1 2 0 1 3 2 2 3 所有的价值观本质上都是绝对的。我想把第一行和第三行归为一个集群,第二行和第四行归为另一个集群。我认为在这种情况下,一个热编码是无效的,因为分类变量没有任何等级,它们本质上是纯名词性的 (行也不必完全相同)。是否有预先构建的数学算法根据相似性/频率对这些行进行分组?有人能提出

我有一组观察结果样本,如下所示

var1 var2 var3 var4
 1    2    1     1
 3    2    1     3
 1    2    0     1
 3    2    2     3
所有的价值观本质上都是绝对的。我想把第一行和第三行归为一个集群,第二行和第四行归为另一个集群。我认为在这种情况下,一个热编码是无效的,因为分类变量没有任何等级,它们本质上是纯名词性的


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

您可以使用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)
#导入数据

如果我没有错的话,dta也可以使用gower距离在medoids算法周围分区来对分类数据进行聚类。我对这种方法是新手。如果我问错了问题,请原谅?那么,是否可以将相应的集群名称添加到每一行中?你能告诉我怎么做吗?@EdwinVarghese添加了一个例子,但如果你想使用这些方法,你应该仔细阅读。例如,从《统计学习导论》第10章开始:。
library(cluster)
dist <- daisy(dta, metric = "gower")

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