「机器学习笔记13」无监督学习全面解析:从聚类算法到Python实战
没有标签的数据中,如何让机器自己发现规律?
一、什么是无监督学习?
想象你面前有一大堆没有标签的水果,你的任务是根据它们的特征(颜色、形状、大小)自动分成几组。这个过程就是无监督学习的核心思想——让机器在没有明确指导(标签)的情况下,自主发现数据中的内在结构和规律。
1.1 监督学习 vs 无监督学习 vs 半监督学习
监督学习就像有参考答案的学习:
- 输入:数据 + 标签(如:图片 + “猫”/"狗"标签)
- 目标:学习条件分布 P(Y|X),建立预测模型
- 典型任务:分类、回归
无监督学习则是自主探索的学习:
- 输入:只有数据,没有标签
- 目标:发现数据本身的联合分布 P(X),找到内在结构
- 典型任务:聚类、降维、异常检测
半监督学习介于两者之间,使用少量标注数据和大量未标注数据。
1.2 为什么数据结构如此重要?
数据的内在结构蕴含着关键信息。考虑下面这个例子:
一篇有意义的文章 vs 随机打乱单词顺序后的“文章”
虽然两篇“文章”的单词数量完全相同,但只有有结构的原始文章才包含有用信息。无监督学习就是要发现这种隐藏的结构模式。
二、无监督学习的三大核心任务
2.1 聚类分析
将相似的数据点分组,形成自然的类别。这是无监督学习最经典的应用。
2.2 降维处理
在保留关键信息的前提下,减少数据特征维度,解决"维度灾难"问题。
2.3 异常检测
识别与主流数据模式显著不同的异常点,如欺诈检测、故障诊断。
三、聚类算法详解
聚类的基本准则是:类内相似度最大化,类间相似度最小化。
3.1 层次聚类:构建数据家族树
层次聚类生成树状的聚类结构,让你可以从不同粒度观察数据关系。
凝聚式层次聚类(自下而上)
# 伪代码演示凝聚式聚类过程
def agglomerative_clustering(data, k):# 1. 开始时每个点自成一类clusters = [{point} for point in data]while len(clusters) > k:# 2. 找到最相似的两个类i, j = find_most_similar_clusters(clusters)# 3. 合并这两个类new_cluster = clusters[i] | clusters[j]clusters = [c for idx, c in enumerate(clusters) if idx not in [i, j]] + [new_cluster]return clusters
类间相似度度量方法:
-
单链接:用两类间最近点的距离代表类间距离 sim(ci,cj)=maxx∈ci,y∈cjsim(x,y)\text{sim}(c_i, c_j) = \max_{x\in c_i, y\in c_j} \text{sim}(x, y)sim(ci,cj)=maxx∈ci,y∈cjsim(x,y)
-
全链接:用两类间最远点的距离代表类间距离
sim(ci,cj)=minx∈ci,y∈cjsim(x,y)\text{sim}(c_i, c_j) = \min_{x\in c_i, y\in c_j} \text{sim}(x, y)sim(ci,cj)=minx∈ci,y∈cjsim(x,y) -
平均链接:用两类所有点对的平均距离 sim(ci,cj)=1∣ci∣∣cj∣∑x∈ci,y∈cjsim(x,y)\text{sim}(c_i, c_j) = \frac{1}{|c_i||c_j|}\sum_{x\in c_i, y\in c_j} \text{sim}(x, y)sim(ci,cj)=∣ci∣∣cj∣1∑x∈ci,y∈cjsim(x,y)
分裂式层次聚类(自上而下)
与凝聚式相反,从一个大类开始不断分裂。
层次聚类对比:
特性 | 凝聚式 | 分裂式 |
---|---|---|
计算方式 | 自下而上合并 | 自上而下分裂 |
信息利用 | 局部信息 | 全局信息 |
计算效率 | 相对较高 | 相对较低 |
3.2 K-means聚类:经典高效的划分方法
K-means是最常用的聚类算法,通过迭代优化找到K个聚类中心。
算法数学原理
目标函数(最小化类内平方误差): J=1N∑n=1N∑v=1Krnv∥un−gv∥2J = \frac{1}{N}\sum_{n=1}^N\sum_{v=1}^K r_{nv} \|u_n - g_v\|^2J=