R 中分层聚类(单个 link)的测量精度

Measure Accuracy in Hierarchical Clustering (Single link) in R

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

> 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)

谢谢!

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

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])

这告诉你每个集群,这是大多数 class。从那里我们可以看出这与实际标签的吻合程度。

mean(Majority_class[clusters] == target)