K-均值聚类(K-Means Clustering)算法原理与实现
字数 837 2025-11-13 17:41:41

K-均值聚类(K-Means Clustering)算法原理与实现

K-均值聚类是一种经典的无监督学习算法,用于将数据集划分为K个不相交的簇(cluster),使得同一簇内的数据点尽可能相似,而不同簇的数据点尽可能不同。其核心思想是通过迭代优化,最小化每个数据点到其所属簇中心的距离平方和。

算法步骤详解

  1. 初始化簇中心

    • 随机选择K个数据点作为初始的簇中心(质心)。这里的K是预先指定的超参数,表示期望划分的簇数量。
    • 例如,有一个包含100个二维数据点的数据集,要将其分为3个簇(K=3),则随机选择3个点作为初始质心。
  2. 分配数据点到最近簇

    • 遍历数据集中的每个数据点,计算其到K个质心的距离(通常使用欧几里得距离)。
    • 将每个数据点分配到距离最近的质心所在的簇。
    • 例如,对于点P(x, y),计算其到3个质心的距离d1、d2、d3,若d2最小,则将P分配到簇2。
  3. 重新计算簇中心

    • 对于每个簇,计算其所有数据点的均值(即坐标的平均值),将该均值作为新的质心。
    • 例如,簇2中有10个点,新质心的x坐标 = (点1_x + 点2_x + ... + 点10_x) / 10,y坐标同理。
  4. 迭代优化

    • 重复步骤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-均值聚类因其简单高效,广泛应用于客户分群、图像分割、异常检测等领域。理解其原理和优化方法对处理实际聚类问题至关重要。

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实现示例 K-均值聚类因其简单高效,广泛应用于客户分群、图像分割、异常检测等领域。理解其原理和优化方法对处理实际聚类问题至关重要。