クラスタリングアルゴリズム比較:K-meansとGauss混合モデル

2253 ワード

アルゴリズムの原理
K-means,K平均クラスタリングアルゴリズム
各clusterには中心点が存在すると仮定し、cluster内のすべてのデータ項目からこの中心点までのヨーロッパ式距離(勾配定理の拡張:各次元差の二乗和再開方)は他のcluster中心点までの距離よりも小さい.アルゴリズムのタスクは、これらのclusterの中心点を見つけることです.K-meansアルゴリズムは,まずK(一意のアルゴリズムパラメータ)個の点を中心点としてランダムに選択し,次いでヨーロッパ式距離を計算することによってすべてのデータ項目を分類する.照合後、平均アルゴリズム(mean)を使用して各クラスの中心点を再計算し、中心点が変化しないまで距離照合を計算し続け、収束が完了したとみなされます.
GMM,Gauss混合クラスタリングアルゴリズム
各クラスタのデータがガウス分布(常態分布または正規分布とも呼ばれる)に合致すると仮定し、現在のデータが示す分布は各クラスタの分布が重なる.EMアルゴリズムを使って解くのですが、具体的にはよくわかりません.2つのパラメータは、まずランダムに1つを指定し、それから別のパラメータを計算し、最後に結果と比較します.
アルゴリズムの特徴
K-means
アルゴリズムは簡単で、理解しやすい.計算量が少なく,収束が速い.分散計算を容易に行うことができます.デフォルトのすべてのプロパティが距離に与える影響は同じで、デフォルトのすべてのデータはクラスタに均一に分布します.データが3 D空間の円柱の場合、モデルは無効になります.
GMM
分かりにくいので、統計学の教材をひっくり返す必要があります.各特徴の重みが異なると仮定し,各クラスタにおけるデータ分布が不均一であると仮定する.理論的には任意の連続関数をフィッティングすることができる.計算量が多い.クラスタの1つのデータが正規分布、バイアス分布に従わない場合、クラスタアルゴリズムにばらつきが発生します.
sk-learnコード
k-means
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

#      cluster   ,        
for i in [2, 3, 4, 5, 6, 7, 8]:
    clusterer = KMeans(n_clusters=i, random_state=1024)
    clusterer.fit(data)
    #        
    labels = clusterer.predict(data)
    #    ,[-1, 1]      
    silhouette_avg = silhouette_score(data, labels)
    print("For clusters = ", i,
      "The average silhouette_score is :", silhouette_avg)
    if silhouette_avg > best_score:
        best_clusterer = clusterer
        best_score = silhouette_avg
        best_cluster = i
       #          
print best_clusterer.centers_

GMM
from sklearn.mixture import GaussianMixture
from sklearn.metrics import silhouette_score

#      cluster   ,        
for i in [2, 3, 4, 5, 6, 7, 8]:
    clusterer = GaussianMixture(n_components=i, random_state=1024)
    clusterer.fit(data)
    #        
    labels = clusterer.predict(data)
    #    ,[-1, 1]      
    silhouette_avg = silhouette_score(data, labels)
    print("For clusters = ", i,
      "The average silhouette_score is :", silhouette_avg)
    if silhouette_avg > best_score:
        best_clusterer = clusterer
        best_score = silhouette_avg
        best_cluster = i
#          
print best_clusterer.means_