在 k-means 和层次聚类中使用表的混淆矩阵

Posted

技术标签:

【中文标题】在 k-means 和层次聚类中使用表的混淆矩阵【英文标题】:Confusion matrix using table in k-means and hierarchical clustering 【发布时间】:2021-11-27 00:38:56 【问题描述】:

我在计算混淆矩阵时遇到了一些问题。我通过多元正态分布创建了三组点:

library('MASS')
library('ggplot2')
library('reshape2')
library("ClusterR")
library("cluster")
library("dplyr")
library ("factoextra")
library("dendextend")
library("circlize")

mu1<-c(1,1)
mu2<-c(1,-9)
mu3<-c(-7,-2)

sigma1<-matrix(c(1,1,1,2), nrow=2, ncol=2, byrow = TRUE)
sigma2<-matrix(c(1,-1,-1,2), nrow=2, ncol=2, byrow = TRUE)
sigma3<-matrix(c(2,0.5,0.5,0.3), nrow=2, ncol=2, byrow = TRUE)

simulation1<-mvrnorm(100,mu1,sigma1)
simulation2<-mvrnorm(100,mu2,sigma2)
simulation3<-mvrnorm(100,mu3,sigma3)

X<-rbind(simulation1,simulation2,simulation3)
colnames(X)<-c("x","y")
X<-data.frame(X)

我还使用 k 均值聚类和具有 k 个初始中心 (k=3) 的层次聚类构建了聚类:

//k-means clustering
    k<-3
    B<-kmeans(X, centers = k, nstart = 10)
    x_cluster = data.frame(X, group=factor(B$cluster))
    ggplot(x_cluster, aes(x, y, color = group)) + geom_point()

//hierarchical clustering
    single<-hclust(dist(X), method = "single")
    clusters2<-cutree(single, k = 3)
    fviz_cluster(list (data = X, cluster=clusters2))

如何在这两种情况下使用表格计算完整数据集(X)的混淆矩阵?

【问题讨论】:

您只需将table() 与原始组ID 和集群ID 一起使用。您的样本数据集不包含标识每行来自哪个组的变量,例如Grp &lt;- rep(1:3, each=100)。然后将其与分析中的集群标识一起使用。这不是一个真正的混淆矩阵,您实际上在分析中使用组标识作为因变量,例如判别分析。这里的分配可能是完美的,但您原来的第 1 组可以是聚类分析中的第 2 组或第 3 组。 @dcarlson 你能举个例子吗? 请修剪您的代码,以便更容易找到您的问题。请按照以下指南创建minimal reproducible example。 @dcarlson 非常感谢您的帮助!!! 【参考方案1】:

使用您的数据,在您创建 sigma1 之前插入 set.seed(42),以便我们有一个可重现的示例。然后在你创建X之后:

X.df <- data.frame(Grp=rep(1:3, each=100), x=X[, 1], y=X[, 2])
k <- 3
B <- kmeans(X, centers = k, nstart = 10)
table(X.df$Grp, B$cluster)
# 
#       1   2   3
#   1   1   0  99
#   2   0 100   0
#   3 100   0   0

原始组 1 被标识为组 3,其中一个样本分配到组 1。原始组 2 分配到组 2,原始组 3 分配到组 1。组编号无关。分类是完美的,每行/列包含单个单元格中的所有值。在这种情况下,只有 1 个样本被放错了位置。

single <- hclust(dist(X), method = "single")
clusters2 <- cutree(single, k = 3)
table(X.df$Grp, clusters2)
#    clusters2
#       1   2   3
#   1  99   1   0
#   2   0   0 100
#   3   0 100   0

结果相同,但簇数不同。原始组 1 中的一个样本被分配到与组 3 样本相同的组。要比较这些结果:

table(Kmeans=B$cluster, Hierarch=clusters2)
#       Hierarch
# Kmeans   1   2   3
#      1   0 101   0
#      2   0   0 100
#      3  99   0   0

请注意,每一行/列仅包含一个非零单元格。尽管聚类名称不同,这两个聚类分析彼此一致。

D <- lda(Grp~x + y, X.df)
table(X.df$Grp, predict(D)$class)
#    
#       1   2   3
#   1  99   0   1
#   2   0 100   0
#   3   0   0 100

线性判别分析尝试在给定xy 的值的情况下预测样本数量。因此,簇数不是任意的,正确的预测都落在表的对角线上。这就是通常所说的混淆矩阵。

【讨论】:

以上是关于在 k-means 和层次聚类中使用表的混淆矩阵的主要内容,如果未能解决你的问题,请参考以下文章

层次聚类中使用不同链接的不同距离矩阵

如何绘制 K-mean 算法的混淆/相似矩阵

一文读懂层次聚类(Python代码)

使用scipy进行层次聚类和k-means聚类

在大数据量时,K-means算法和层次聚类算法谁更有优势

在 K-means 聚类中组织聚类