文章目录
问题描述

红框这一行其实是在说 DBSCAN 聚类算法的参数调得不合适,导致聚类失败或者聚类效果很差。
先拆开看:
| 问题 | 根因 | 修复 |
|---|---|---|
| 聚类找不到簇 | DBSCAN_EPS=0.25 对 text embedding 太严 |
改成 0.40 |
什么是聚类?
假设你抓取了很多帖子:
text
帖子1:ChatGPT 发布新模型
帖子2:OpenAI 发布 GPT-6
帖子3:今天午饭很好吃
帖子4:AI 模型能力提升
帖子5:这家餐厅不错
Embedding 后会变成向量:
text
帖子1 -> [0.12, 0.45, ...]
帖子2 -> [0.13, 0.43, ...]
帖子3 -> [0.87, 0.22, ...]
...
聚类算法会自动把:
text
AI相关
├── 帖子1
├── 帖子2
└── 帖子4
美食相关
├── 帖子3
└── 帖子5
归为不同簇(Cluster)。
什么是 DBSCAN?
DBSCAN 是一种经典聚类算法。
核心思想:
两个点距离足够近,就认为它们属于同一个群体。
其中最重要参数就是:
python
eps
即:
text
Epsilon
表示:
text
最大允许距离
为什么 0.25 会有问题?
假设 embedding 的相似度情况:
text
帖子A 与 帖子B 距离
0.28
但你设置:
python
eps = 0.25
那么:
text
0.28 > 0.25
DBSCAN认为:
text
不够近
于是:
text
A
B
C
D
全部被当成孤立点。
结果:
text
找不到任何簇
或者:
text
90% 数据都是噪声
为什么 Text Embedding 特别容易这样?
很多人第一次做向量聚类都会踩这个坑。
例如:
图像 embedding
同一只猫:
text
距离
0.05
0.08
0.12
很容易聚起来。
文本 embedding
即使表达同一个意思:
text
ChatGPT发布新模型
OpenAI推出GPT-6
距离可能都有:
text
0.30
0.35
0.40
甚至更高。
因为文本语义空间本来就更稀疏。
所以:
python
eps = 0.25
往往太小。
改成 0.40 为什么有效?
原来:
python
eps = 0.25
允许范围:
text
●----0.25----●
改成:
python
eps = 0.40
允许范围:
text
●---------0.40---------●
更多点会被视为邻居:
text
A ←→ B ←→ C
于是形成:
text
Cluster 1
而不是:
text
Noise
Noise
Noise
实际开发中怎么选?
通常不会拍脑袋。
会先统计 embedding 的距离分布:
python
0.12
0.18
0.21
0.27
0.31
0.35
0.39
0.42
0.51
...
然后观察:
text
0.35~0.45
附近是否出现明显拐点。
很多文本聚类项目里:
python
eps = 0.3 ~ 0.5
比较常见。
具体还取决于:
- 使用什么 embedding 模型
- 是否做了归一化
- 使用欧氏距离还是余弦距离
- 数据集规模
所以这条记录的意思大概率是:
项目使用 DBSCAN 对文本向量进行聚类时,原来的
DBSCAN_EPS=0.25设置过小,导致大量文本被当成噪声点,聚类结果为空或找不到簇。后来把阈值提高到0.40后,文本之间能够建立邻居关系,聚类恢复正常。