PythonでのK-meansの実現


K-meansアルゴリズムの概要
K-meansは機械学習で比較的よく使われるアルゴリズムで、監視なし学習アルゴリズムに属し、データのクラスタリングによく用いられ、クラスタの数を指定するだけで自動的に複数のクラスにデータを集約することができ、同じクラスタのデータ類似度が高く、異なるクラスタのデータ類似度が低い.
K-menasのメリットとデメリット:
メリット:
  • 原理単純
  • 速度が速い
  • ビッグデータセットに比較的良い伸縮性
  • がある.
    欠点:
  • クラスタリング数K
  • を指定する必要がある.
  • 異常値に敏感
  • 初期値に敏感
  • K-meansのクラスタリングプロセス
    そのクラスタリング過程は勾配降下アルゴリズムに類似し,代価関数を確立し,反復により代価関数値をますます小さくする.
  • cクラスの初期中心を適切に選択する.
  • k回目の反復では、任意のサンプルに対して、c個の中心までの距離を求め、このサンプルを距離が最も短い中心があるクラスに分類する.
  • は、クラスの中心値を平均値などの方法で更新する.
  • すべてのc個のクラスタ中心について、(2)(3)の反復法で更新した後、値が変わらない場合、反復は終了し、そうでなければ反復は継続する.

  • このアルゴリズムの最大の利点は簡潔さと迅速さにある.アルゴリズムの鍵は初期中心の選択と距離式にある.
    K-meansインスタンス展示
    pythonのkmのいくつかのパラメータ:
    sklearn.cluster.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'
        )
    n_clusters:     ,       
    init:           
    n_init:             ,           ,       10   ,    ,         。
    max_iter:       (  kmeans         )
    tol:    , kmeans         
    precompute_distances:          ,                ,   True               ,auto           featurs*samples      12e6    False,False            Cpython     
    verbose:     (       ,          )
    random_state:             。
    copy_x:             ,  True,           。bool  scikit-learn              ,           copy   ,            。     Python            。
    n_jobs:     
    algorithm: kmeans     , :’auto’, ‘full’, ‘elkan’,    ‘full’   EM    
           ,           。                ,   。           。

    コードの例を示します
    from sklearn.cluster import KMeans
    from sklearn.externals import joblib
    from sklearn import cluster
    import numpy as np
    
    #   10*3   
    data = np.random.rand(10,3)
    print data
    #    4 
    estimator=KMeans(n_clusters=4)
    # fit_predict    +  ,      
    res=estimator.fit_predict(data)
    #         
    lable_pred=estimator.labels_
    #           
    centroids=estimator.cluster_centers_
    #            
    inertia=estimator.inertia_
    
    print lable_pred
    print centroids
    print inertia
    
          
    [0 2 1 0 2 2 0 3 2 0]
    
    [[ 0.3028348   0.25183096  0.62493622]
     [ 0.88481287  0.70891813  0.79463764]
     [ 0.66821961  0.54817207  0.30197415]
     [ 0.11629904  0.85684903  0.7088385 ]]
     
    0.570794546829

    より直感的に説明するために、今回は画像に2次元を描くのが直感的であるため、データは2次元に調整され、100点を選択して描画され、クラスタリングカテゴリは3クラスである.
    from sklearn.cluster import KMeans
    from sklearn.externals import joblib
    from sklearn import cluster
    import numpy as np
    import matplotlib.pyplot as plt
    
    data = np.random.rand(100,2)
    estimator=KMeans(n_clusters=3)
    res=estimator.fit_predict(data)
    lable_pred=estimator.labels_
    centroids=estimator.cluster_centers_
    inertia=estimator.inertia_
    #print res
    print lable_pred
    print centroids
    print inertia
    
    for i in range(len(data)):
        if int(lable_pred[i])==0:
            plt.scatter(data[i][0],data[i][1],color='red')
        if int(lable_pred[i])==1:
            plt.scatter(data[i][0],data[i][1],color='black')
        if int(lable_pred[i])==2:
            plt.scatter(data[i][0],data[i][1],color='blue')
    plt.show()

    クラスタリング効果は良好であることがわかり、k-meansのクラスタリング効率をテストし、次元を50次元に拡大した.
    データ規模
    時間を費やす
    データ次元
    10,000
    4s
    50次元
    100000件
    30s
    50次元
    1000000件
    4'13s
    50次元
    百万級のデータに対して、フィッティング時間はまだ受け入れられるが、可視効率は悪くない.モデルの保存は他の機械学習アルゴリズムモデルの保存と似ている.
    from sklearn.externals import joblib
    joblib.dump(km,"model/km_model.m")