机器学习聚类算法

什么是聚类算法

聚类算法是一种无监督学习方法。它的核心任务是在没有先验知识的情况下,把一堆没有标签的数据,按照“物以类聚,人以群分”的原则,分成不同的组(也就是“簇”)。

目标很简单:让同一簇内的样本相似度尽量高,不同簇间的样本差异尽量大

一句话理解:分类是“我有标准答案,教你怎么分”;聚类是“我没标准答案,你自己看着把像的凑一块”。

聚类准则决定结果

聚类没有唯一标准答案,怎么定义“相似度”(最常用欧式距离)决定了最终的分组结果

比如面对同一批动物(蓝鲸、羊、青蛙等):

  • 繁衍方式:胎生 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):计算聚类中心并直接返回每个样本的类别标签。(相当于把 fitpredict 合并成一步)
  • labels_:查看训练集每个样本最终被分配的簇标签。
  • cluster_centers_:查看每个簇的中心点坐标。

代码实战与可视化

# 导包
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]

图片