首页 > 解决方案 > 在 R 中测量层次聚类(单链接)的准确性

问题描述

如何在具有 2 个集群的 R 中测量层次聚类(单链接)的准确性?这是我的代码:

> dcdata = read.csv("kkk.txt")
> target = dcdata[,3]
> dcdata = dcdata [,1:2]
> d = dist(dcdata)
> hc_single = hclust(d,method="single")
> plot(hc_single)
> clusters =cutree(hc_single, k=2)
> print(clusters)

谢谢!

标签: rhierarchical-clustering

解决方案


准确性不是最准确的术语,但我想您想看看层次聚类是否为您提供了与您的标签一致的集群或组。例如,我使用 iris 数据集,并使用 setosa vs others 作为目标:

data = iris
target = ifelse(data$Species=="setosa","setosa","others")
table(target)
others setosa 
   100     50

data = data[,1:4]
d = dist(data)
hc_single = hclust(d,method="single")
plot(hc_single)

在此处输入图像描述

似乎它们是两个主要的集群。现在我们尝试看看目标是如何分布的:

library(dendextend)
dend <- as.dendrogram(hc_single)
COLS = c("turquoise","orange")
names(COLS) = unique(target)
dend <- color_labels(dend, col = COLS[target[labels(dend)]])
plot(dend) 

在此处输入图像描述

现在就像你所做的一样,我们得到了集群,

clusters =cutree(hc_single, k=2)
table(clusters,target)

            target
    clusters others setosa
           1      0     50
           2    100      0

你得到一个几乎完美的分离。集群 1 中的所有数据点都是 setosa,集群 2 中的所有数据点都不是 setosa。因此,您可以将其视为 100% 准确度,但我会小心使用该术语。

您可以像这样粗略地计算巧合:

Majority_class = tapply(factor(target),clusters,function(i)names(sort(table(i)))[2])

这告诉您每个集群,这是多数类。从那里我们看到这与实际标签有多少一致。

mean(Majority_class[clusters] == target)

推荐阅读