晚上九点,夜市管理员小李用无人机俯瞰整条街区。人流像潮水一般涌动,却并非均匀铺开:烧烤摊前挤成一团,奶茶店门口排成一条长龙,巷子尽头却只有零星几个路人。小李想:能不能让程序自动圈出这些“人气区”?难就难在这些区域形状各异——有圆团、有长条、还有弯月形的,而且今晚可能有三个热闹区,明晚或许只有两个。更麻烦的是,那些独自游荡的路人,不该被硬塞进任何一个圈子里。 这正是 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)的拿手好戏。它像一位“夜市人气侦探”:不看预设的领地形状,只看“哪里人挤人”。只要某个区域的人足够密集,人群自然抱团成簇;密度不够的散兵游勇,就被标记为“路人”(噪声点)。整个过程不需要你事先告诉它“有几片热闹区”,它自己就能从数据里长出来。 这篇文章,我们跟着小李,用“夜市人气”这条故事线,把 DBSCAN 的原理、关键参数、核心概念、算法流程、性能特性、优化策略和工程实战一次讲透。读完你会对“密度聚类”建立直观的直觉——下次在真实项目中遇到“圈人群、找热点、揪异常”,你都知道该从哪里下手。
一句话职业价值:DBSCAN 是机器学习面试高频考点,也是异常检测、地理聚类、客群细分等场景的实用利器。掌握它,等于多了一把“不预设簇数、能识别任意形状簇”的数据瑞士军刀。
目录
可视化演示
展示DBSCAN密度聚类过程:ε邻域搜索、核心点/边界点/噪声点识别、密度可达扩展,对比不同参数与K-Means结果。
本节配有交互动效(进入视口后自动加载,约 3KB)。
DBSCAN聚类过程 核心点:ε邻域内≥MinPts个邻居 边界点:在核心点邻域但自身非核心 噪声点:既非核心也非边界 Nε(p) ≥ MinPts → core point 密度可达传递闭包形成簇
算法思想——“哪里人多,哪里就是热闹区”
小李先试了最流行的 K-Means 算法。K-Means 像一位“勘界员”:先画几个圆圈当“地皮”,然后把每个游人划给离他最近的地皮。问题是,这种算法要求小李提前说出“今晚会有几个热闹区”(簇数 K),而且画出来的地皮永远是圆滚滚的凸块。烧烤摊前围出的长龙形队伍,被硬切成了两块;巷口的月牙形人堆,被一半归了左边、一半划给右边。小李看得直摇头。
密度聚类的思路完全不同。它不画地皮、不预打分界线,只看“哪个区域的人挤得够密”。只要某个局部的人足够密集,就从这里开始“滚雪球”,把邻近的人不断吸进来,最终形成一片形状自由的“人气区”。人群稀疏的区域则自动被晾在一边,当作“没人气”的噪声。
这就是 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)的核心思想——基于密度的空间聚类。它认为“簇”是数据空间中密度相连的点的最大集合:密度高的区域长成簇,密度低的区域自然成为噪声分界。相比 K-Means,DBSCAN 不需要预设簇数,能够识别任意形状的簇,还能同时输出噪声点,这些都是它在工程中被广泛使用的原因。
有了这个“圈子”,小李就能把“哪里热闹”从直觉变成数学:一个人身边三步之内有多少人,这便是后续判断核心点、边界点和噪声点的第一块砖。密度聚类的第一步,永远是先定义好“附近”。
- 数据集 D全部样本点的集合,比如夜市里每个游人的坐标。
- 距离函数 dist度量两个点之间的远近,最常用的是欧氏距离。
- 邻域 Nε(p)所有到 p 的距离不超过 ε 的点组成的集合,这就是“半径 ε 的圈子”。
关键参数——“卖货半径”与“最低人气”
小李接着琢磨:什么叫“身边”?隔一条马路的人也算同一个圈吗?他决定给“圈子”定两个规则。一个是物理范围:以某人脚下为圆心,多大的半径算“附近”。另一个是人数门槛:圈子里至少要有几个人,这个位置才算得上“热闹”而不是“凑巧路过”。就像烧烤摊的“经营半径”和“最低客流量”——半径三米内有五个人围着,这才是真的人气摊位。
在 DBSCAN 里,这两个规则对应两个参数:ε(邻域半径)和 MinPts(最小样本数)。它们共同决定了一个点在多大范围内、聚集多少邻居才算“核心”。这也是 DBSCAN 唯一需要用户指定的两个超参数。
参数的影响很敏感。ε 太小,每个人身边都凑不满人,好好的一个热闹区被切得七零八落,噪声激增;ε 太大,两条街的人被圈成一个巨型大圈,所有簇合并成一团。MinPts 太小,三个路人凑在一起就被当成“网红点”;MinPts 太大,真正的小圈子反而会被当成噪声丢弃。工程中通常先固定 MinPts(经验值 2 × 维度数),再通过“k-距离图”寻找 ε 的拐点。
这两个参数,一个管“圈多大”,一个管“人多不多”,像夜市的经营规则。调好它们,人气侦探才不至于把整条街合并成一个摊位,也不至于把每个路人单拎出来当成噪声。
- 邻域基数集合的元素个数,这里指 p 的 ε-邻域内到底有几名“游客”。
- 阈值比较邻域人数与预设的最小样本数比大小,达到才合格。
- 核心点判定满足此式,则称 p 为核心点(Core Point)。
核心概念——摊主、吃瓜群众和路人
现在小李已经有了一把“人气尺子”。他蹲在奶茶店门口观察:店老板身边当然围着一圈人;稍远一点,有个男孩站在人群外沿,探头探脑地看;再远些,一个外卖小哥骑着车匆匆穿过人群,谁也没搭理。
这三类角色,对应 DBSCAN 的三类点:
- 核心点(Core Point):ε 邻域内至少 MinPts 个点,是簇的“发动机”;
- 边界点(Border Point):自己身边人不够 MinPts,但站在某个核心点的邻域内,是簇的“外圈成员”;
- 噪声点(Noise Point):既不是核心点,也不落在任何核心点的邻域内,是“游离的路人”。
三类点的划分是 DBSCAN 处理噪声的关键:簇由核心点向外扩张,边界点被吸收但不再扩张,噪声点被单独标记为标签 -1。这样生成的簇可以在形状上任意凹凸,边界点就是那些“凑热闹但不上前挤”的人。
小李在屏幕上给这三类点分别标色:紫色是摊主,绿色是吃瓜群众,红色是路人。一个“人气区”的骨架是核心点撑起来的,边界点把形状打磨圆润,噪声点则被干净地排除。认清这三种角色,DBSCAN 的全局图景就清晰了一半。
- Core 集合所有满足核心条件的点组成的集合,是一个簇真正的“骨架”。
- 成员条件邻域人数达到 MinPts 阈值,才有资格进入核心名单。
- 边界与噪声非核心点若落在某个核心点的邻域内,则为边界点;否则为噪声点。
密度关系——一圈朋友链
光有点的分类还不够:热闹区是怎么“连成一片”的呢?小李发现,夜市上的人是通过“朋友的朋友”连在一起的。你身边有三个人,那三个人身边又有各自的朋友,一圈套一圈,整片人气区就串起来了。
DBSCAN 用三个逐渐放宽的“关系词”描述这种串法:
- 密度直达(Directly Density-Reachable):q 在核心点 p 的 ε 邻域内,p 直接“罩着” q;
- 密度可达(Density-Reachable):存在一条由核心点串起的链,从 p 出发一个接一个地传导到 q;
- 密度相连(Density-Connected):存在一个核心点 o,p 和 q 都能沿着各自的核心链到达 o。
一个簇本质上就是“密度相连的点的最大集合”。这种定义不要求簇内任意两点都直接挨着,只要求它们之间有“中间人”引荐,因此簇能长成任意形状。这也解释了为什么月牙形的队伍、环形的广场都能被完整圈出。
小李恍然大悟:夜市里人挤人的传播方式,就像一条条隐形的“人链”。只要链没有断,无论这个圈子扭成什么奇形怪状,DBSCAN 都能一路追过去,把整片人气区完整地圈出来。
- 符号 ⇝密度可达,表示一条由核心点串成的“朋友链”。
- 共同核心点 o存在一个点 o 作为“介绍人”,把 p 和 q 拉到一起。
- 合取条件p 可达 o 且 q 可达 o,二者同属一个密度连通片区。
算法流程——从摊位开始扩散
现在,小李想知道程序具体怎么一步步把“人气区”圈出来。他盯着屏幕,想象自己是一位“人气侦探”:不预设任何边界,从街头的第一个游客开始挨个查看。
DBSCAN 的流程可以概括为四步:
1. 从头遍历所有还没处理过的点 p;
2. 查询 p 的 ε-邻域,数一数里面有几个点;
3. 若邻域点数 ≥ MinPts,p 就是核心点:新建一个簇,把邻域内所有点拉进“待扩散队列”;
4. 从队列中逐个取出点,若它也是核心点,就把它的邻域点也拉进队列;若它是边界点,就吸收进簇但不继续扩散。
重复直到每个点都被访问过。用计算机的话说,这是一个“广度优先搜索”(BFS)式的聚类过程。这个“查询邻域”的动作是整个算法最频繁的操作,直接决定了效率。朴素实现要对每个点遍历全量数据,复杂度 O(n²);引入空间索引后可以大大加速。
小李把这套流程比作“往夜市的每个热闹角落扔石子,看涟漪能传多远”。石子(核心点)投下去,涟漪一圈圈往外推;推不动的边界就是簇的边缘,推不到的地方就是冷清区。
- C(p)从点 p 开始生长出来的簇。
- 集合构造把 D 中所有与 p 密度相连的点收集起来。
- 最大性簇是密度相连的点的最大集合,不能再并入新的密度相连点。
性能特性——夜市聚类的优势与代价
自从用了 DBSCAN,小李发现自己对夜市的“人气地图”看得越来越清楚。但新问题来了:夜市摊位越摆越多,无人机拍到的行人坐标有好几万个,程序跑得越来越慢,而且有些结果和他预期不太一样。
先看优势。DBSCAN 最大的三个优点:
- 不需要预设簇数,自动从密度里“长”出簇;
- 能处理任意形状的簇(月牙形、环形、长条都行);
- 自带噪声识别,异常点不会被硬塞进簇里。
再看代价。首先,时间复杂度:若用暴力双重循环查邻域,复杂度 O(n²);使用 KD 树等空间索引后可降到 O(n log n),但仍比 K-Means(O(nKt))重。其次,参数敏感:ε 和 MinPts 组合不当,结果天差地别。另外,全局单一的 ε 无法应对密度差异很大的数据(例如超市里密集货架和空旷过道并存)。
小李的结论很实用:如果数据量不大、簇形状很怪、还带不少噪声,DBSCAN 是首选;但如果数据有上百万条、形状近似球形,K-Means 或 Mini-Batch K-Means 反而是更轻的快马。
- n数据点的总数(如游客坐标的数量)。
- log n在 KD 树等索引结构中,每次近邻查询的代价。
- 总复杂度n 个点各做一次对数级查询,合计为 O(n log n)。
优化策略——大夜市怎么跑得快、调得准
夜市规模越来越大,小李开始想对策。他发现,与其让每个人挨个问“你附近有谁”,不如在夜市上空画一张网格地图,把每条街分成一个个小格子,找人时只查自己所在的格子及周边格子。
这正是空间索引的思路。DBSCAN 中 90% 以上的时间花在“查邻域”上。用 KD 树(K-Dimensional Tree)把数据点组织成二叉树,查询一个点的 ε 邻域平均只需 O(log n) 时间;用网格索引(Grid Index)则把空间切块,只扫描邻近单元格。两种方法都能把整体复杂度从 O(n²) 降到 O(n log n)。
参数调优也有工具。常用的方法是“k-距离图”:对每个点找到与它第 k 近的邻居,把所有点的 k-距离按升序绘制成曲线,曲线的“肘部”(拐点)就是合适的 ε。此外,还可以用轮廓系数(Silhouette Coefficient)评价聚类质量,在多组参数间做比较。
小李把这些招数用上后,原本跑一分钟的程序缩到三秒,原本需要反复试的参数也有了“按图索骥”的方向。他笑称:这是给夜市装上了“导航地图”和“人气仪表盘”。
- a(i)点 i 到同簇其他点的平均距离,称为簇内不相似度,越小越好。
- b(i)点 i 到最近的其他簇所有点的平均距离,越大越好。
- 综合比值分子衡量“外距比内距大多少”,分母做归一化,结果落在 [-1, 1]。
工程实战——从夜市走向各行各业
小李的“夜市人气侦探”火了,周边城市的管理员纷纷来取经。他发现,这套“圈热闹区、揪路人”的方法,几乎能原样迁移到完全不同的场景。
在地理信息系统中,人们用 DBSCAN 从出租车 GPS 轨迹中发现“热点候车区”;在城市规划中,用 DBSCAN 把餐饮 POI 聚类成“夜宵商圈”;在金融风控中,DBSCAN 把每笔交易视为一个点,正常消费模式聚集形成簇,而欺诈交易因为行为模式古怪而成为“噪声点”;在智能制造中,传感器异常读数往往零散、突兀,恰好符合噪声点的特征。
工程上落地时还有几点提醒:特征要先标准化,否则不同量纲会让 ε 失去意义;数据量太大可用“网格抽样 + DBSCAN”两阶段;噪声点的比例可以作为一个监控指标——如果一夜之间噪声率飙升,往往意味着发生了异常。
从夜市到银行、从 GPS 到质检,DBSCAN 的哲学始终如一:世界是疏密不均的,与其强行画圆,不如尊重密度,让热闹自然成团、让孤独保持孤独。小李终于明白,这把“瑞士军刀”割开的不只是夜市的夜色,更是数据背后隐藏的结构。
---
- 分子标签为 -1 的噪声点数量,即那些“游离于所有热闹区之外的人”。
- 分母总样本数 n,所有参与聚类的点。
- 应用噪声率突增往往提示数据分布异常或参数失衡,值得人工排查。
AI 应用场景
地理POI热点发现
阶段:数据处理与特征提取
解决的问题:传统做法是先用网格统计 POI 数量,再按固定阈值圈热点,网格大小一变结果就变。DBSCAN 把每个 POI 看成一个“游客”,用密度自动圈出任意形状的热点区,无需手工定网格。
具体案例:某出行平台用历史订单的上下车 GPS 坐标跑 DBSCAN,自动发现“深夜热门上车点”。配合噪声率指标,还能在大规模活动(演唱会、跨年夜)时提前感知人流异常集中。
信用卡欺诈检测
阶段:异常检测与判别
解决的问题:欺诈样本极少且模式与正常消费差异大,用有监督模型训练容易样本失衡。DBSCAN 把正常交易聚成一个个“人气区”,行为古怪的交易自然落在簇外成为噪声点。
具体案例:某风控团队按月对交易特征(金额、时间、频次、商户类别)做 DBSCAN 聚类,噪声率一旦超过历史基线两倍,立刻触发人工复核小队介入。噪声交易中确实有相当比例被确认为盗刷或套现。
客户分群与商圈发现
阶段:无监督特征工程
解决的问题:K-Means 做客户分群时硬性划分,边缘客户被强行塞进某个簇。DBSCAN 保留“未归类”的边缘用户,这些用户往往是有价值的“待唤醒”客群。
具体案例:某零售品牌用会员的消费频次、客单价、到店间隔做 DBSCAN,发现两个高价值簇和一群“游离用户”。运营团队针对游离用户做定向优惠券召回,三个月内复购率提升约 12%。
Python 演示
import math class Point: """数据点:x/y 坐标 + 聚类标签(0=未分类,-1=噪声,正整数=簇编号)""" def __init__(self, x, y): self.x = x self.y = y self.label = 0 def euclidean_distance(p1, p2): return math.hypot(p1.x - p2.x, p1.y - p2.y) def region_query(points, p, eps): """返回点 p 在 eps 邻域内的所有点""" return [q for q in points if euclidean_distance(p, q) <= eps] def expand_cluster(points, p, neighbors, cluster_id, eps, min_pts): """从核心点 p 开始,把密度相连的点全部纳入当前簇""" p.label = cluster_id queue = list(neighbors) while queue: q = queue.pop() if q.label == -1: q.label = cluster_id if q.label != 0: continue q.label = cluster_id q_neighbors = region_query(points, q, eps) if len(q_neighbors) >= min_pts: for r in q_neighbors: if r.label == 0 or r.label == -1: queue.append(r) def dbscan(points, eps, min_pts): """DBSCAN 主算法""" cluster_id = 0 for p in points: if p.label != 0: continue neighbors = region_query(points, p, eps) if len(neighbors) < min_pts: p.label = -1 else: cluster_id += 1 expand_cluster(points, p, neighbors, cluster_id, eps, min_pts) return cluster_id def main(): points = [ Point(1, 1), Point(1.1, 1.2), Point(1.2, 0.9), Point(0.9, 1.1), Point(5, 5), Point(5.1, 5.2), Point(5.3, 4.8), Point(4.9, 5.1), Point(10, 10), Point(0, 8), ] n_clusters = dbscan(points, eps=1.0, min_pts=3) for p in points: role = "噪声点" if p.label == -1 else f"簇 {p.label}" print(f"坐标 ({p.x:.1f}, {p.y:.1f}) 属于 {role}") print(f"共发现 {n_clusters} 个簇") if __name__ == "__main__": main()
self.label = 0初始化标签为 0,表示“还没被程序看过”。return [q for q in points if euclidean_distance(p, q) <= eps]一次性查出 p 的 ε 邻域内的所有邻居。if len(neighbors) < min_pts:邻居数量不够,判定 p 为噪声(暂时标记为 -1)。p.label = -1给孤独的“路人”打上噪声标签。queue = list(neighbors)把核心点 p 的邻居全部放入“待扩散队列”。q_neighbors = region_query(points, q, eps)对队列中的点再次查邻域,判断它是否是新的核心点。if r.label == 0 or r.label == -1:把未分类点和噪声点都拉进队列,等它们被吸收进簇。n_clusters = dbscan(points, eps=1.0, min_pts=3)用 eps=1.0、minPts=3 启动聚类。if __name__ == "__main__":保证模块被导入时不会自动执行,只有直接运行才跑 main。
常见误区
误区“我刚用 DBSCAN,习惯性地去设置 K 值(簇数),找了半天没找到这个参数,以为 DBSCAN 也得先告诉它分成几类,不然它怎么知道该聚几团?”
正解DBSCAN 不需要预设簇数。簇的数量由数据本身的密度分布自动涌现:它选择一个核心点后不断通过密度相连扩展,直到没有新点可加,一个簇就自然长好了。用 K-Means 养成的“先定 K”的手势,在 DBSCAN 里要改成“先定 ε 和 MinPts”。就像评估夜市有几片人气区,不应该先规定“今晚必须有三个圈”,而应看人群自己挤成了几团。
为何常见:绝大多数聚类的入门教程都是从 K-Means 开始的,K-Means 最有代表性的操作就是指定 K,初学者容易把“聚类”和“指定簇数”绑定起来。
误区“DBSCAN 一看就没有多少参数,ε 设大点、MinPts 设小点不就行了吗?反正聚类都能跑,顶多效果差一点。”
正解参数非常敏感。ε 太小会把一个完整的簇切成碎片,ε 太大会把不同簇粘在一起;MinPts 太小会把噪声点当成核心点,MinPts 太大会把小簇整体当成噪声。工程上通常用 k-距离图的“肘部”来选 ε,用 2 × 维度数作为 MinPts 的起点,再用轮廓系数做多组参数对比。
为何常见:参数敏感性不容易从原理上直接感知,初学者跑几个玩具数据看不出差别,容易低估两个参数的作用。
误区“DBSCAN 这么强大,任何数据都能用它聚类,总比 K-Means 强。”
正解DBSCAN 的全局 ε 假设数据密度相对均匀。如果数据内部密度差异很大(比如一个超密集簇和一个超稀疏簇并存),统一的 ε 要么让稀疏簇被当成噪声,要么让密集簇内部被碎片化。此时需要考虑 OPTICS 或设置自适应 ε,而不是盲目套用 DBSCAN。
为何常见:从演示案例看,DBSCAN 总能展现优美的任意形状簇,让人误以为它无所不能,忽略了它基于“全局密度阈值”的基础假设。
误区“DBSCAN 标出的噪声点肯定是没用的垃圾数据,直接删掉就好。”
正解噪声点只代表在当前 ε 和 MinPts 下,它们不属于任何密度足够的簇。它们背后可能是真正的异常(欺诈交易)、新出现的群体(新潮流),也可能只是参数选择不当造成的误伤。在金融风控中,噪声点恰恰是重点调查对象;在地理分析中,噪声点可能指示新建的偏僻地标。
为何常见:因为名字里有个“噪声”,人们天然把它等同于垃圾。但在异常检测场景中,噪声标签其实是金矿。
面试题
Q1. 使用 DBSCAN 进行聚类时,需要预先指定簇的数量吗?
- A.必须预先指定簇数量
- B.不需要按密度自动生成← 正确答案
- C.需要但可以做后调整
- D.只有高维数据才需要
答案:B。DBSCAN 通过 ε 和 MinPts 自动发现簇,不需要预设 K 值,这正是它相比 K-Means 的核心优势之一。选项 A、C、D 都是对 K-Means 习惯的误解。
Q2. 以下哪类点不是 DBSCAN 中的点类型?
- A.簇中的核心点成员
- B.位于簇边缘的边界点
- C.由均值确定的聚类中心← 正确答案
- D.不属于任何簇的噪声点
答案:C。DBSCAN 只区分为核心点、边界点和噪声点三类,没有“聚类中心”的概念。聚类中心是 K-Means 的产物,DBSCAN 的簇没有中心点。
Q3. 关于 ε 和 MinPts 两个参数,下列说法正确的有哪些?
- A.ε 过大容易合并不同簇← 正确答案
- B.ε 过小碎片簇数量增加← 正确答案
- C.MinPts 过小噪声冒充核心← 正确答案
- D.MinPts 大小完全不影响结果
答案:ABC。ε 是邻域半径,过大会把不同簇“粘”在一起,过小则把簇切碎;MinPts 是核心点的人数门槛,过小会让噪声点轻易成为核心点。参数对聚类结果有重大影响,D 明显错误。
Q4. 在 DBSCAN 中,标签 -1 通常表示什么?
- A.核心点角色标识
- B.边界点角色标识
- C.噪声点的专属标签← 正确答案
- D.未参与聚类的点
答案:C。DBSCAN 约定用 -1 标记噪声点。核心点与边界点会被赋予正整数的簇编号,未分类点在算法运行中标记为 0,但最终输出不会保留。
Q5. 若点 p 的 ε-邻域内有 7 个点(含 p 自身),且 MinPts = 6,则 p 一定是?
- A.因为够密所以必然核心点← 正确答案
- B.邻域不足被判为噪声点
- C.判定为边界点的概率大
- D.无法确定其角色种类
答案:A。核心点判定只看邻域点数是否 ≥ MinPts。7 ≥ 6 满足条件,所以 p 一定是核心点。B、C、D 都与核心点的定义冲突。
Q6. 关于密度可达与密度相连,下列说法正确的有哪些?
- A.可达必然也是相连的← 正确答案
- B.相连必然也是可达的
- C.直达必须双方互为邻居
- D.可达路径中间点均须核心← 正确答案
答案:AD。若 p 密度可达 q,则取共同核心点 o=p(零步链)即可证明 p 与 q 密度相连,故 A 对。密度相连只要求存在共同核心点,不要求 p 到 q 有可达链,B 错。密度直达是单向关系,只要 q 在核心点 p 的邻域内,C 错。密度可达的链上每个中间点必须是核心点才能继续传导,D 对。
Q7. DBSCAN 在什么情况下时间复杂度可以达到 O(n log n)?
- A.使用 KD 树空间索引加速← 正确答案
- B.使用暴力双重循环遍历
- C.数据量低于一百个点时
- D.必须借助分布式计算框架
答案:A。DBSCAN 的瓶颈在邻域查询。使用 KD 树、R 树等空间索引后,单次查询降到 O(log n),整体复杂度 O(n log n)。暴力双重循环是 O(n²),与数据量大小无关,分布式框架不是必须条件。
Q8. 对于密度差异很大的数据集,DBSCAN 会遇到什么问题?
- A.单个参数难适应疏密差异← 正确答案
- B.时间复杂度必然急剧上升
- C.无论如何都能正确聚类
- D.完全不需要调整任何参数
答案:A。DBSCAN 使用全局统一的 ε,若数据中同时存在极密与极疏的簇,一个 ε 无法同时照顾两者:调小会丢疏簇,调大并密簇。这种场景应改用 OPTICS 或局部自适应 ε。
Q9. 轮廓系数 s(i) 的取值范围是?
- A.-1 到 1 之间的闭区间← 正确答案
- B.0 到 1 之间的开区间
- C.0 到正无穷的大范围
- D.负无穷到正无穷的范围
答案:A。轮廓系数公式为 (b - a) / max(a, b)。当 b 远大于 a 时接近 1(聚类好),当 a 远大于 b 时接近 -1(聚类差),因为分母 max 保证了范围被限制在 [-1, 1]。
Q10. 下列哪些应用场景适合使用 DBSCAN?
- A.地理 POI 热点聚集区发现← 正确答案
- B.信用卡交易异常点识别← 正确答案
- C.大量噪声背景下的客户分群← 正确答案
- D.强制每个样本都归入某个簇
答案:ABC。DBSCAN 天然适合地理聚类、异常检测和含噪声的分群任务,因为它能发现任意形状簇并输出噪声点。但若业务要求“每个样本必须归属到某个簇”,DBSCAN 的噪声机制会带来额外处理成本,此时更应选择 K-Means 或层次聚类。