K-均值聚类(K-Means Clustering)算法原理与实现
字数 837 2025-11-13 17:41:41
K-均值聚类(K-Means Clustering)算法原理与实现
K-均值聚类是一种经典的无监督学习算法,用于将数据集划分为K个不相交的簇(cluster),使得同一簇内的数据点尽可能相似,而不同簇的数据点尽可能不同。其核心思想是通过迭代优化,最小化每个数据点到其所属簇中心的距离平方和。
算法步骤详解
-
初始化簇中心
- 随机选择K个数据点作为初始的簇中心(质心)。这里的K是预先指定的超参数,表示期望划分的簇数量。
- 例如,有一个包含100个二维数据点的数据集,要将其分为3个簇(K=3),则随机选择3个点作为初始质心。
-
分配数据点到最近簇
- 遍历数据集中的每个数据点,计算其到K个质心的距离(通常使用欧几里得距离)。
- 将每个数据点分配到距离最近的质心所在的簇。
- 例如,对于点P(x, y),计算其到3个质心的距离d1、d2、d3,若d2最小,则将P分配到簇2。
-
重新计算簇中心
- 对于每个簇,计算其所有数据点的均值(即坐标的平均值),将该均值作为新的质心。
- 例如,簇2中有10个点,新质心的x坐标 = (点1_x + 点2_x + ... + 点10_x) / 10,y坐标同理。
-
迭代优化
- 重复步骤2和步骤3,直到满足终止条件(如质心的移动距离小于某个阈值,或簇分配不再发生变化)。
- 每次迭代都会使簇内数据点更紧凑,算法最终收敛到一个局部最优解。
关键问题与优化
- K值选择:K是预设的,可通过手肘法(观察误差随K变化的拐点)或轮廓系数等指标辅助确定。
- 初始质心敏感:不同的初始质心可能导致不同结果。常用K-means++算法改进初始化,使初始质心尽可能分散,提升收敛速度和稳定性。
- 距离度量:欧氏距离适用于球形簇,若数据分布特殊,可选用曼哈顿距离或余弦相似度。
- 局限性:对非球形簇、噪声点敏感,且要求簇大小相对均匀。
Python实现示例
import numpy as np
def k_means(data, k, max_iters=100):
# 随机初始化质心
centroids = data[np.random.choice(len(data), k, replace=False)]
for _ in range(max_iters):
# 分配数据点到最近质心
distances = np.linalg.norm(data[:, np.newaxis] - centroids, axis=2)
labels = np.argmin(distances, axis=1)
# 重新计算质心
new_centroids = np.array([data[labels == i].mean(axis=0) for i in range(k)])
# 检查收敛
if np.all(centroids == new_centroids):
break
centroids = new_centroids
return labels, centroids
K-均值聚类因其简单高效,广泛应用于客户分群、图像分割、异常检测等领域。理解其原理和优化方法对处理实际聚类问题至关重要。