K-Means 聚类

<机器学习笔记-06>(scikit-learn 06)K-means聚类


关键词:聚类,K-means,scikit-learn,python

摘要:本文主要介绍聚类、K-means的概念和结果评估,以及使用python进行聚类分析的方法;


  1. 要点总结

    1. 了解无监督学习以及聚类概念;

    2. K-means的实现过程,肘部法则确定超参数K,利用平均畸变程度和轮廓系数评估聚类效果;

  2. 基本概念

    1. 聚类(clustering)

      1. 属于无监督学习,可以找出不带标签数据的相似性的算法;
      2. 概念:将更具相似性的样本归为一类(cluster),同组中的样本比其他租的样本更相似;
      3. 应用:市场调查中对用户分组、社交网络识别社区、推荐系统、寻找相似模式的基因组;
    2. K-means聚类算法

      1. 实现过程
        1. 指定聚类的数量 K
        2. 初始化,指定第 k 个类的重心位置 uk ;(实际中,为避免局部最优解,需要从不同位置开始初始化,取最小成本函数对应的重心位置作为初始化位置)
        3. 遍历每一个元素 xi ,计算该元素到各个类重心 uk 的距离,将该元素划分到距其最近的类;
        4. 计算重新生成类的重心;
        5. 重复3-4,直至各个类的重心位置不再变化(成本函数值的差达到了限定值,或者前后两次迭代的重心位置变化达到了限定值);
      2. 超参数K:表示类的数量,需要人为指定,K-means不能决定要分几个类;
      3. 肘部法则(elbow method): 可用于估计聚类数量;把不同K值的成本函数值画出来,找出K值增大过程中,畸变程度下降幅度最大的位置所对应的K值(即为肘部);
      4. 参数:类的重心位置和其内部观测值的位置;
      5. 成本函数:各个类畸变程度(distortions)之和;每个类的畸变程度等于该类重心与其内部成员位置距离的平方和;最优解以成本函数最小化为目标,其中 uk 是第 k 个类的重心位置;

        J=k=1KiCk|xiuk|2

      6. 效果评估-轮廓系数(silhouette Coeffient):类的密集与分散程度的评价指标;其中 a 是每个类中样本彼此距离的均值, b 是一个类中样本与其最近的那个类的所有样本的距离的均值;

        s=bamax(a,b)

  3. Python使用

    1. numpy

      1. numpy.random.uniform(low,high,(dimension,number))生成随机正态分布数组(dimension行,number列)
        import numpy
        cluster1=numpy.random.uniform(0,10,(3,5)) #0用来指定最小值,10用来指定表示最大值,3用来指定每组数的维度,5用来指定组数;生成结果为3行5列的array
        cluster1
        '''
        array([[ 4.70790848,  2.18489986,  2.03468687,  9.90719494,  8.76117508],
            [ 7.20530626,  6.71587658,  7.75926726,  4.68401906,  6.24912461],
            [ 9.10075334,  8.87222659,  9.72546108,  0.03047577,  8.57698237]])
        '''
      2. numpy.hstack((array1,array2))用来将array1array2水平拼接起来
        import numpy
        X=numpy.hstack((cluster1,cluster1))
        
        X
        '''
        Out[27]: 
        array([[ 4.70790848,  2.18489986,  2.03468687,  9.90719494,  8.76117508,
              4.70790848,  2.18489986,  2.03468687,  9.90719494,  8.76117508],
            [ 7.20530626,  6.71587658,  7.75926726,  4.68401906,  6.24912461,
              7.20530626,  6.71587658,  7.75926726,  4.68401906,  6.24912461],
            [ 9.10075334,  8.87222659,  9.72546108,  0.03047577,  8.57698237,
              9.10075334,  8.87222659,  9.72546108,  0.03047577,  8.57698237]])
        '''
      3. 将两个一维数组转化为一个二维数组
        import numpy as np
        x1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 7, 9])
        x2 = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 1, 3])
        X = np.array(list(zip(x1, x2))).reshape(len(x1), 2)
        
        X
        '''
        Out[6]: 
        array([[1, 1],
            [2, 3],
            [3, 2],
            [1, 2],
            [5, 8],
            [6, 6],
            [5, 7],
            [5, 6],
            [6, 7],
            [7, 1],
            [8, 2],
            [9, 1],
            [7, 1],
            [9, 3]])
        '''
    2. sklearn计算聚类

      1. 聚类模型生成
        from sklearn.cluster import KMeans
        kmeans=KMeans(n_clusters=3)
        kmeans.fit(X)
      2. 利用scipy.spatial.distance.cdist计算平均畸变程度
        from scipy.spatial.distance import cdist
        d=cdist(X,Y,'euclidean')#假设X有M个元素,Y有N个元素,最终会生成M行N列的array,用来计算X、Y中每个相对元素之间的欧拉距离
        numpy.min(d,axis=1) #如果d为m行n列,axis=0时会输出每一列的最小值,axis=1会输出每一行最小值
        sum(np.min(cdist(X,kmeans.cluster_centers_,'euclidean'),axis=1))/X.shape[0] #求出平均畸变程度
      3. 计算轮廓系数
        from sklearn import metrics
        metrics.silhouette_score(X,kmeans_model.labels_,metric='euclidean'))
    3. matplotlib

      1. figsize设置图片大小
        import matplotlib.pyplot as plt
        plt.figure(figsize=(8,10))
      2. 将不同类的元素绘制成不同的颜色和标记
        colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'b'];\
        markers = ['o', 's', 'D', 'v', '^', 'p', '*', '+']
        
        for i,l in enumerate(kmeans_model.labels_):
             plt.plot(x1[i],x2[i],color=colors[l],\
             marker=markers[l],ls='None')
  4. Python实例

    1. 聚类和平均畸变程度计算

      1. 生成用来聚类分析的两组数并显示
        import numpy as np
        cluster1=np.random.uniform(0.5,1.5,(2,10))
        cluster2=np.random.uniform(3.5,4.5,(2,10))
        X=np.hstack((cluster1,cluster2)).T
        
        import matplotlib.pyplot as plt 
        plt.figure();\
        plt.axis([0,5,0,5]);\
        plt.grid(True);\
        plt.plot(X[:,0],X[:,1],'k.');
      2. 聚类分析,计算平均畸变程度
        from sklearn.cluster import KMeans
        from scipy.spatial.distance import cdist
        
        K=range(1,10)
        meandistortions=[]
        for k in K:
         kmeans=KMeans(n_clusters=k)
         kmeans.fit(X)
        meandistortions.append(sum(np.min(cdist(X,kmeans.cluster_centers_,'euclidean'),axis=1))/X.shape[0])
        
        plt.plot(K,meandistortions,'bx-');\
        plt.xlabel('K');\
        plt.ylabel('distortion');
    2. 计算轮廓系数

      1. 输入数据整理
        import numpy as np
        x1 = np.array([1, 2, 3, 1, 5, 6, 5, 5, 6, 7, 8, 9, 7, 9])
        x2 = np.array([1, 3, 2, 2, 8, 6, 7, 6, 7, 1, 2, 1, 1, 3])
        X = np.array(list(zip(x1, x2))).reshape(len(x1), 2)
      2. 显示样本点
        %matplotlib inline
        import matplotlib.pyplot as plt
        plt.figure(figsize=(10,10));\
        plt.subplot(3,2,1);
        plt.xlim([0,10]);\
        plt.ylim([0,10]);\
        plt.title('sample');\
        plt.scatter(x1,x2);\
      3. 计算并输出轮廓系数
        from sklearn.cluster import KMeans
        from sklearn import metrics
        
        colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'b'];\
        markers = ['o', 's', 'D', 'v', '^', 'p', '*', '+']
        
        subplot_counter=1
        for t in tests:
         subplot_counter=subplot_counter+1
         plt.subplot(3,2,subplot_counter)
         kmeans_model=KMeans(n_clusters=t).fit(X)
         for i,l in enumerate(kmeans_model.labels_):
             plt.plot(x1[i],x2[i],color=colors[l],\
             marker=markers[l],ls='None')
             plt.xlim([0,10])
             plt.ylim([0,10])
             plt.title('K=%s, Silhouette Coefficient= %.03f'%(t,metrics.silhouette_score(X,kmeans_model.labels_,metric='euclidean')))
  5. 参考文献

    “Mastering Machine Learning With scikit-learn”

你可能感兴趣的:(机器学习,machine,learning)