我使用 DBSCAN 的 ELKI 实现从火灾数据集中识别火灾热点集群,结果看起来相当不错。数据集是空间的,聚类基于纬度、经度。基本上,DBSCAN 参数识别火点高度集中的热点区域(由密度定义)。这些是火灾热点区域。
我的问题是,在尝试了几个不同的参数并找到一对给出合理聚类结果的参数之后,如何验证聚类?
是否有适合我的用例的正式验证方法?还是这取决于应用程序领域是主观的?
ELKI包含许多用于聚类的评估函数。
使用
-evaluator
参数启用它们,来自 evaluation.clustering.internal
包。
其中一些将不会自动运行,因为它们的运行时间成本是二次方的——可能比你的聚类算法还要高。
我确实不相信这些措施。它们是为特定的聚类算法而设计的;并且对于确定 k-means 的 k 参数最有用;仅此而已。如果你盲目地采取这些措施,大多数时候你都会得到无用的结果。此外,这些措施对于我们尝试过的任何策略都不起作用。
最便宜的是基于标签的评估器。这些将自动运行,但显然您的数据没有标签(或者它们是数字,在这种情况下您需要相应地设置
-parser.labelindex
参数)。就我个人而言,我更喜欢使用调整兰德指数来比较两个聚类的相似度。所有这些索引都对噪声敏感,因此它们不能很好地与 DBSCAN 配合使用,除非您的参考具有与 DBSCAN 相同的噪声概念。
您想要解决问题,而不是数字。这就是“数据科学”的全部要点,以问题为导向并“解决问题”,而不是沉迷于最小化某些随机质量数。如果结果在现实中不起作用,那么你就失败了。
外部指数:
如果您有一些标记数据,外部索引非常有用,并且可以展示集群相对于标记数据的表现如何。兰德指数就是一个示例指数。https://en.wikipedia.org/wiki/Rand_index
内部指数:如果没有标记数据,则可以使用内部索引为聚类结果评分。一般来说,索引计算簇内的点以及与其他簇的距离,并尝试根据紧凑性给您一个分数(簇中点彼此的距离有多近?) 可分离性(簇之间的距离是多少?)。 对于 DBSCAN,有一个很棒的内部验证指数,由 Moulavi 等人称为
DBCV。论文可在此处获取:https://epubs.siam.org/doi/pdf/10.1137/1.9781611973440.96 Python包:https://github.com/christopherjenness/DBCV