上一篇我们聊了K-Means的硬伤:月牙形数据会被拦腰切断,K值得提前猜,一个异常点就能把质心拽偏。这次换个思路——DBSCAN用密度找集群,不用算距离质心多远,K值自己 discovery,异常点直接标-1扔出去。

核心问题换了一个。K-Means问:离哪个质心最近?DBSCAN问:半径epsilon内有多少邻居?够min_samples个,就是核心点,集群的"心脏"。不够但挨着核心点,算边界点。哪儿都不挨的,标成噪声-1。两个集群之间没有核心点链条连着,就是独立的。

打开网易新闻 查看精彩图片

代码跑一遍月牙数据(300个点,噪声0.08):eps设0.2,min_samples设5,结果出来250个核心点、45个边界点、5个噪声点,分出2个集群。可视化很直观——核心点实心、边界点变淡、噪声打叉,月牙的两条弧线被完整识别,没被切开。

打开网易新闻 查看精彩图片

参数怎么调?eps和min_samples是命门。eps太小,集群碎成渣;太大,全糊成一团。min_samples太高,核心点太少;太低,噪声混进去。没有万能公式,得看数据密度分布。

什么时候用DBSCAN,什么时候还回K-Means?数据形状不规则、噪声多、不知道分几类——DBSCAN上。数据球状分布、要快速算大样本、需要明确质心——K-Means更稳。密度不均的数据是DBSCAN的软肋,稀疏区域和密集区域用同一套参数,总有一边要崩。

打开网易新闻 查看精彩图片

异常检测是DBSCAN的隐藏技能。标-1的点不一定是错误,可能是欺诈交易、设备故障、网络入侵。不用单独训练异常检测模型,聚类顺便就把活儿干了。