k-modes 聚类后为新数据分配聚类的简单方法

Posted

技术标签:

【中文标题】k-modes 聚类后为新数据分配聚类的简单方法【英文标题】:Simple approach to assigning clusters for new data after k-modes clustering 【发布时间】:2021-01-14 18:19:48 【问题描述】:

我正在使用由数据框 mydf1 创建的 k-modes 模型 (mymodel)。我希望为新数据框mydf2 的每一行分配最近的mymodel 集群。 Similar to this question - just with k-modes instead of k-means。 flexclust 包的 predict 函数仅适用于数字数据,不适用于分类数据。

一个简短的例子:

require(klaR)
set.seed(100)
mydf1 <- data.frame(var1 = as.character(sample(1:20, 50, replace = T)),
                    var2 = as.character(sample(1:20, 50, replace = T)),
                    var3 = as.character(sample(1:20, 50, replace = T)))
mydf2 <- data.frame(var1 = as.character(sample(1:20, 50, replace = T)),
                    var2 = as.character(sample(1:20, 50, replace = T)),
                    var3 = as.character(sample(1:20, 50, replace = T)))
mymodel <- klaR::kmodes(mydf1, modes = 5)
# Get mode centers
mycenters <- mymodel$modes
# Now I would want to predict which of the 5 clusters each row 
# of mydf2 would be closest to, e.g.:
# cluster2 <- predict(mycenters, mydf2)

是否已经有一个函数可以使用 k-modes 模型进行预测,或者最简单的方法是什么?谢谢!

【问题讨论】:

【参考方案1】:

我们可以使用 kmodes 算法中使用的距离度量将每个新行分配给其最近的集群。

## From klaR::kmodes

distance <- function(mode, obj, weights) 
  if (is.null(weights)) 
    return(sum(mode != obj))
  obj <- as.character(obj)
  mode <- as.character(mode)
  different <- which(mode != obj)
  n_mode <- n_obj <- numeric(length(different))
  for (i in seq(along = different)) 
    weight <- weights[[different[i]]]
    names <- names(weight)
    n_mode[i] <- weight[which(names == mode[different[i]])]
    n_obj[i] <- weight[which(names == obj[different[i]])]
  
  dist <- sum((n_mode + n_obj)/(n_mode * n_obj))
  return(dist)


AssignCluster <- function(df,kmeansObj)

  apply(
    apply(df,1,function(obj)
  
    apply(kmeansObj$modes,1,distance,obj,NULL)
  ),
  2, which.min)


AssignCluster(mydf2,mymodel)

[1] 4 3 4 1 1 1 2 2 1 1 5 1 1 3 2 2 1 3 3 1 1 1 1 1 3 1 1 1 3 1 1 1 1 2 1 5 1 3 5 1 1 4 1 1 2 1 1 1 1 1

请注意,这可能会产生大量与多个集群同样远的条目,然后which.min 将选择编号最小的集群。

【讨论】:

谢谢!当我在我的实际数据名(大约 6000 行)上使用 AssignCluster 函数时,它会为每一行返回集群 1。这意味着集群1 总是在最小化距离,也许其他一些集群也是如此,但由于1 是第一个集群,它总是返回1?我对此感到有点惊讶,因为集群安静不同,所以我想知道集群1 是如何始终最小化距离的。 我无法真正看到您的数据,但对于您示例中的合成数据,所有集群的所有距离都非常接近。所以实际上可能是这样,它们都是一样的。不幸的是,我不是 k 模式聚类方面的专家。另一种方法实际上是在集群数据上训练一个分类器,并使用它来将新数据分配给各个集群。 啊,好的,谢谢你的信息。我是否理解正确,另一种方法是训练例如使用mydf1mydf1 的集群的随机森林模型,然后使用mydf2 和随机森林模型来预测mydf2 的集群? 是的。就是这样。

以上是关于k-modes 聚类后为新数据分配聚类的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

聚类算法和分类算法总结

独家一文读懂聚类算法

技术工具一文读懂聚类算法

一文读懂聚类算法

转发技术贴:一文读懂聚类算法

转载聚类算法小结