機械学習A-Z~K平均クラスタリングアルゴリズム

5275 ワード

本論文では,K平均クラスタリングアルゴリズム(K−Means Clustering)について述べるが,K Meansアルゴリズムは直感的に理解しやすく,計算効率も非常に高いため,すべてのクラスタリングアルゴリズムの中で最も古典的なものである.
げんり
K-Meansアルゴリズムを話す前に、このアルゴリズムが何ができるか見てみましょう.次のグループのデータは、データをいくつかのクラスに分けたいと思っています.あるクラスでは、これらのデータの互いの距離が近いです.この大きな問題に対して、私たちは2つの小さな問題があります.1つ目は、分類されたクラスの個数をどのように決定するかです.2つ目の問題は、クラスの個数を決定する場合に、各クラスに含まれる要素をどのように決定するかです.K-Meansアルゴリズムは、最適なクラスタリング方法を自動的に見つけるのに役立ちます.図に示すように、K-Meansアルゴリズムは、これらのデータが赤と青と緑の3つのグループに分かれていると述べています.
では、K-Meansアルゴリズムのワークフローを見てみましょう.
  • 私たちが望むクラスの個数Kを選択します.
  • 平面上でK個の点をランダムに選択し、初期化クラスの中心点として、必ずしも元のデータの中にあるとは限らない.
  • データセットの各ポイントについて、これまでK個の中心点のどのクラスに属していたかを判断します.データ中の各点のK個の点に対する距離の大きさに基づいて、最も短い距離を見つけると、各データ点に対応するカテゴリであり、このステップは割り当てと呼ぶことができる.
  • 新しい中心点を再計算することは、以前に割り当てられた結果を適用して割り当てられた各クラスの中心点を再計算することである.
  • 再割り当て、再割り当ての結果が以前の割り当ての結果と同じであれば、最適なK-Meansアルゴリズムの結果が見つかったことを示し、異なる場合は、最適なアルゴリズムの結果
  • が見つかるまで、4ステップ目の割り当て計算を継続する
    この手順を具体例から説明します.データのセットがあると仮定すると、K=2という2つのクラスに割り当てられます.次に、ランダムに2つの点を選択し、各点の距離をそれぞれ計算します.ここでは比較的簡単な計算方法があり、この2つの点の垂直平分線を作成すると、この緑の線の上の点は青の点に近く、下の点は赤に近い.
    では、上の点を青グループに分け、下の点を赤グループに分けます.現在のステップは、すでに第3のステップに進んでいることに相当します.次に、4番目のステップでは、各データのセットの中心点を更新します.では、新しい中心点を見つけて5番目のステップを行い、新しい中心点に基づいて、再割り当てを行います.
    割り当ての結果が前のステップの割り当ての結果と一致するまで、45ステップを繰り返します.
    K-Meansアルゴリズムはアルゴリズムの方法で最適なクラスタリングの方法を教えてくれ,ここで左下赤群,右上青群という結論を得た.
    ランダム初期化トラップ
    初期点の選択が最終K‐Measクラスタリング結果に及ぼす影響を見てみよう.次の例では、K-Meansアルゴリズムを使用してデータのセットをクラスタリングし、K=3を選択する必要があります.ここには明らかに3種類があり、ここでは最適な中心点を直接選択し、この3種類のデータをマークします.
    では、ここは私たちが肉眼で見た3つの中心点ですが、私たちがこの最適な中心点を選択していない場合は、上記の45ステップを繰り返す必要があります.例えば、次の3つの中心点を選択します.
    この場合,中心点をシフトする必要があるが,このシフトは非常に小さいため,新しい分類結果と以前は何も変わらないため,アルゴリズムはこのように終了した.
    このようにして得られた分類結果は以前と明らかに異なる.しかし,これにより同じグループのデータが発生し,2つの異なる分類結果が生成された.違いは、異なる初期中心点を選択することです.どの分類アルゴリズムがより良いかを直接言うのはよくなく,初期中心点をどのように選択するかを判断する方法が必要である.すなわち,初期中心点はランダムに選択できない.現在、K-Meansアルゴリズムの更新バージョンがあります.K-Means++と呼ばれ、中心点を初期化するトラップを完璧に解決しています.数学的には局所最小値と呼ばれるトラップです.RでもPythonでも、このK-Means++はアルゴリズムに組み込まれているので、その後のコード実装がこの罠に落ちる心配はありません.
    選択クラスの数
    前述したのは中心点を選択するトラップであり,クラスの個数をどのように選択するかについて述べる.直感的には、上記の画像の大部分は3つのグループに分けたいと考えやすいはずですが、2つのグループに分けたい人もいるかもしれませんが、どのように選択すれば最適なグループ分け方法なのかはよく検討する必要があります.まず,数学の量,グループ内二乗和(WCSS)を定義する.
    この式を見ると,合計3項目であり,各項は各群に対する二乗和を表す.たとえば、1つ目は、すべてのデータポイント対の中心点距離の2乗です.各グループのデータが縮こまるほど,この二乗和は小さくなることは明らかである.
    では、このデータのセットを1つのグループに分けると、このグループ内の二乗和は1つしかないので、この結果は明らかに大きくなります.2つのグループに分けると、結果は1つのグループよりも必ず小さく、3つのグループに分けると、結果はより小さくなります.すなわち,グループの個数が増えるにつれて,このグループ内の二乗和は次第に小さくなる.では、今の問題は、最適なグループの個数をどのように選択するかです.
    ここでは肘の法則(The Elbow Method)という法則を紹介します.グループ数が増えるにつれてWCSSの結果の画像を描き出す.
    肘に最も似ている点を見つけて、ここが3で、それではこの点は、最適なグループの個数です.この曲線では、1から2、2から3の場合、降下速度は比較的速いが、3以降、降下速度は非常に小さいので、私たちが探しているのは、この点に着く前とこの点からの降下、速度の変化が最も大きい点である.
    コード実装
    今回使用するデータセットの部分は、ショッピングモールのショッピング情報を反映しています.最後の列Spending Scoreは、ショッピングモールが顧客の情報に基づいて顧客の採点を行い、点数が低いほど顧客が使うお金が少ないことを意味し、高いほど顧客が使うことが多いと考えている.デパートは顧客の年収とショッピング指数をグループ化することを望んでいる.
    CustomerID
    Genre
    Age
    Annual Income (k$)
    Spending Score (1-100)
    0001
    Male
    19
    15
    39
    0002
    Male
    21
    15
    81
    0003
    Female
    20
    16
    6
    0004
    Female
    23
    16
    77
    では、この問題の引数は3、4列目、年収、ショッピング指数です.しかし、監視なし学習なので、変数はありません.ここで使う道具はsklearnです.clusterのKMeansクラス.
    まず各パケットのWCSSを計算する.ここではグループ数が1から10の場合を計算します.
    wcss = []
    for i in range(1, 11):
        kmeans = KMeans(n_clusters=i, max_iter=300, n_init=10, init='k-means++', random_state=0)
        kmeans.fit(X)
        wcss.append(kmeans.inertia_)
    plt.plot(range(1, 11), wcss)
    plt.title('The Elbow Method')
    plt.xlabel('Number of Clusters')
    plt.ylabel('WCSS')
    plt.show()

    ここでのKMeansのパラメータも説明すると、n_clustersはパケット数、max_を指すiterとは、計算ごとに最大のサイクル数を指し、ここではデフォルト値300,n_を用いるInitは,K平均アルゴリズムを行うごとに,どのようなグループの異なる中心値を計算するかを表す.Initというパラメータは非常に重要であり,初期値をどのように選択するかを指し,最も簡単なのはrandom,すなわちランダムであるが,ランダム初期値トラップに落ちるのを避けるためにk−means++を用いる.
    フィッティング後に得るグループ間距離はkmeansである.inertia_.これにより,異なるパケット数に対してwcssの画像を描くことができる.
    肘法則により最適なグループ数が5グループであればフィッティングデータを開始することができる.
    # Applying the k-means to the mall dataset
    kmeans = KMeans(n_clusters=5, max_iter=300, n_init=10, init='k-means++', random_state=0)
    y_kmeans = kmeans.fit_predict(X)

    データをフィッティングして得られたy_meansは実際には0-4の5つのグループです.グループ化した画像を描いてみましょう.
    # Visualizing the clusters
    plt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s=100, c='red', label='Careful')
    plt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s=100, c='blue', label='Standard')
    plt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s=100, c='green', label='Target')
    plt.scatter(X[y_kmeans == 3, 0], X[y_kmeans == 3, 1], s=100, c='cyan', label='Careless')
    plt.scatter(X[y_kmeans == 4, 0], X[y_kmeans == 4, 1], s=100, c='magenta', label='Sensible')
    plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='yellow', label='Centroids')
    plt.title('Clusters of clients')
    plt.xlabel('Annual Income (k$)')
    plt.ylabel('Spending Score (1-100)')
    plt.legend()
    plt.show()

    得られた画像は以下のように,画像に基づいて解析し,異なるラベルを与えることができる.
    以上,K-Meansクラスタリングアルゴリズムに関する基礎知識点である.