在前几篇文章中,我们学习了机器学习的基础知识、分类体系以及监督学习的原理与经典算法。监督学习在实际中非常常见,但它有一个关键前提:需要大量带标签的数据。 然而在现实中,标注往往昂贵甚至不可行: 电商平台积累了大量用户行为数据,却没有人逐一标注“用户群体”; 医学影像数据庞大,但人工标注需要专家参与,耗费极高; 工业传感器产生连续监测数据,但只有少量“故障”样本。 在这些场景中,无监督学习(Unsupervised Learning) 就显得尤为重要。它不依赖标签,而是通过分析数据特征和分布,自动发现潜在规律。本文将重点介绍无监督学习的代表方法——聚类(Clustering)。
无监督学习是指:在数据没有标签的情况下,算法通过分析样本特征,发现数据内部结构和模式。
如果说监督学习是“老师给出题目和答案,学生学会解题”,那么无监督学习就是“学生自己在题目中寻找规律”。
聚类是无监督学习最典型的任务,目标是:
将数据划分成若干组(簇),使同一簇的样本尽可能相似,不同簇的样本尽可能不同。

K-Means 通过迭代优化,将样本分配到最近的簇中心:

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=42)
# 训练 K-Means
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)
# 可视化
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=30, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, marker='x')
plt.title("K-Means Clustering")
plt.show()运行结果:可以看到数据点被分为 4 个簇,每个簇中心用红色 “X” 标记。
层次聚类通过不断合并或拆分簇,形成树状的层级结构:
import scipy.cluster.hierarchy as sch
from sklearn.cluster import AgglomerativeClustering
# 层次聚类
hc = AgglomerativeClustering(n_clusters=4, affinity='euclidean', linkage='ward')
y_hc = hc.fit_predict(X)
# 树状图
dendrogram = sch.dendrogram(sch.linkage(X, method='ward'))
plt.title("Hierarchical Clustering Dendrogram")
plt.show()树状图可以帮助选择合适的簇数。
DBSCAN 根据样本密度定义簇:
from sklearn.cluster import DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=5)
y_db = dbscan.fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_db, cmap='plasma', s=30)
plt.title("DBSCAN Clustering")
plt.show()特点:不需要指定簇数,可识别任意形状的簇,但对参数 eps、MinPts 敏感。
GMM 假设数据由多个高斯分布混合而成,通过 EM 算法估计参数,输出每个点属于簇的概率(软聚类)。
from sklearn.mixture import GaussianMixture
gmm = GaussianMixture(n_components=4, covariance_type='full')
y_gmm = gmm.fit_predict(X)
plt.scatter(X[:, 0], X[:, 1], c=y_gmm, cmap='coolwarm', s=30)
plt.title("Gaussian Mixture Model Clustering")
plt.show()特点:比 K-Means 更灵活,能发现椭圆簇。
无监督学习没有“标准答案”,评估聚类效果比较困难。常见方法:
from sklearn.metrics import silhouette_score
score = silhouette_score(X, y_kmeans)
print("K-Means 轮廓系数:", score)
无监督学习是机器学习的重要分支,在缺乏标注数据的情况下尤其有价值。其中,聚类是最典型的任务,主要方法包括: K-Means:高效、简单; 层次聚类:能揭示层次关系; DBSCAN:发现任意形状簇; GMM:基于概率的软聚类。 借助 Python 的
scikit-learn,我们能快速实现这些算法并进行可视化。聚类不仅帮助我们更好地理解数据,还能为后续建模和应用奠定基础。