好的,我们来系统梳理 聚类方法,重点介绍 层次聚类K-means 聚类,包括原理、优缺点、应用场景以及实现思路。


一、聚类(Clustering)概述

聚类是一种无监督学习方法,通过对样本数据的特征进行分析,把相似的样本归为同一类,使得类内相似度高,类间相似度低。

核心概念

  • 簇(Cluster):聚类得到的组
  • 相似度度量
    • 欧氏距离(Euclidean distance)
    • 曼哈顿距离(Manhattan distance)
    • 余弦相似度(Cosine similarity)
  • 应用场景:客户分群、文本聚类、图像分割、异常检测等

二、层次聚类(Hierarchical Clustering)

1. 基本原理

层次聚类通过构建**树状结构(Dendrogram)**表示数据的聚类过程。

  • 自底向上(Agglomerative)
    1. 每个样本作为一个独立簇
    2. 计算簇间距离,合并最近的簇
    3. 重复直到所有样本聚成一个簇
  • 自顶向下(Divisive)
    1. 所有样本作为一个大簇
    2. 不断拆分簇,直到每个样本单独成为簇

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)

  1. 随机选取 K 个初始中心点
  2. 将每个样本分配到最近的中心点
  3. 重新计算每个簇的中心点
  4. 重复步骤 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