上周帮市场部门分析用户画像时,发现一个有趣现象:在没有任何预设标签的情况下,算法自动将35-40岁、常购买婴幼儿用品的男性用户归为一类。进一步调查发现,这正是我们常说的"奶爸群体"——这个在原始数据中并不存在的分类,却通过购买行为自然显现。这就是典型的"隐形圈子",数据中客观存在但尚未被明确标记的群体特征。
聚类分析作为无监督学习的核心方法,正是发现这类隐藏模式的利器。与需要标注数据的分类任务不同,聚类通过计算数据点之间的相似度,自动将相似对象归入同一簇(cluster)。这就像在聚会上,不需要主持人介绍,人们会自然根据兴趣、职业等特征形成小圈子。
聚类的本质是"物以类聚",关键在于如何定义"相似"。常用的距离度量包括:
python复制def euclidean_distance(a, b):
return np.sqrt(np.sum((a - b)**2))
实战经验:电商用户聚类中,购买频次用欧氏距离,浏览路径用余弦相似度,而是否点击广告则用杰卡德距离。混合特征需要先标准化。
| 算法类型 | 代表算法 | 最佳场景 | 时间复杂度 | 需预设K值 |
|---|---|---|---|---|
| 基于划分 | K-Means | 凸形分布数据 | O(n) | 是 |
| 基于密度 | DBSCAN | 非均匀分布/异常检测 | O(n log n) | 否 |
| 基于层次 | Agglomerative | 小规模数据/需要树状图 | O(n³) | 否 |
| 基于概率 | GMM | 重叠聚类/软分类 | O(nk²) | 是 |
最近帮金融客户做反欺诈时,DBSCAN发现了传统规则引擎漏掉的异常交易簇——这些交易在地理位置、金额、时间间隔上呈现特殊的密度分布。
特征工程:
降维可视化:
python复制from umap import UMAP
reducer = UMAP(n_components=2, random_state=42)
embedding = reducer.fit_transform(features)
python复制from sklearn.cluster import KMeans
from yellowbrick.cluster import KElbowVisualizer
model = KMeans()
visualizer = KElbowVisualizer(model, k=(2,12))
visualizer.fit(data) # 自动找出最佳K值
visualizer.show()
踩坑记录:肘部法则有时会出现"平缓肘",这时需要结合轮廓系数和业务理解。曾有个项目自动选择的K=5,但业务方坚持用K=4,后来证明确实更合理。
高维数据中所有点都趋于等距离,导致聚类失效。解决方案:
通过以下方法评估结果可靠性:
去年做用户分群时,发现相同参数下每次运行结果差异达15%,最终发现是某些特征方差过大导致。
当有少量标注数据时,可用约束传播:
python复制from sklearn.semi_supervised import LabelPropagation
lp_model = LabelPropagation(kernel='knn', n_neighbors=10)
lp_model.fit(partial_labeled_data)
使用DTW距离度量时间序列相似度:
python复制from tslearn.clustering import TimeSeriesKMeans
model = TimeSeriesKMeans(n_clusters=3, metric="dtw")
model.fit(timeseries_data)
在运维监控中,这种方法成功识别出5类不同的服务器故障模式,比静态聚类准确率提升40%。
聚类结果最终要转化为业务语言,建议框架:
最近一个案例:某教育平台通过聚类发现"沉默高潜力用户"群体——很少互动但完课率高,针对性地推送进阶课程后,转化率提升22%。