首页
/ TheAlgorithms-Python项目中的K-Means聚类算法实现解析

TheAlgorithms-Python项目中的K-Means聚类算法实现解析

2025-07-10 04:13:41作者:伍霜盼Ellen

K-Means聚类是机器学习中最经典的无监督学习算法之一,它能够将数据点自动分组到不同的簇中。本文将通过分析TheAlgorithms-Python项目中实现的K-Means算法,深入讲解其原理和实现细节。

算法概述

K-Means算法是一种迭代式的聚类方法,其核心思想是通过不断优化簇中心位置和样本分配来最小化簇内平方误差。算法主要包含以下几个步骤:

  1. 随机选择K个初始中心点
  2. 将每个数据点分配到最近的中心点所在的簇
  3. 重新计算每个簇的中心点
  4. 重复步骤2-3直到收敛

代码实现解析

1. 初始化中心点

def get_initial_centroids(data, k, seed=None):
    if seed is not None:
        np.random.seed(seed)
    n = data.shape[0]
    rand_indices = np.random.randint(0, n, k)
    centroids = data[rand_indices,:]
    return centroids

该函数实现了随机初始化中心点的过程。通过设置seed参数可以保证结果的可重复性。它从数据集中随机选择k个点作为初始中心点。

2. 分配数据点到最近的中心点

def assign_clusters(data, centroids):
    distances_from_centroids = centroid_pairwise_dist(data,centroids)
    cluster_assignment = np.argmin(distances_from_centroids,axis=1)
    return cluster_assignment

这里使用欧几里得距离计算每个数据点到所有中心点的距离,然后将数据点分配到距离最近的中心点所在的簇。

3. 更新中心点位置

def revise_centroids(data, k, cluster_assignment):
    new_centroids = []
    for i in range(k):
        member_data_points = data[cluster_assignment==i]
        centroid = member_data_points.mean(axis=0)
        new_centroids.append(centroid)
    return np.array(new_centroids)

对于每个簇,计算簇内所有数据点的均值作为新的中心点位置。这是K-Means算法中"均值"概念的体现。

4. 计算异质性(损失函数)

def compute_heterogeneity(data, k, centroids, cluster_assignment):
    heterogeneity = 0.0
    for i in range(k):
        member_data_points = data[cluster_assignment==i, :]
        if member_data_points.shape[0] > 0:
            distances = pairwise_distances(member_data_points, [centroids[i]], metric='euclidean')
            squared_distances = distances**2
            heterogeneity += np.sum(squared_distances)
    return heterogeneity

异质性衡量了簇内数据点与中心点的距离平方和,是K-Means算法优化的目标函数。这个值越小,说明聚类效果越好。

5. 主算法流程

def kmeans(data, k, initial_centroids, maxiter=500, record_heterogeneity=None, verbose=False):
    centroids = initial_centroids[:]
    prev_cluster_assignment = None
    
    for itr in range(maxiter):        
        cluster_assignment = assign_clusters(data,centroids)
        centroids = revise_centroids(data,k, cluster_assignment)
            
        if prev_cluster_assignment is not None and \
          (prev_cluster_assignment==cluster_assignment).all():
            break
            
        if record_heterogeneity is not None:
            score = compute_heterogeneity(data,k,centroids,cluster_assignment)
            record_heterogeneity.append(score)
        
        prev_cluster_assignment = cluster_assignment[:]
        
    return centroids, cluster_assignment

主函数实现了完整的K-Means算法流程,包括:

  • 迭代执行分配和更新步骤
  • 检查收敛条件(当分配不再变化时停止)
  • 记录异质性变化过程
  • 返回最终的中心点和分配结果

使用示例

# 1. 定义参数
k = 3
heterogeneity = []

# 2. 初始化中心点
initial_centroids = get_initial_centroids(X, k, seed=0)

# 3. 运行K-Means算法
centroids, cluster_assignment = kmeans(
    X, 
    k, 
    initial_centroids, 
    maxiter=400,
    record_heterogeneity=heterogeneity, 
    verbose=True
)

# 4. 可视化异质性变化
plot_heterogeneity(heterogeneity, k)

算法特点与注意事项

  1. K值选择:K-Means需要预先指定簇的数量K,这通常需要领域知识或使用肘部法则等方法确定。

  2. 初始中心点敏感:算法对初始中心点选择敏感,可能导致局部最优解。实践中常采用多次随机初始化选择最佳结果。

  3. 收敛性:算法保证收敛,但可能收敛到局部最优解。

  4. 数据类型:实现中使用欧几里得距离,最适合连续数值型数据。对于其他类型数据需要考虑其他距离度量。

  5. 可视化:提供的plot_heterogeneity函数可以帮助观察算法收敛过程,判断迭代次数是否足够。

扩展思考

  1. 如何改进初始中心点的选择策略?可以考虑K-Means++算法,它通过特定的概率分布选择初始点,通常能获得更好的聚类结果。

  2. 在大数据集上运行时,如何提高效率?可以考虑Mini-Batch K-Means等变体算法。

  3. 如何评估聚类结果的质量?除了异质性指标,还可以考虑轮廓系数等评估方法。

通过这个实现,我们不仅理解了K-Means算法的基本原理,也掌握了如何用Python实现一个完整的聚类算法。这为进一步研究和应用聚类算法打下了坚实基础。