一、聚类模型简述。
        聚类算法属于无监督学习,样本标记信息未知,通过学习数据本身的内在性质和规律,试图将数据集划分为若干个相似子集。
 
        聚类模型区别于分类模型的主要有一下几点:
              1.  数据集无标注,我不知道数据具体有几类,而是通过机器聚类告诉我这个数据集可以有几个类属性。
              2.  在学习过程中无需调参。
              3.  聚类过程是根据样本数据自身的性质聚合的。
 
二、 聚类算法流程
        聚类算法的处理流程和分类算法大致相似:
            1. 数据收集
            2. 数据预处理阶段
            3. 聚类模型聚类阶段
            4. 模型调参
 
三、 K-Means算法
 
     1.   算法伪码表示:
           数据集d(样本表示为 D1, D2,..., Dn)
           人为选取K值(K < n):
           随机选择K个样本点当做初始聚类的簇中心,并记录K个坐标(M1,M2,..., Mk ) 
           伪代码如下:
            loop1:
                loop2  样本 D1 to Dn:
                      loop3  簇心M1  to Mk:
                           计算 distance  = Distance(Di , Mj) 
                           选择  min(distance )最小的Mj  作为对样本 Si的分类
                     loop3 end
               loop2 end (所有样本点完成分类)
              例如:
              以计算平均值(means)的方式重新计算蔟中心 记录新聚簇中心(Mn1, Mn2,..., MnK)
              比较   新蔟心坐标 和 旧簇心坐标:
                    if    新蔟心坐标 == 旧簇心坐标  
                                 loop1 end
                    else:
                                下次循环的簇心 = 新簇心坐标
                                 loop1  continue
        
    2.   算法过程描述
            K-Means算法过程大致为: 
                  ① 人手动选择K值(期望模型聚类出几个结果)
                  ② 在样本点平面内,随机选取K个样本点, 作为初始聚簇中心
                  ③ 遍历数据集每个样本点, 计算样本点到K个聚簇中心的距离
                  ④ 选择距离最小的聚簇中心, 将此样本点归到这个蔟中心中
                  ⑤ 在所有样本遍历完后, 遍历K聚簇中心,计算这K个簇心向量的均值,记录当前均值坐标,当做下一次聚类的簇心
                  ⑥ 比较 新聚蔟中心 == 旧聚蔟中心?;
                  ⑦ 当  ⑥ 成立时,算法结束;反之,  重复执行前面6步,直至聚蔟中心不在发生变化,算法结束
    
   3.   示例
          假设有如下样本点
 
样本点
坐标
x1
(1,2)
x2
(3,  5)
x3
(2, 4)
x4
(11, 22)
x5
(13, 15)
x6
(30,  20)
x7
(32, 22) 
x8
(34, 20)
x9
(11, 22)
x10
(3,  6)
     我要将上面10个样本点分成三类, 那么 K=3, 且选定了 3个簇C1、C2和C3,设初始聚簇中心坐标为 O1 = (2, 5) , O2 = (12, 15), O3 = (30,21)
     遍历样本点x1 to  x10    分别计算到C1, C2和 C3的距离(因为是2维度空间,使用欧氏距离):
         C1 = (2, 5) , C2 = (12, 15), C3 = (30,21)
         ① X1(1,2):
                 P(x1 -> O1) =  = 
                 P ( x1 -> O2 )  = >  P(x1 -> O1)
                 
                 P (x1  -> O3 )  =   >  P ( x1 -> O2 )
           所以将 X1归为 C1类。
        ② 重复执行上面①部分, 直至 X10 归类结束。
        ③ 生成了  数据和类别的 映射关系
                       C1 = {x1, x2, X3, X10}
                       C2 = {x4, x5, x9}
                       C3 = {x6, x7, X8}
        ④ 以均值(means)方式计算并生成C1, C2, C3的新聚蔟中心1 ,
        ⑤ 计算 X1 to  X10到新聚蔟中心1 , 的距离
        ⑥ 重复执行上述5步骤, 直至聚簇中心 坐标不再改变
 
   4.   性能度量:
         当我们建立一个聚类模型时,我如何评估我的聚类模型,这是个问题。
         分类的目标是寻找某些参数使得代价函数(cost/loss function)函数最小; 而聚类的目标是使聚类的簇内相速度高,且簇外相似度低(可以理解为每个簇簇内更聚合,簇与簇间距最大)
         那么评估模型的有两种方法: 
                 ① 外部指标: 将聚类结果与某个“参考模型”进行比较
                         给定参考簇划分C*,对数据集D={x1,x2,..., xm} ,通过聚类得到的簇划分为C ={C1,C2,..., Cn}   ,λ 与 λ∗分别表示C和C*对应的簇标记向量,两两配对考虑,有如下定义
                        
                           SS , SD,DS,DD其和分类的混淆矩阵相似。  SS表示 C中属于相同簇相同簇,且在C*中属于相同簇的样本对(因为定义的条件是两两匹配的),可以近似理解为 true positive的样本对数。
                           因为每个样本只能隶属于1个簇心,所以  a+ b+ c+ d= m(m-1)/2
                            
                 ② 内部指标: 直接参考聚类结果,不需要其他模型
                           
 
       6. 距离计算:
             2中红字部分对应的就是样本点到K簇心的距离计算其实是点到点的计算方式。距离计算又称做 “距离度量”,主要有三种:闵可夫斯基距离(闵氏距离)、曼哈顿距离和欧氏距离,前者是有两者的推广,从1、2维空间扩展到欧氏空间。
 
                      (来自wiki)
      5. Sklearn算法实现。
                
1  from sklearn.cluster import KMeans

2  clf = KMeans(n_clusters=K,n_jobs= -2) # n_clusters = k,  k个聚簇中心

3  clf.fit(dataset)  # 训练模型

  

      
原型:           class sklearn.cluster.KMeans(n_clusters=8, init='kmeans++', n_init=10, max_iter=300, tol=0.0001, precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1, algorithm='auto')
 
算法参数:       
     
      n_clusters : int, optional, default: 8, K值,默认为8.

      init : {‘k-means++’, ‘random’ or an ndarray}  'k-means ++':以智能方式为k均值聚类选择初始聚类中心,以加速收敛。 'random':从初始质心的数据中随机选择k个观测值(行) 如果传递了ndarray,它应该是形状(n_clusters,n_features)并给出初始中心。

      n_init:int,默认值:10,        使用不同质心种子运行k-means算法的时间。最终结果将是n_init连续运行的最佳输出。

      max_iter : int, default: 300,单次运行最大迭代次数

      tol : float, default: 1e-4  ;  收敛程度

      precompute_distances : {‘auto’, True, False},   'auto':如果n_samples * n_clusters> 1200万,不预先计算距离。这相当于使用双精度每个作业大约100MB的开销‘; True:始终预计算距离;False:始终不预计算距离

      verbose : int, default 0, 详细模式

      random_state : int, RandomState instance or None, optional, default: None 。  int,则random_state是随机数生成器使用的种子;RandomState instance: random_state是随机数生成器;None: RandomState实例为np.random

      copy_x : boolean, default True。 True: 不修改源数据; False:修改源数据

      n_jobs : int ,  并行计算的CPU数

      algorithm : “auto”, “full” or “elkan”, default=”auto”   ;  K-means algorithm to use, 完整的EM算法为“full”: “elkan”变体更有效,但目前不支持稀疏数据; auto” chooses “elkan”密集数据, “full”为稀疏数据。
 属性: 

      cluster_centers_:array,[n_clusters,n_features]; 簇心 坐标

      labels_: 每个样本的标签

      inertia_ : float  ,  样本到最近簇心距离和