k-meansクラスタリングアルゴリズム

9831 ワード

引用する
ブログを更新するのは久しぶりで、最近仕事の合間に勉強した理論知識と仕事の中で実践したアルゴリズムをまとめて、みんなに分かち合うことができることを望んで、自己向上です.
クラスタリングアルゴリズム
クラスタリングアルゴリズムは無監視学習アルゴリズムに属し,サンプルが属するカテゴリを事前に知る必要はない.実際の仕事では、1)マーケティング活動を行う際に冷蔵期間中にユーザーが活動に対する相応の結果を知らない場合、ユーザーをクラスタリングし、異なるカテゴリに対して異なる戦略を指定し、その後のユーザーマーケティング応答結果に基づいてユーザーに対してカテゴリの調整を行い、さらに他のユーザーの応答結果を予測する.2)異常検出は,クラスタリングにより試料の異常点,例えば反詐欺,反爬虫シーンの応用を発見できる.
k-meansアルゴリズム
k-meansアルゴリズムは実践の中で比較的に応用するクラスタリングアルゴリズムで、主にこのアルゴリズムが効率的で迅速で、アルゴリズムの構想が簡単であるため、まずk-meansクラスタリングアルゴリズムを紹介する.
牧師-村民モデル:4人の牧師が郊外の布道に行って、最初は牧師たちが勝手にいくつかの布道点を選んで、このいくつかの布道点の状況を郊外のすべての村民に公告して、そこですべての村民は自分の家に一番近い布道点まで授業を受けに行きました.授業を受けた後、みんなは距離が遠すぎると思って、牧師一人一人が自分の授業のすべての村人の住所を統計して、すべての住所の中心地帯に引っ越して、ポスターの上で自分の布道点の位置を更新しました.牧師は移動するたびにすべての人に近づくことはできません.A牧師が移動した後、自分がB牧師のところに行って授業を聞くほうが近いことに気づいた人もいます.そこで、村人はまた自分の最寄りの布道点に行きました.このように、牧師は毎週自分の位置を更新し、村人は自分の状況に応じて布道点を選んで、最終的に安定しました.このモデルはK-meansクラスタリングアルゴリズムの生き生きとしたイメージの解釈である.
k-meansアルゴリズムステップ:1.k個の初期中心点をランダムに選択する.2.データセットの各サンプル点について、サンプル点とk個の中心点との距離を計算し、サンプル点を最も近い中心点に対応するカテゴリに区分する.3.カテゴリ区分が完了した後、カテゴリの中心点を再確定し、カテゴリ内のすべてのサンプルの各特徴の平均値を新しい中心点対応特徴の取値、すなわち、このクラス内のすべてのサンプルのコアとする.4.ある終了条件(反復回数、最小誤差変化など)に達するまで、上記の2 3ステップを繰り返す.
アルゴリズムのまとめ:1)「コア」に基づくクラスタリング方法;2)データ変数が数値型のクラスタリング方法;3)アルゴリズムは効率的で速いが、サンプル中の異常データの影響が深刻である.
python実装
#      
from sklearn.cluster import KMeans
import multiprocessing
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
from sklearn.metrics import silhouette_score
#             SSE   
def TrainCluster(df, start_k=2, end_k=20):
    print('training cluster')
    #df = StandardScaler().fit_transform(df) #     
    K = []
    SSE = []
    silhouette_all=[]
    models = [] #       
    for i in range(start_k, end_k):
        kmeans_model = KMeans(n_clusters=i, n_jobs=multiprocessing.cpu_count())
        kmeans_model.fit(df)
        a = metrics.silhouette_score(df, KMeans.labels_, metric='euclidean')
        SSE.append(kmeans_model.inertia_)  #      k  SSE 
        K.append(i)
        print('{} Means SSE loss = {}'.format(i, kmeans_model.inertia_))
        silhouette_all.append(a)
        print('   k={}       {}:'.format(k,a))
        models.append(kmeans_model) #    k      

    return(K,SSE,models)

異なるカテゴリ数kを指定することにより、異なるk値に対応するSSE値(SSE値、すなわち各カテゴリにおけるサンプル点から中心点までの距離の和)が得られ、さらに異なるk-meansモデルが構築される.
#           K 
train_cluster_res = TrainCluster(data,model_name=None, start_k=2, end_k=20 )
K = train_cluster_res[0]
SSE = train_cluster_res[1]
plt.plot(K, SSE, 'bx-')
plt.xlabel('     k')
plt.ylabel('SSE')
plt.xticks(K)
plt.title('           k ')
plt.show()

異なるk値はSSEに対応する価値があり、最終的には人間の肘に相当する曲線を描き、肘に対応する点が最適なk値点、すなわち曲線の曲がり点である.
#          k 
score = train_cluster_res[2]
#      k  
models = train_cluster_res[3]
best_model = models[K.index(k)]

#    ,      
score = silhouette_score(data,kmeans_model.labels_,metric='euclidean')