K-Means 聚类算法的原理和实战

394 阅读1分钟

K-Means 算法的原理可以概括为通过迭代找到数据集中的 K 个簇中心,将数据点分配到距离最近的簇中,最终使得每个簇内的点尽可能紧密地聚集在一起。它是一种无监督学习算法,通常用于对数据进行聚类分析。

原理

  1. 选择初始簇中心

    • 首先,选择 K 个初始的簇中心(通常是随机选择,或使用 K-Means++ 方法进行优化选择)。
  2. 分配数据到最近的簇中心

    • 对于每一个数据点,根据其与各个簇中心的距离,将数据点分配到距离最近的簇。这里的距离通常是 欧几里得距离
    • d=(x2x1)2+(y2y1)2d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}
  3. 重新计算簇中心

    • 对每个簇,重新计算其中心(质心)。新的中心是该簇中所有数据点的坐标的平均值。
  4. 重复分配和计算

    • 使用新的簇中心,再次重复步骤 2 和步骤 3,直到簇中心不再变化或者变化非常小。

迭代过程

K-Means 算法通过不断迭代来优化簇中心的位置,直到找到一个局部最优解。算法结束的标准通常是:

  • 簇中心稳定:即簇中心在连续两次迭代后不再发生变化。
  • 达到最大迭代次数:通常为了防止算法陷入无休止的迭代,会设定一个最大迭代次数。

优化目标

K-Means 算法的目标是最小化 簇内平方误差(Within-Cluster Sum of Squares, WCSS),其数学表达式为:

i=1kxCixμi2∑_{i=1}^{k}∑_{x∈Ci}∣∣x−μi∣∣^2

其中:

  • k k 是簇的数量,
  • CiC_i是第 i个簇,
  • uiu_i 是第i个簇的中心,
  • xx是数据点,xμi∣∣x−μi∣∣表示数据点与簇中心之间的距离。

实践

我们有 8 个二维坐标数据点:

  • A1 = (2, 10), A2 = (2, 5), A3 = (8, 4), A4 = (5, 8), A5 = (7, 5), A6 = (6, 4), A7 = (1, 2), A8 = (4, 9)
  • 假设初始每个簇的中心分别是A1、A4和A7。

步骤1:计算每个点到簇中心的距离:

image.png

结果如下:

  • 簇 1:A1
  • 簇 2:A3, A4, A5, A6, A8
  • 簇 3:A2, A7

注:这里簇中心为A1,A4,A7点所以可能不太明显 image.png

步骤2重新计算簇中心

  • 簇 1 只有 A1,新的中心就是 A1 本身:
    • 𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑𝑠1=(2,10)𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑𝑠1 = (2, 10)
  • 簇 2 包含 A3、A4、A5、A6 和 A8,新的质心为:
    • 𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑𝑠2=((8+5+7+6+4)/5,(4+8+5+4+9)/5)𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑𝑠2 =(( 8 + 5 + 7 + 6 + 4 )/ 5,( 4 + 8 + 5 + 4 + 9 )/ 5) = (6,6)(6,6)
  • 簇3
    • 𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑𝑠3=((2+1)/2,5+2)/2)𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑𝑠3 = ((2+1)/2,(5+2)/2)=(1.5,3.5)(1.5,3.5)

再次计算每一个点到新簇中心的距离 image.png 得到新的簇中心以及每个点的分类为:
Cluster 1 :{A1, A8}
Cluster 2 : {A3, A4, A5, A6}
Cluster 3 : {A2, A7}

下面为可视化图,其中红色为簇中心

image.png

并且可以得到新的簇中心位置为:
New_centroids1 = ((2+4/2,10+9/2=3,9.5)((2+4)/2,(10 +9)/2)=(3,9.5)
New_centroids2 = ((8+5+7+6)/4,4+8+5+4)/4)=6.5,5.25)((8+5+7+6)/4,(4+8+5+4)/4)=(6.5,5.25)
New_centroids3 = ((2+1)/2,(5+2/2))=1.5,3.5)((2+ 1)/2,(5+ 2/2)) = (1.5,3.5)


接着根据继续计算点到新簇的距离,以判断该点的类别(Iteration 3)

image.png 分类结果为:
Cluster 1 :{A1, A4, A8}
Cluster 2 : {A3, A5, A6}
Cluster 3 : {A2, A7}

可视化结果如下: image.png

并计算新的簇心为:
𝑁𝑒𝑤 𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑𝑠1 = (2+5+4)/3,(10+8+9)/3=(3.667,9)( 2 + 5 + 4 )/ 3 , ( 10 + 8 + 9 )/ 3 = ( 3.667 ,9 )
𝑁𝑒𝑤 𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑𝑠2 = ((8+7+6)/3,(4+5+4)/3)=(7,4.333)(( 8 + 7 + 6 )/ 3 , ( 4 + 5 + 4 )/ 3 ) = ( 7 , 4.333 )
𝑁𝑒𝑤 𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑𝑠3 =(2+1)/2,(5+2)/2=(1.5,3.5) ( 2 + 1 )/ 2 , ( 5 + 2 )/ 2 = ( 1.5 , 3.5 )


同理计算每个点到新簇心距离并继续分类

image.png 分类结果为:
Cluster 1 :{A1, A4, A8}
Cluster 2 : {A3, A5, A6}
Cluster 3 : {A2, A7}

可视化: image.png

新簇心为:
𝑁𝑒𝑤 𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑𝑠1 = (2+5+4)/3,(10+8+9)/3=(3.667,9)( 2 + 5 + 4 )/ 3 , ( 10 + 8 + 9 )/ 3 = ( 3.667 ,9 )
𝑁𝑒𝑤 𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑𝑠2 = ((8+7+6)/3,(4+5+4)/3)=(7,4.333)(( 8 + 7 + 6 )/ 3 , ( 4 + 5 + 4 )/ 3 ) = ( 7 , 4.333 )
𝑁𝑒𝑤 𝑐𝑒𝑛𝑡𝑟𝑜𝑖𝑑𝑠3 =(2+1)/2,(5+2)/2=(1.5,3.5) ( 2 + 1 )/ 2 , ( 5 + 2 )/ 2 = ( 1.5 , 3.5 )

到此我们可以发现分类的结果不再变化,并且簇心不再变化,迭代完成。


Tips:
K-Means 算法通过不断迭代来优化簇中心的位置,直到找到一个局部最优解。算法结束的标准通常是:

  • 簇中心稳定:即簇中心在连续两次迭代后不再发生变化。
  • 达到最大迭代次数:通常为了防止算法陷入无休止的迭代,会设定一个最大迭代次数。