在 k 均值和层次聚类中使用 table 的混淆矩阵
Confusion matrix using table in k-means and hierarchical clustering
我在计算混淆矩阵时遇到了一些问题。我通过多元正态分布创建了三组点:
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))
在这两种情况下,如何使用 table 计算完整数据集 (X) 的混淆矩阵?
使用您的数据,在您创建 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个标本分配到组1。原组2分配到组2,原组3分配到组1。组号无关。分类是完美的,每个 row/column 包含单个单元格中的所有值。在这种情况下,只有 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
请注意,每个 row/column 仅包含一个非零单元格。尽管聚类名称不同,但两个聚类分析彼此一致。
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
线性判别分析试图根据 x
和 y
的值预测样本数。因此,簇数不是任意的,正确的预测都落在 table 的对角线上。这就是通常所说的混淆矩阵。
我在计算混淆矩阵时遇到了一些问题。我通过多元正态分布创建了三组点:
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))
在这两种情况下,如何使用 table 计算完整数据集 (X) 的混淆矩阵?
使用您的数据,在您创建 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个标本分配到组1。原组2分配到组2,原组3分配到组1。组号无关。分类是完美的,每个 row/column 包含单个单元格中的所有值。在这种情况下,只有 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
请注意,每个 row/column 仅包含一个非零单元格。尽管聚类名称不同,但两个聚类分析彼此一致。
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
线性判别分析试图根据 x
和 y
的值预测样本数。因此,簇数不是任意的,正确的预测都落在 table 的对角线上。这就是通常所说的混淆矩阵。