聚类算法 (Clustering)
🎬 视频详解 (Video)
Section titled “🎬 视频详解 (Video)”📌 核心定义 (What)
Section titled “📌 核心定义 (What)”一句话定义:聚类是一种无监督学习算法,目标是将数据点分成若干组,使得组内相似、组间不同。
与分类不同,聚类不需要标签,让数据自己”物以类聚”。
🎨 交互演示 (Interactive)
Section titled “🎨 交互演示 (Interactive)”观察 K-Means 算法的迭代过程:分配点 → 更新中心 → 重复直到收敛。
🎯K-Means 聚类可视化
K (簇数)3
迭代次数0
Inertia0.00
阶段初始化
📝 K-Means 算法步骤
1. 初始化
随机选择 K 个中心
2. 分配
点归属最近中心
3. 更新
重算簇中心
4. 收敛
中心不再变化
🏠 生活类比 (Analogy)
Section titled “🏠 生活类比 (Analogy)”🛒 超市商品分区
Section titled “🛒 超市商品分区”超市老板想把商品分类摆放,但没有预设分类标准:
- 把相似的商品放一起(饮料区、零食区、生鲜区)
- 不同区域的商品差异明显
- 顾客购物更方便
这就是聚类在做的事:发现数据中的自然分组。
🎯 K-Means 算法
Section titled “🎯 K-Means 算法”最经典的聚类算法,步骤简单直观:
1. 随机选择 K 个点作为初始中心点2. 重复直到收敛: a. 分配: 每个点归属于最近的中心 b. 更新: 重新计算每组的中心点初始状态: 第1轮: 第2轮: 收敛: o o o o o o o o o o o o * * ★ ★
o o o o o o o o o o o o * * ★ ★
* = 初始中心 ★ = 更新后中心目标:最小化组内平方和 (Within-Cluster Sum of Squares)
其中 是簇 的中心点。
💻 代码实现 (Code)
Section titled “💻 代码实现 (Code)”from sklearn.cluster import KMeansimport numpy as npimport matplotlib.pyplot as plt
# 生成数据from sklearn.datasets import make_blobsX, _ = make_blobs(n_samples=300, centers=4, random_state=42)
# K-Means 聚类kmeans = KMeans(n_clusters=4, random_state=42)labels = kmeans.fit_predict(X)centers = kmeans.cluster_centers_
# 可视化plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', alpha=0.6)plt.scatter(centers[:, 0], centers[:, 1], c='red', marker='X', s=200)plt.title('K-Means Clustering')plt.show()from sklearn.cluster import KMeansimport matplotlib.pyplot as plt
# 计算不同 K 值的 inertiainertias = []K_range = range(1, 11)
for k in K_range: kmeans = KMeans(n_clusters=k, random_state=42) kmeans.fit(X) inertias.append(kmeans.inertia_)
# 肘部图plt.plot(K_range, inertias, 'bo-')plt.xlabel('K (簇数)')plt.ylabel('Inertia (组内平方和)')plt.title('肘部法则选择最优 K')plt.show()from sklearn.cluster import DBSCAN
# DBSCAN: 基于密度的聚类# 不需要预设 K,能发现任意形状的簇dbscan = DBSCAN(eps=0.5, min_samples=5)labels = dbscan.fit_predict(X)
# -1 表示噪声点n_clusters = len(set(labels)) - (1 if -1 in labels else 0)print(f"发现 {n_clusters} 个簇")📊 常见聚类算法对比
Section titled “📊 常见聚类算法对比”| 算法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| K-Means | 划分到最近中心 | 简单快速 | 需指定 K,只能球形簇 |
| DBSCAN | 基于密度 | 任意形状,自动去噪 | 参数敏感 |
| 层次聚类 | 自底向上合并 | 可视化树状图 | 计算量大 |
| GMM | 高斯混合模型 | 软聚类,概率输出 | 需指定 K |
🔧 如何选择 K?
Section titled “🔧 如何选择 K?”1. 肘部法则 (Elbow Method)
Section titled “1. 肘部法则 (Elbow Method)”画出 K vs Inertia 曲线,找”肘部”拐点。
2. 轮廓系数 (Silhouette Score)
Section titled “2. 轮廓系数 (Silhouette Score)”- :点到同簇其他点的平均距离
- :点到最近其他簇的平均距离
- 范围 ,越大越好
from sklearn.metrics import silhouette_score
score = silhouette_score(X, labels)print(f"轮廓系数: {score:.3f}")⚠️ K-Means 的局限
Section titled “⚠️ K-Means 的局限”- 必须预设 K - 可用肘部法或轮廓系数估计
- 只能发现球形簇 - 非凸形状用 DBSCAN
- 对初始中心敏感 - 使用
init='k-means++' - 对异常值敏感 - 预处理时去除噪声
🔗 应用场景
Section titled “🔗 应用场景”| 场景 | 说明 |
|---|---|
| 客户分群 | 按消费行为分组,精准营销 |
| 图像分割 | 按颜色聚类分割区域 |
| 异常检测 | 远离所有簇中心的点 |
| 文档聚类 | 相似主题的文章分组 |
| 数据压缩 | 用簇中心代表整组数据 |
📚 延伸阅读
Section titled “📚 延伸阅读”- 词嵌入 Embedding - 聚类在 NLP 中的应用
- 决策树 - 另一种无需特征缩放的算法