K-means算法虽然简单有效,但在实际应用中存在一些局限性。本文将深入介绍三种重要的优化方法:K-means++、Mini-Batch K-means和核K-means,并通过代码示例展示它们的实现。
一、K-means++:更聪明的初始化方法
原理介绍
传统K-means随机初始化质心可能导致:
- 收敛速度慢
- 陷入局部最优
- 聚类结果不稳定
K-means++通过概率选择优化初始化:
- 随机选择第一个质心
- 计算每个点到最近质心的距离 D ( x ) D(x) D(x)
- 按概率 D ( x ) 2 D(x)^2 D(x)2选择下一个质心
- 重复直到选出k个质心
优势
- 显著提升收敛速度
- 获得更优的聚类结果
- 理论保证:近似比 O ( l o g k ) O(log k) O(logk)
代码实现
def kmeans_plusplus_init(points: np.ndarray, k: int) -> np.ndarray:
"""K-means++初始化"""
n_samples, n_features = points.shape
# 随机选择第一个质心
centroids = [points[np.random.choice(n_samples)]]
for _ in range(1, k):
# 计算每个点到最近质心的距离
distances = np.array([min(np.linalg.norm(p - c) ** 2 for c in centroids)
for p in points])
# 按概率选择下一个质心
probabilities = distances / distances.sum()
next_centroid = points[np.random.choice(n_samples, p=probabilities)]
centroids.append(next_centroid)
return np.array(centroids)
二、Mini-Batch K-means:适合大规模数据
原理介绍
传统K-means需要每次迭代计算所有数据点,计算开销大。Mini-Batch K-means通过:
- 每次迭代随机采样一个小批量(mini-batch)
- 仅用这批数据更新质心
- 引入学习率逐步调整质心位置
优势
- 内存效率高
- 适合处理大数据集
- 在线学习能力
- 收敛速度更快