如何通过带状线条聚类识别与背景及其他标签存在显著差异的目标标签?
如何通过带状线条聚类识别与背景及其他标签存在显著差异的目标标签?
问题背景
我手头有一组数据(数据示例在下方),Y轴是分数,X轴是位置,不同标签对应不同颜色。最近几周我一直在尝试找出是否存在某个标签,它和其他标签以及“背景”数据存在显著差异——试过分水岭算法、DBSCAN、LOF等,但始终没找到理想的办法,肯定有更巧妙的思路!
注:这只是众多类似图表中的一个,我们没法默认数据里一定存在异常值,有的图表有,有的没有
先看个直观的图表:
从图里能看到橄榄色的标签有明显偏离(红色圈出的高分点):
- 和背景数据偏离:大部分分数(除了第一个峰值)都在0.1-0.3之间
- 同时它也明显高于其他标签——其他标签的分数最高到~0.6,而它在全局的高值区域里又是个局部异常点
我试过设置各种阈值,比如全局异常值的最低分数、最高分数和次高分数(不同标签)的最小差值,但这些方法都太主观了。
尝试DBSCAN的情况
我本来想用DBSCAN,效果还不错:
但数据里有很明显的“带状”水平聚类,我却找不到合适的方法来对这种模式做聚类。
理想的聚类效果
我期望能聚成类似下图的结果。要说明的是,因为数据点太多,图表只展示了每个标签的前200个点,所以有些X-Y坐标对应的位置可能没有数据,或许不能再把它们叫做“线条”了。对于异常标签,我之后可以通过两个条件判断:
- 最高的“带”和最低的“带”是否不同
- 最高的“带”是否只包含单个标签

数据示例
我把对应图表的数据整理了出来,部分数据如下:
28 1 0.16 17 1 0.14705882352941177 12 1 0.16 54 1 0.16666666666666666 2 1 0.18 8 1 0.11 42 1 0.14705882352941177 16 1 0.14705882352941177 44 1 0.19607843137254902 1 1 0.4 36 1 0.16 55 1 0.12745098039215685 50 1 0.12745098039215685 22 1 0.16666666666666666 46 1 0.1568627450980392 5 1 0.13 ...
其中第一列是标签(对应颜色),第二列是位置(X轴),第三列是分数(Y轴)
真的很想知道有没有什么好办法,这问题我已经琢磨好几周了 😅
备注:内容来源于stack exchange,提问作者CodeNoob




