r - 在 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)
谢谢!
解决方案
准确性不是最准确的术语,但我想您想看看层次聚类是否为您提供了与您的标签一致的集群或组。例如,我使用 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)
推荐阅读
- python - 每次索引重新开始时如何将数据帧拆分为块并水平合并
- python - 检查字典值是否不是 int 或 int(value) 不是有效的正整数的最紧凑/pythonic 方法
- swiftui - 从 ForEach 中引用变量时,SwiftUI“无法推断通用参数‘数据’”
- c# - 如何在 XAML 中创建工作模板?
- node.js - 我将如何确定这个日期?
- c++ - 数组 C++ 问题中的最大和第二大数
- html - CSS 样式规则
- django - 有没有办法让 Django 接受 USE_TZ=True 的天真日期时间,或者抑制警告?
- parallel-processing - 不同的 Jupyter Notebook 会自动并行运行吗?
- python - 如何在 CuPy 中分配倾斜的 2D 内存?