K-means聚类算法详解

K-means聚类算法是一种广泛使用的无监督学习算法,主要用于将数据集分成多个簇。该算法通过迭代优化簇中心点,使得簇内样本与中心点的距离之和最小化。下面将详细介绍K-means算法的参数设置、工作原理以及如何在Python中实现它。

算法参数

在K-means算法中,有几个关键参数需要设置,包括:

  • n_clusters:要形成的簇的数量,同时也是要生成的中心点的数量。
  • init:初始化方法,可以是'k-means++'(智能选择初始簇中心以加速收敛)或'random'(从数据中随机选择n_clusters个观测值作为初始中心点)。
  • n_init:算法运行的次数,每次使用不同的中心点种子。默认为'auto',根据init的值决定运行次数。
  • max_iter:算法的最大迭代次数,默认为300。
  • tol:收敛的相对容忍度,当连续两次迭代中心点的变化小于这个值时,算法停止迭代。
  • random_state:随机数生成器的种子,用于初始化中心点。
  • copy_x:是否在预处理距离时复制原始数据。
  • algorithm:使用的K-means算法变体,可以是'lloyd'(经典EM风格算法)或'elkan'(在某些数据集上更高效,但内存消耗更大)。
  • return_n_iter:是否返回迭代次数。

这些参数共同决定了K-means算法的行为和性能。在实际应用中,可能需要根据数据集的特点和需求调整这些参数以达到最佳效果。

算法原理

K-means算法的工作原理可以概括为以下几个步骤:

  1. 随机选择n_clusters个数据点作为初始中心点。
  2. 将每个数据点分配给最近的中心点,形成n_clusters个簇。
  3. 重新计算每个簇的中心点,通常取簇内所有点的均值。
  4. 重复步骤2和3,直到满足收敛条件(如达到最大迭代次数或中心点变化小于某个阈值)。

K-means算法的目标是最小化簇内样本与中心点的距离之和,即所谓的惯性(inertia)。这个指标反映了簇内的紧密程度,值越小表示簇内样本越接近中心点。

Python代码实现

在Python中,可以使用scikit-learn库中的KMeans类来实现K-means算法。下面是一个简单的示例代码:

import numpy as np from sklearn.cluster import KMeans # 生成示例数据 X = np.array([[1, 2], [1, 4], [1, 0], [10, 2], [10, 4], [10, 0]]) # 创建KMeans实例并拟合数据 kmeans = KMeans(n_clusters=2, n_init='auto', random_state=0) kmeans.fit(X) # 获取中心点、簇标签和惯性 centroids = kmeans.cluster_centers_ labels = kmeans.labels_ inertia = kmeans.inertia_ print("中心点:", centroids) print("簇标签:", labels) print("惯性:", inertia)

在这个示例中,首先生成了一个简单的二维数据集,然后创建了一个KMeans实例并设置了一些参数(如簇的数量和初始化方法)。接着,使用fit方法拟合数据,最后获取了中心点、簇标签和惯性等结果。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485