好的,我们来系统梳理 聚类方法,重点介绍 层次聚类 和 K-means 聚类,包括原理、优缺点、应用场景以及实现思路。
一、聚类(Clustering)概述
聚类是一种无监督学习方法,通过对样本数据的特征进行分析,把相似的样本归为同一类,使得类内相似度高,类间相似度低。
核心概念:
- 簇(Cluster):聚类得到的组
- 相似度度量:
- 欧氏距离(Euclidean distance)
- 曼哈顿距离(Manhattan distance)
- 余弦相似度(Cosine similarity)
- 应用场景:客户分群、文本聚类、图像分割、异常检测等
二、层次聚类(Hierarchical Clustering)
1. 基本原理
层次聚类通过构建**树状结构(Dendrogram)**表示数据的聚类过程。
- 自底向上(Agglomerative):
- 每个样本作为一个独立簇
- 计算簇间距离,合并最近的簇
- 重复直到所有样本聚成一个簇
- 自顶向下(Divisive):
- 所有样本作为一个大簇
- 不断拆分簇,直到每个样本单独成为簇
2. 簇间距离计算方式
- 最短距离(Single Linkage)
- 最长距离(Complete Linkage)
- 平均距离(Average Linkage)
- Ward 距离(最小化平方误差)
3. 优缺点
- 优点:
- 不需要预先指定簇数
- 生成的树状图可视化聚类过程
- 缺点:
- 计算复杂度高,适合小规模数据
- 对噪声敏感
4. Python 示例
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
import numpy as np
X = np.array([[1,2],[3,4],[5,6],[8,8]])
Z = linkage(X, method='ward') # 使用 Ward 距离
dendrogram(Z)
plt.show()
三、K-means 聚类
1. 基本原理
K-means 是一种划分型聚类算法,通过迭代优化簇内平方误差(SSE):
- 随机选取 K 个初始中心点
- 将每个样本分配到最近的中心点
- 重新计算每个簇的中心点
- 重复步骤 2-3,直到中心点不再变化或达到最大迭代次数
目标函数:
[
J = \sum_{i=1}^{K}\sum_{x \in C_i} ||x – \mu_i||^2
]
- (C_i):第 i 个簇
- (\mu_i):第 i 个簇的中心点
2. 优缺点
- 优点:
- 算法简单,计算速度快
- 易于实现
- 缺点:
- 必须预先指定簇数 K
- 对初始中心敏感,可能陷入局部最优
- 对异常值敏感
- 适合球形簇,不适合非凸形状簇
3. Python 示例
from sklearn.cluster import KMeans
import numpy as np
X = np.array([[1,2],[3,4],[5,6],[8,8]])
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
print(kmeans.labels_) # 聚类标签
print(kmeans.cluster_centers_) # 聚类中心
四、层次聚类 vs K-means
特性 | 层次聚类 | K-means |
---|---|---|
簇数 | 可视化树状图,不必事先指定 | 必须预先指定 K |
算法类型 | 层次型 | 划分型 |
适用数据量 | 小规模数据 | 大规模数据 |
对异常值 | 敏感 | 敏感 |
可解释性 | 高,可生成树状图 | 一般,不提供层次关系 |
计算复杂度 | 高(O(n³)) | 低(O(n·K·t)) |
五、总结与建议
- 小规模数据,想观察聚类结构 → 使用 层次聚类
- 大规模数据,追求快速划分 → 使用 K-means
- 可结合:
- 层次聚类找大致簇数 → K-means精细划分
- 对异常值敏感 → 可先做 数据预处理或使用 K-medoids/DBSCAN
发表回复