sklearn_tutorial项目:深入理解K-Means聚类算法
引言
K-Means聚类是机器学习中最经典的无监督学习算法之一,广泛应用于数据挖掘、图像处理、市场细分等领域。本文将基于sklearn_tutorial项目中的K-Means教程,深入讲解这一算法的原理、实现及应用。
什么是K-Means聚类
K-Means是一种无监督聚类算法,它能够在没有任何标签信息的情况下,仅根据数据本身的特征将数据点划分为K个不同的簇。算法的核心思想是:寻找K个簇中心点,使得每个数据点到其所属簇中心的距离平方和最小。
算法基本步骤
- 随机初始化K个簇中心点
- 重复以下步骤直到收敛:
- 分配阶段:将每个数据点分配到最近的簇中心
- 更新阶段:重新计算每个簇的中心点(取簇内所有点的均值)
用scikit-learn实现K-Means
让我们通过一个简单的例子来演示K-Means的工作原理:
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 生成模拟数据
X, y = make_blobs(n_samples=300, centers=4, random_state=0, cluster_std=0.60)
# 创建KMeans实例并拟合数据
est = KMeans(4) # 指定4个簇
est.fit(X)
y_kmeans = est.predict(X)
# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='rainbow')
plt.show()
这段代码会生成4个明显的簇,K-Means算法能够准确地识别出这些簇的结构。
K-Means算法的数学原理
K-Means算法实际上是在解决一个优化问题:最小化所有数据点到其所属簇中心的距离平方和(称为"惯性"或"簇内平方和"):
$$ \text{minimize} \sum_{i=1}^n \sum_{j=1}^k \mathbb{1}(c_i = j) |x_i - \mu_j|^2 $$
其中:
- $n$是数据点数量
- $k$是簇数量
- $c_i$表示第i个数据点所属的簇
- $\mu_j$是第j个簇的中心
- $\mathbb{1}(c_i = j)$是指示函数,当$c_i = j$时为1,否则为0
K-Means的局限性
虽然K-Means简单有效,但它也有一些需要注意的局限性:
- 需要预先指定簇数量K:在实际应用中,K值往往未知
- 对初始中心点敏感:不同的初始中心可能导致不同的聚类结果
- 假设簇是凸形且大小相似:对于非凸形或不均匀大小的簇效果不佳
- 对噪声和异常值敏感:离群点可能显著影响簇中心位置
实际应用案例
1. 手写数字识别
我们可以将K-Means应用于手写数字识别,即使没有任何标签信息:
from sklearn.datasets import load_digits
digits = load_digits()
est = KMeans(n_clusters=10)
clusters = est.fit_predict(digits.data)
# 可视化簇中心
fig = plt.figure(figsize=(8, 3))
for i in range(10):
ax = fig.add_subplot(2, 5, 1 + i, xticks=[], yticks=[])
ax.imshow(est.cluster_centers_[i].reshape((8, 8)), cmap=plt.cm.binary)
令人惊讶的是,即使没有标签信息,K-Means也能找到可识别的数字簇中心!
2. 图像颜色压缩
K-Means可以用于图像颜色压缩,将数百万种颜色减少到几十种:
from sklearn.datasets import load_sample_image
from sklearn.cluster import MiniBatchKMeans
# 加载示例图像
china = load_sample_image("china.jpg")
X = (china / 255.0).reshape(-1, 3) # 归一化并重塑数据
# 使用MiniBatchKMeans进行颜色聚类
n_colors = 64
model = MiniBatchKMeans(n_colors)
labels = model.fit_predict(X)
colors = model.cluster_centers_
new_image = colors[labels].reshape(china.shape)
这种方法可以将图像从1600万种颜色(256^3)压缩到仅64种,同时保持视觉上的相似性。
实践建议
- 数据预处理:K-Means对特征的尺度敏感,通常需要标准化或归一化数据
- 确定最佳K值:可以使用肘部法则或轮廓系数等方法
- 多次运行:由于算法对初始值敏感,建议多次运行取最佳结果
- 考虑使用MiniBatchKMeans:对于大数据集,MiniBatchKMeans更高效
结语
K-Means聚类是数据分析师和机器学习工程师工具箱中的重要工具。通过本教程,我们了解了它的基本原理、实现方法以及实际应用场景。虽然简单,但K-Means在许多实际问题中表现出色,是无监督学习的一个极好起点。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考