美文网首页
K-Means - 基于scikit实现程序

K-Means - 基于scikit实现程序

作者: TangCC | 来源:发表于2017-07-23 00:57 被阅读0次

    本文之编写程序涉及到API介绍,程序的完整实现,具体算法原理请查看之前所写的K-Means算法介绍

    一、基础准备

    1、python 基础

    2、scikit 基础

    2.1 K-Means类概述
        在scikit-learn中,包括两个K-Means的算法,一个是传统的K-Means算法,对应的类是KMeans。另一个是基于采样的Mini Batch K-Means算法,对应的类是MiniBatchKMeans。一般来说,使用K-Means的算法调参是比较简单的。

    用KMeans类的话,一般要注意的仅仅就是k值的选择,即参数n_clusters;如果是用MiniBatchKMeans的话,也仅仅多了需要注意调参的参数batch_size,即我们的Mini Batch的大小。

    当然KMeans类和MiniBatchKMeans类可以选择的参数还有不少,但是大多不需要怎么去调参。下面我们就看看KMeans类和MiniBatchKMeans类的一些主要参数。
    2.2 KMeans类主要参数

    KMeans(n_clusters=8, init='k-means++', 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')
    

    KMeans类的主要参数有:

    1. n_clusters: 即我们的k值,一般需要多试一些值以获得较好的聚类效果。k值好坏的评估标准在下面会讲。
      2)max_iter: 最大的迭代次数,一般如果是凸数据集的话可以不管这个值,如果数据集不是凸的,可能很难收敛,此时可以指定最大的迭代次数让算法可以及时退出循环。
      3)n_init:用不同的初始化质心运行算法的次数。由于K-Means是结果受初始值影响的局部最优的迭代算法,因此需要多跑几次以选择一个较好的聚类效果,默认是10,一般不需要改。如果你的k值较大,则可以适当增大这个值。
      4)init: 即初始值选择的方式,可以为完全随机选择'random',优化过的'k-means++'或者自己指定初始化的k个质心。一般建议使用默认的'k-means++'。
      5)algorithm:有“auto”, “full” or “elkan”三种选择。"full"就是我们传统的K-Means算法, “elkan”是我们原理篇讲的elkan K-Means算法。默认的"auto"则会根据数据值是否是稀疏的,来决定如何选择"full"和“elkan”。一般数据是稠密的,那么就是 “elkan”,否则就是"full"。一般来说建议直接用默认的"auto"
      2.3. MiniBatchKMeans类主要参数
    MiniBatchKMeans(n_clusters=8, init='k-means++', max_iter=100, batch_size=100, verbose=0, compute_labels=True, random_state=None, tol=0.0, max_no_improvement=10, init_size=None, n_init=3, reassignment_ratio=0.01)
    

    MiniBatchKMeans类的主要参数比KMeans类稍多,主要有:

    1. n_clusters: 即我们的k值,和KMeans类的n_clusters意义一样。
      2)max_iter:最大的迭代次数, 和KMeans类的max_iter意义一样。
      3)n_init:用不同的初始化质心运行算法的次数。这里和KMeans类意义稍有不同,KMeans类里的n_init是用同样的训练集数据来跑不同的初始化质心从而运行算法。而MiniBatchKMeans类的n_init则是每次用不一样的采样数据集来跑不同的初始化质心运行算法。
      4)batch_size:即用来跑Mini Batch KMeans算法的采样集的大小,默认是100.如果发现数据集的类别较多或者噪音点较多,需要增加这个值以达到较好的聚类效果。
      5)init: 即初始值选择的方式,和KMeans类的init意义一样。
      6)init_size: 用来做质心初始值候选的样本个数,默认是batch_size的3倍,一般用默认值就可以了。
      7)reassignment_ratio: 某个类别质心被重新赋值的最大次数比例,这个和max_iter一样是为了控制算法运行时间的。这个比例是占样本总数的比例,乘以样本总数就得到了每个类别质心可以重新赋值的次数。如果取值较高的话算法收敛时间可能会增加,尤其是那些暂时拥有样本数较少的质心。默认是0.01。如果数据量不是超大的话,比如1w以下,建议使用默认值。如果数据量超过1w,类别又比较多,可能需要适当减少这个比例值。具体要根据训练集来决定。
      8)max_no_improvement:即连续多少个Mini Batch没有改善聚类效果的话,就停止算法, 和reassignment_ratio, max_iter一样是为了控制算法运行时间的。默认是10.一般用默认值就足够了。

    二、完整程序

    # -*- coding: utf-8 -*-
    from sklearn.cluster import KMeans
    from sklearn.cluster import KMeans
    from sklearn.cluster import MiniBatchKMeans
    import matplotlib.pyplot as plt
    import numpy as np
    #展示数据
    def showCluster(dataSet, k, clusterAssment):
        dataSet = np.array(dataSet)
    
        numSamples= np.shape(dataSet)[0]
        dim = np.shape(dataSet)[1]
        if dim != 2:
            print("Sorry! I can not draw because the dimension of your data is not 2!")
            return 1
    
        mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']
        if k > len(mark):
            print("")
            return 1
    
        # draw all samples
        for i in range(numSamples):
            markIndex = int(clusterAssment[i])
            plt.plot(dataSet[i, 0], dataSet[i, 1], mark[markIndex])
    
        plt.show()
    
    
    if __name__ == '__main__':
        print("加载数据")
        dataSet = []
        fileIn = open('data\\testData.txt')
        for line in fileIn.readlines():
            lineArr = line.strip().split(' ')
            dataSet.append([float(lineArr[0]), float(lineArr[1])])
    
    
        #转化为矩阵
        k = 2
        # centroids = KMeans(n_clusters=k, random_state=9).fit_predict(dataSet)
        clusterAssment = MiniBatchKMeans(n_clusters=k, batch_size=200, random_state=9).fit_predict(dataSet)
        # # 最后结果
        print(clusterAssment)
        # print("显示数据")
        showCluster(dataSet, k, clusterAssment)
    
    

    相关文章

      网友评论

          本文标题:K-Means - 基于scikit实现程序

          本文链接:https://www.haomeiwen.com/subject/dwaukxtx.html