简体中文简体中文
EnglishEnglish
简体中文简体中文

K-means算法源码解析与实现

2025-01-26 22:29:06

一、引言

K-means算法是一种经典的聚类算法,它通过迭代的方式将数据集划分为K个簇,使得每个簇内的数据点尽可能地接近,而簇与簇之间的数据点尽可能地远离。K-means算法在实际应用中具有广泛的应用,如图像处理、数据挖掘、机器学习等领域。本文将详细解析K-means算法的源码,并给出Python实现。

二、K-means算法原理

K-means算法的基本思想如下:

1.随机选择K个数据点作为初始聚类中心。 2.将所有数据点分配到最近的聚类中心,形成K个簇。 3.重新计算每个簇的聚类中心,即取该簇中所有数据点的平均值。 4.重复步骤2和步骤3,直到聚类中心不再发生变化或满足一定的迭代次数。

三、K-means算法源码解析

以下是一个K-means算法的Python实现,其中包括了初始化聚类中心、分配数据点、计算聚类中心等步骤。

`python import numpy as np

def kmeans(X, K, maxiter=100): """ K-means算法实现 :param X: 数据集 :param K: 聚类数 :param maxiter: 最大迭代次数 :return: 聚类中心、数据点所属簇标签 """ # 初始化聚类中心 centroids = X[np.random.choice(X.shape[0], K, replace=False)]

for _ in range(max_iter):
    # 分配数据点到最近的聚类中心
    distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
    labels = np.argmin(distances, axis=0)
    # 计算新的聚类中心
    new_centroids = np.array([X[labels == k].mean(axis=0) for k in range(K)])
    # 判断聚类中心是否变化
    if np.all(centroids == new_centroids):
        break
    centroids = new_centroids
return centroids, labels

示例数据

X = np.array([[1, 2], [1, 4], [1, 0], [10, 2], [10, 4], [10, 0]])

调用K-means算法

centroids, labels = kmeans(X, K=2)

print("聚类中心:") print(centroids) print("数据点所属簇标签:") print(labels) `

四、K-means算法优缺点

1.优点: - 算法简单,易于实现。 - 运行速度快,适用于大规模数据集。 - 对初始聚类中心的选择不敏感。

2.缺点: - K-means算法是硬聚类,即每个数据点只能属于一个簇。 - 算法对噪声和异常值敏感,可能导致聚类结果不准确。 - 无法确定最佳的聚类数K。

五、总结

本文对K-means算法的原理、源码以及优缺点进行了详细的解析。通过阅读本文,读者可以更好地理解K-means算法,并在实际应用中灵活运用。在实际应用中,可以根据具体情况选择合适的聚类算法,以提高聚类效果。