这是@KarthikeyanMV 答案的扩展。+1。是的,您需要能够确定 Delta 的值。这是一个可以做到这一点的过程。我正在用 R 编写代码,但我认为这个过程会很清楚。
大概,组间的差距比任何组内的差距都大,所以只要看连续点之间的差异,问大的差距在哪里。既然你认为应该有5个组,那么应该有4个大的差距,所以看第4个最大的区别。
## Your data
dat = c(199, 200, 205, 209, 217, 224, 239, 498, 573, 583,
583, 590, 591, 594, 703, 710, 711, 717, 719, 721,
836, 840, 845, 849, 855, 855, 856, 857, 858, 858,
928, 935, 936, 936, 942, 943, 964, 977)
(Delta = sort(diff(dat), decreasing=TRUE)[4])
[1] 75
看起来Delta 应该是75,但我们没有考虑异常值。从上下一个点来看,是否有任何点超过 Delta ?是的。
BigGaps = diff(dat) >= Delta
(Outliers = which(c(BigGaps, T) & c(T, BigGaps)))
[1] 8
第 8 点距离太远,不属于上面或下面的组。因此,让我们将其删除并重试。
dat = dat[-Outliers]
(Delta = sort(diff(dat), decreasing=TRUE)[4])
[1] 70
BigGaps = diff(dat) >= Delta
(Outliers = which(c(BigGaps, T) & c(T, BigGaps)))
integer(0)
删除第 8 点后,新的 Delta 为 70。我们使用新的 Delta (70) 检查异常值,但没有找到。所以让我们使用 Delta = 70 进行聚类。
Cluster = cumsum(c(1, diff(dat)>=Delta))
plot(dat, pch=20, col=Cluster+1)
![聚类数据](https://i.stack.imgur.com/ICyGE.png)
这主要找到了您想要的集群,除了它包括最高集群中的最后两个点,而不是将它们声明为异常值。我不明白为什么他们应该是异常值而不是该组的一部分。也许您可以详细说明为什么您认为不应将它们包括在内。
我希望这个对你有用。