ML - Cluster - KMeans

github:kmeans代码实现1kmeans代码实现2(包含二分k-means)
本文算法均使用python3实现html


1 聚类算法

  对于"监督学习"(supervised learning),其训练样本是带有标记信息的,而且监督学习的目的是:对带有标记的数据集进行模型学习,从而便于对新的样本进行分类。而在“无监督学习”(unsupervised learning)中,训练样本的标记信息是未知的目标是经过对无标记训练样本的学习来揭示数据的内在性质及规律,为进一步的数据分析提供基础。对于无监督学习,应用最广的即是"聚类"(clustering)
  “聚类算法”试图将数据集中的样本划分为若干个一般是不相交的子集,每一个子集称为一个“簇”(cluster),经过这样的划分,每一个簇可能对应于一些潜在的概念或类别。
  咱们能够经过下面这个图来理解:
python




  上图是未作标记的样本集,经过他们的分布,咱们很容易对上图中的样本作出如下几种划分。
  当须要将其划分为两个簇时,即 k = 2 时:



  当须要将其划分为四个簇时,即 k = 4 时:



  那么计算机是如何进行这样的划分的呢?这就须要 聚类算法来进行实现了。本文主要针对聚类算法中的一种—— kmeans算法进行介绍。


2 kmeans算法

  kmeans算法又名k均值算法。其算法思想大体为:先从样本集中随机选取 k 个样本做为簇中心,并计算全部样本与这 k 个“簇中心”的距离,对于每个样本,将其划分到与其距离最近的“簇中心”所在的簇中,对于新的簇计算各个簇的新的“簇中心”。
  根据以上描述,咱们大体能够猜想到实现kmeans算法的主要三点:
  (1)簇个数 k 的选择
  (2)各个样本点到“簇中心”的距离
  (3)根据新划分的簇,更新“簇中心”
git

2.1 kmeans算法要点

  (1) k 值的选择
     k 的选择通常是按照实际需求进行决定,或在实现算法时直接给定 k 值。
  (2) 距离的度量
     给定样本 x ( i ) = { x 1 ( i ) , x 2 ( i ) , , . . . , x n ( i ) , } x ( j ) = { x 1 ( j ) , x 2 ( j ) , , . . . , x n ( j ) , } i , j = 1 , 2 , . . . , m n 。距离的度量方法主要分为如下几种:
    (2.1)有序属性距离度量(离散属性 { 1 , 2 , 3 } 或连续属性):
      闵可夫斯基距离(Minkowski distance)github

d i s t m k ( x ( i ) , x ( j ) ) = ( u = 1 n | x u ( i ) x u ( j ) | p ) 1 p

      欧氏距离(Euclidean distance),即当 p = 2 时的闵可夫斯基距离:
d i s t e d ( x ( i ) , x ( j ) ) = | | x ( i ) x ( j ) | | 2 = u = 1 n | x u ( i ) x u ( j ) | 2

      曼哈顿距离(Manhattan distance),即当 p = 1 时的闵可夫斯基距离:
d i s t m a n ( x ( i ) , x ( j ) ) = | | x ( i ) x ( j ) | | 1 = u = 1 n | x u ( i ) x u ( j ) |

    (2.2)无序属性距离度量(好比{飞机,火车,轮船}):
      VDM(Value Difference Metric):
V D M p ( x u ( i ) , x u ( j ) ) = z = 1 k | m u , x u ( i ) , z m u , x u ( i ) m u , x u ( j ) , z m u , x u ( j ) | p

      其中 m u , x u ( i ) 表示在属性 u 上取值为 x u ( i ) 的样本数, m u , x u ( i ) , z 表示在第 z 个样本簇中属性 u 上取值为 x u ( i ) 的样本数, V D M p ( x u ( i ) , x u ( j ) ) 表示在属性 u 上两个离散值 x u ( i ) x u ( i ) V D M 距离 。
    (2.3)混合属性距离度量,即为有序与无序的结合:
M i n k o v D M p ( x ( i ) , x ( j ) ) = ( u = 1 n c | x u ( i ) x u ( j ) | p + u = n c + 1 n V D M p ( x u ( i ) , x u ( j ) ) ) 1 p

      其中含有 n c 个有序属性,与 n n c 个无序属性。
    本文数据集为连续属性,所以代码中主要以欧式距离进行距离的度量计算。
  (3) 更新“簇中心”
     对于划分好的各个簇,计算各个簇中的样本点均值,将其均值做为新的簇中心。

2.2 kmeans算法过程


  输入:训练数据集 D = x ( 1 ) , x ( 2 ) , . . . , x ( m ) ,聚类簇数 k ;
  过程:函数 k M e a n s ( D , k , m a x I t e r ) .
  1:从 D 中随机选择 k 个样本做为初始“簇中心”向量: μ ( 1 ) , μ ( 2 ) , . . . , , μ ( k ) :
  2:repeat
  3:  令 C i = ( 1 i k )
  4:  for j = 1 , 2 , . . . , m do
  5:    计算样本 x ( j ) 与各“簇中心”向量 μ ( i ) ( 1 i k ) 的欧式距离
  6:    根据距离最近的“簇中心”向量肯定 x ( j ) 的簇标记: λ j = a r g m i n i { 1 , 2 , . . . , k } d j i
  7:    将样本 x ( j ) 划入相应的簇: C λ j = C λ j { x ( j ) } ;
  8:  end for
  9:  for i = 1 , 2 , . . . , k do
  10:    计算新“簇中心”向量: ( μ ( i ) ) = 1 | C i | x C i x ;
  11:    if ( μ ( i ) ) = μ ( i ) then
  12:      将当前“簇中心”向量 μ ( i ) 更新为 ( μ ( i ) )
  13:    else
  14:      保持当前均值向量不变
  15:    end if
  16:  end for
  17:  else
  18:until 当前“簇中心”向量均未更新
  输出:簇划分 C = C 1 , C 2 , . . . , C K 算法


  为避免运行时间过长,一般设置一个最大运行轮数或最小调整幅度阈值,若达到最大轮数或调整幅度小于阈值,则中止运行。
  过程以下图:
markdown



2.2 kmeans算法分析

  kmeans算法因为初始“簇中心”点是随机选取的,所以最终求得的簇的划分与随机选取的“簇中心”有关,也就是说,可能会形成多种 k 个簇的划分状况。这是由于kmeans算法收敛到了局部最小值,而非全局最小值。机器学习


3 二分k-means算法

  基于kmeans算法容易使得结果为局部最小值而非全局最小值这一缺陷,对算法加以改进。使用一种用于度量聚类效果的指标SSE(Sum of Squared Error),即对于第 i 个簇,其SSE为各个样本点到“簇中心”点的距离的平方的和,SSE值越小表示数据点越接近于它们的“簇中心”点,聚类效果也就越好。以此做为划分簇的标准。
  算法思想是:先将整个样本集做为一个簇,该“簇中心”点向量为全部样本点的均值,计算此时的SSE。若此时簇个数小于 k ,对每个簇进行kmeans聚类( k = 2 ) ,计算将每个簇一分为二后的总偏差SSE,选择SSE最小的那个簇进行划分操做。ide

3.1 kmeans算法过程


  输入:训练数据集 D = x ( 1 ) , x ( 2 ) , . . . , x ( m ) ,聚类簇数 k ;
  过程:函数 k M e a n s ( D , k , m a x I t e r ) .
  1:将全部点看作一个簇,计算此时“簇中心”向量: μ ( 1 ) = 1 m x D x
  2:while h < k
  3:  for i = 1 , 2 , . . . , h do
  4:    将第 i 个簇使用 kmeans算法进行划分,其中 k = 2
  5:    计算划分后的偏差平方和 S S E i
  5:  比较 k 种划分的SSE值,选择SSE值最小的那种簇划分进行划分
  5:  更新簇的分配结果
  5:  添加新的“簇中心”
  18:until 当前“簇中心”个数达到 k
  输出:簇划分 C = C 1 , C 2 , . . . , C K 函数


3.2 二分k-means算法分析

  二分k-means算法再也不随机选取簇中心,而是从一个簇出发,根据聚类效果度量指标SSE来判断下一步应该对哪个簇进行划分,所以该方法不会收敛到局部最小值,而是收敛到全局最小值。post


引用及参考:
[1]《机器学习》周志华著
[2]《机器学习实战》Peter Harrington著
[3]https://blog.csdn.net/google19890102/article/details/26149927

写在最后:本文参考以上资料进行整合与总结,属于原创,文章中可能出现理解不当的地方,如有所看法或异议可在下方评论,谢谢!
若需转载请注明http://www.javashuo.com/article/p-kacaayof-ch.html

相关文章
相关标签/搜索