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 模式聚类方面的专家。另一种方法实际上是在集群数据上训练一个分类器,并使用它来将新数据分配给各个集群。
啊,好的,谢谢你的信息。我是否理解正确,另一种方法是训练例如使用mydf1
和mydf1
的集群的随机森林模型,然后使用mydf2
和随机森林模型来预测mydf2
的集群?
是的。就是这样。以上是关于k-modes 聚类后为新数据分配聚类的简单方法的主要内容,如果未能解决你的问题,请参考以下文章