一、概述
当前人工智能技术实现的一种主要手段是机器学习,而机器学习能够解决的问题主要有三种:分类、聚类、回归,有监督的是分类,无监督的是聚类。所谓聚类,就是以一定的方法将一堆样本依它们本身的数据特性划分成不同的簇类,以达成不同的技术目的,k-means就是这样一种基础聚类算法。
二、算法原理
对给定的样本集,k-means基于迭代的思想,由聚集中心点划定簇集,簇集反过来确定新的聚集中心点,周而复始,最终获得最佳划分的簇集。k-means中的k即想要划定的簇数,它是一个超参数,需由人工事先指定。样本的簇集划归由它与各个聚集中心点的距离来确定,划归到距离最近的那一个,其中距离的计算一般采用欧氏距离;新划定的簇集则进一步计算质心作为新的聚集中心,质心即样本向量的均值 c = ( x ( 1 ) ˉ , x ( 2 ) ˉ , . . . , x ( n ) ˉ ) c=\left( \bar{x^{(1)}},\bar{x^{(2)}},...,\bar{x^{(n)}} \right) c=(x(1)ˉ,x(2)ˉ,...,x(n)ˉ)
算法描述
 输入:样本集 
    
     
      
       
        T
       
       
        =
       
       
        
         {
        
        
         
          x
         
         
          1
         
        
        
         ,
        
        
         
          x
         
         
          2
         
        
        
         ,
        
        
         .
        
        
         .
        
        
         .
        
        
         ,
        
        
         
          x
         
         
          N
         
        
        
         }
        
       
      
      
       T=\left\{ x_1,x_2,...,x_N \right\}
      
     
    T={x1,x2,...,xN},簇数k.
 输出:质心集合 
    
     
      
       
        C
       
       
        =
       
       
        
         {
        
        
         
          c
         
         
          1
         
        
        
         ,
        
        
         
          c
         
         
          2
         
        
        
         ,
        
        
         .
        
        
         .
        
        
         .
        
        
         ,
        
        
         
          c
         
         
          k
         
        
        
         }
        
       
      
      
       C=\left\{ c_1,c_2,...,c_k \right\}
      
     
    C={c1,c2,...,ck},划分样本集
    
     
      
       
        D
       
       
        =
       
       
        
         {
        
        
         
          D
         
         
          1
         
        
        
         ,
        
        
         
          D
         
         
          2
         
        
        
         ,
        
        
         .
        
        
         .
        
        
         .
        
        
         ,
        
        
         
          D
         
         
          k
         
        
        
         }
        
       
      
      
       D=\left\{ D_1,D_2,...,D_k \right\}
      
     
    D={D1,D2,...,Dk}.
 (1) 任意选定k个样本作为初始聚集中心.
 (2) 划分簇类
   1)对T中数据,计算与各个聚集中心的距离.样本x与聚集中心c的距离为
     
      
       
        
         d
        
        
         =
        
        
         
          
           
            ∑
           
           
            
             i
            
            
             =
            
            
             1
            
           
           
            n
           
          
          
           
            (
           
           
            
             x
            
            
             
              (
             
             
              i
             
             
              )
             
            
           
           
            −
           
           
            
             c
            
            
             
              (
             
             
              i
             
             
              )
             
            
           
           
            
             )
            
            
             2
            
           
          
         
        
       
       
        d=\sqrt{\sum_{i=1}^{n}{(x^{(i)}-c^{(i)})^{2}}}
       
      
     d=i=1∑n(x(i)−c(i))2
   2)将样本划归到离得最近的聚集中心,形成簇类。
 (3)计算质心作为聚集中心
 对簇S,质心 
     
      
       
        
         c
        
        
         =
        
        
         
          (
         
         
          
           c
          
          
           
            (
           
           
            1
           
           
            )
           
          
         
         
          ,
         
         
          
           c
          
          
           
            (
           
           
            2
           
           
            )
           
          
         
         
          ,
         
         
          .
         
         
          .
         
         
          .
         
         
          ,
         
         
          
           c
          
          
           
            (
           
           
            n
           
           
            )
           
          
         
         
          )
         
        
       
       
        c=\left( c^{(1)},c^{(2)},...,c^{(n)} \right)
       
      
     c=(c(1),c(2),...,c(n))其中
  
    
     
      
       
        
         c
        
        
         
          (
         
         
          i
         
         
          )
         
        
       
       
        =
       
       
        
         1
        
        
         M
        
       
       
        
         ∑
        
        
         
          s
         
         
          =
         
         
          1
         
        
        
         M
        
       
       
        
         x
        
        
         s
        
        
         
          (
         
         
          i
         
         
          )
         
        
       
      
      
       c^{(i)}=\frac{1}{M}\sum_{s=1}^{M}{x_{s}^{(i)}}
      
     
    c(i)=M1∑s=1Mxs(i),
    
     
      
       
        M
       
       
        =
       
       
        
         ∣
        
        
         S
        
        
         ∣
        
       
      
      
       M=\left| S \right|
      
     
    M=∣S∣.
 (4)重复(2)-(3)步,直至质心不发生偏移或达到指定的迭代次数.
三、python实现
'''
由sklearn实现kmeans聚类。
'''
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings("ignore")
#初始化数据集
d1 = np.random.rand(18,2)
d2 = 1.5 + np.random.rand(17,2)
d3 = 3 + np.random.rand(20,2)
data = np.concatenate((d1,d2,d3),axis=0)
#定义kmeans模型,n_clusters为指定的簇数k
kmr = KMeans(n_clusters=3)
#数据计算
fit_kmr = kmr.fit(data)
#获取标签结果
rs_labels = fit_kmr.labels_
#获取每个簇类的中心点
rs_center_ids = fit_kmr.cluster_centers_
#绘图
#绘制数据点
plt.scatter(data[:,0],data[:,1],c=rs_labels,alpha=0.5)
#绘制质心
plt.scatter(rs_center_ids[:,0],rs_center_ids[:,1],c='red')
plt.show()
运行结果:
 
End.



















