什么是聚类算法
聚类算法是一种无监督学习方法。它的核心任务是在没有先验知识的情况下,把一堆没有标签的数据,按照“物以类聚,人以群分”的原则,分成不同的组(也就是“簇”)。
目标很简单:让同一簇内的样本相似度尽量高,不同簇间的样本差异尽量大。
一句话理解:分类是“我有标准答案,教你怎么分”;聚类是“我没标准答案,你自己看着把像的凑一块”。
聚类准则决定结果
聚类没有唯一标准答案,怎么定义“相似度”(最常用欧式距离)决定了最终的分组结果。
比如面对同一批动物(蓝鲸、羊、青蛙等):
- 按繁衍方式:胎生 vs 卵生
- 按呼吸方式:肺呼吸 vs 鳃呼吸
- 按生活环境:陆地 vs 水中 vs 两栖
现实应用场景
核心用于数据分群或找异常点:
- 用户与推荐:用户画像、广告/商业/搜索流量推荐。
- 内容分类:新闻聚类、筛选排序、数据分割(Segmentation)。
- 异常检测:寻找“离群点”,如信用卡异常消费、恶意流量识别。
- 图像与生物:图像分割降维、寻找同功能基因片段。
聚类算法分类
算法分类主要看两个维度:分多细(粒度) 和 怎么分(实现方法)。
按聚类粒度分类
- 细聚类:分得很细,圈子多,每个圈子里的小样本极度相似。
- 粗聚类:分得很粗,圈子少,大面上差不多就能混进一个大圈。
按实现方法分类(最常见)
- 基于划分的聚类:最经典的是 K-Means 算法。核心思想是找“质心”(通过计算均值找到一个簇的中心位置),然后按质心来划分。
- 基于密度的聚类:比如 DBSCAN 算法。哪里数据密集就聚成一类,适合处理不规则形状的数据。
- 基于层次的聚类:像剥洋葱或滚雪球一样,可以自顶向下拆分(DIANA),也可以自底向上合并(AGNES)。
- 基于图的聚类:比如谱聚类(Spectral Clustering)。
KMeans API 应用
在实际开发中,我们最常用的是 scikit-learn 提供的 KMeans。
基础用法与核心参数
sklearn.cluster.KMeans(n_clusters=8):K-Means 聚类模型。n_clusters:核心参数,表示聚类中心的数量(即产生的质心数),也就是你想把数据分成几个组/簇。不传的话默认是8。
fit(X):用训练数据拟合模型,计算出各个簇的中心点。(注意:聚类是无监督学习,不需要传标签y)predict(X):预测新数据属于哪个簇。fit_predict(X):计算聚类中心并直接返回每个样本的类别标签。(相当于把fit和predict合并成一步)labels_:查看训练集每个样本最终被分配的簇标签。cluster_centers_:查看每个簇的中心点坐标。
代码实战与可视化
K-Means 聚类示例
# 导包
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
import matplotlib
matplotlib.use('TkAgg')
# TODO 准备数据
# 1.准备数据(特征2列和标签1列)
x, y = make_blobs(
n_samples=1000,
n_features=2,
centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
cluster_std=[0.4, 0.2, 0.2, 0.3]
)
print(x.shape) # (1000, 2)
print(y.shape) # (1000,)
# 2.提前绘制散点图看看数据分布
# plt.scatter(x[:, 0], x[:, 1])
# plt.show()
# TODO 使用KMeans模型
# 3.创建kmeans模型
model = KMeans(n_clusters=4)
y_pred = model.fit_predict(x)
print(y_pred)
# 4.按照预测值通过颜色划分类别: 绘制散点图看看数据分布
plt.scatter(x[:, 0], x[:, 1], c=y_pred)
plt.show()效果图:

打印:
(1000, 2)
(1000,)
[3 0 0 1 2 1 1 3 1 3 1 2 3 0 2 2 0 0 2 0 0 1 1 1 1 3 2 2 2 3 0 0 0 0 1 2 1
1 0 1 2 3 0 2 1 2 1 2 1 2 2 1 0 1 2 1 1 2 2 1 1 1 1 2 1 0 3 3 2 1 2 0 2 2
2 1 2 0 3 1 0 1 1 3 2 3 3 0 3 1 3 1 0 2 1 1 1 3 0 3 1 0 3 3 1 3 2 3 3 2 3
...
2 0 1 2 1 3 1 0 2 1 0 1 3 3 1 1 2 2 0 2 1 0 1 3 0 0 1 0 3 3 1 3 1 3 1 3 2
3 2 0 2 3 1 3 0 3 0 3 0 1 3 0 0 3 0 3 0 0 1 0 0 2 1 2 3 0 1 0 1 0 3 3 1 2
3]
创建的数据 - 指定中心和标准差示意图
#数据中心
centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
#标准差
cluster_std=[0.4, 0.2, 0.2, 0.3]
