

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# K-Means クラスタリングの仕組み
仕組み

K-means は、類似するオブジェクトをグループ化するモデルをトレーニングするアルゴリズムです。k-means アルゴリズムは、入力データセットの各観測値を *n* 次元空間 (*n* は観測値の属性の数) 内のポイントにマッピングすることでこれを実現します。たとえば、データセットには、2 次元空間のポイント (*t, h*) にマップされる特定の場所の温度と湿度の観測値が含まれている場合があります。



**注記**  
クラスタリングアルゴリズムは教師なしです。教師なしの学習では、トレーニングデータセット内のオブジェクトに関連付けられている可能性のあるラベルは使用されません。詳細については、「[教師なし学習](algorithms-choose.md#algorithms-choose-unsupervised-learning)」を参照してください。

k-means クラスタリングでは、各クラスターに中心があります。モデルトレーニング時に、k-means アルゴリズムは、データセット内の各観測値に対応するポイントからクラスター中心までの距離をクラスタリングの基準として使用します。作成するクラスターの数 (*k*) を選択します。

たとえば、手書き数字を認識するモデルを作成し、トレーニングに MNIST データセットを選択するとします。データセットでは、何千もの手書き数字 (0 ～ 9) のイメージが提供されます。この例では、数字ごとに 1 つずつ (0、1、...、9)、10 個のクラスターを作成することを選択できます。モデルトレーニングの一環として、k-means アルゴリズムは入力イメージを 10 個のクラスターにグループ化します。

MNIST データセット内の各イメージは 28x28 ピクセルのイメージで、合計 784 ピクセルです。各イメージは、2 次元空間 (x,y) のポイントと同様に 784 次元空間のポイントに対応します。ポイントが属するクラスターを見つけるために、k-means はすべてのクラスター中心からそのポイントまでの距離を調べます。次に、最も近い中心を持つクラスターをイメージが属するクラスターとして選択します。

**注記**  
Amazon SageMaker AI は、カスタマイズされたバージョンのアルゴリズムを使用します。この場合、アルゴリズムで *k* クラスターを作成することを指定する代わりに、追加のクラスター中心 *(K = k\$1x)* を指定することでモデルの精度を向上させることを選択できます。ただし、アルゴリズムは最終的にこれらを *k* クラスターまで減らします。

SageMaker AI では、トレーニングジョブの作成時にクラスターの数を指定します。詳細については、「[https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html)」を参照してください。リクエストボディに、`HyperParameters` 文字列マップを追加して、`k` および `extra_center_factor` 文字列を指定します。

以下は、SageMaker AI でのモデルトレーニングに関する k-means の仕組みの概要です。

1. 初期の *K* クラスター中心を決定します。
**注記**  
次のトピックでは、*K* クラスターは *k \$1 x* を表します。*k* と *x* はモデルトレーニングジョブの作成時に指定します。

1. これを入力トレーニングデータに対して反復処理し、クラスター中心が再計算されます。

1. 結果のクラスターは *k* まで減少します (データサイエンティストがリクエストで *k\$1x* クラスターの作成を指定した場合)。

以下のセクションでは、データサイエンティストがモデルトレーニングジョブを `HyperParameters` 文字列マップの一部として設定するために指定できるいくつかのパラメータについても説明します。

**Topics**
+ [

## ステップ 1: 初期のクラスター中心を決定する
](#kmeans-step1)
+ [

## ステップ 2: トレーニングデータセットに対して反復処理し、クラスター中心を計算する
](#kmeans-step2)
+ [

## ステップ 3: クラスターを *K* から *k* に減らす
](#kmeans-step3)

## ステップ 1: 初期のクラスター中心を決定する


SageMaker AI で k-means を使用する場合、初期のクラスター中心はランダムにサンプリングされた小さなバッチの観測値から選択されます。次のいずれかの戦略を選択して、これらの初期のクラスター中心が選択される方法を決定します。
+ ランダムなアプローチ - 入力データセット内の *K* 個の観測値をクラスターの中心としてランダムに選択します。たとえば、MNIST トレーニングデータセット内の任意の 10 個のイメージに対応する 784 次元空間を指すクラスター中心を選択できます。
+ 次のように動作する k-means\$1\$1 アプローチ: 

  1. 1 つのクラスターから開始し、その中心を決定します。トレーニングデータセットから観測値をランダムに選択し、観測値に対応するポイントをクラスター中心として使用します。たとえば、MNIST データセット内で手書き数字のイメージをランダムに選択します。次に、イメージに対応する 784 次元空間のポイントをクラスター中心として選択します。これはクラスター中心 1 です。

  1. クラスター 2 の中心を決定します。トレーニングデータセット内の残りの観測値から、観測値をランダムに選択します。以前に選択したものとは異なる観測値を 1 つ選択します。この観測値は、クラスター中心 1 から遠く離れているポイントに対応します。MNIST データセットを例として使用して、次の操作を行います。
     + 残りの各イメージについて、クラスター中心 1 からの対応するポイントの距離を調べます。距離を 2 乗し、距離の 2 乗に比例する確率を割り当てます。この方法では、以前に選択したものとは異なるイメージの方が、クラスター中心 2 として選択される確率が高くなります。
     + 前のステップで割り当てられた確率に基づいて、イメージの 1 つをランダムに選択します。イメージに対応するポイントがクラスター中心 2 です。

  1. ステップ 2 を繰り返してクラスター中心 3 を探します。今回は、クラスター中心 2 からの残りのイメージの距離を調べます。

  1. *K* クラスターの中心が求められるまでプロセスを繰り返します。

SageMaker AI でモデルをトレーニングするには、トレーニングジョブを作成します。リクエストでは、次の `HyperParameters` 文字列マップを指定することで設定情報を提供します。
+ 作成するクラスターの数を指定するには、`k` 文字列を追加します。
+ 精度を向上させるために、オプションの `extra_center_factor` 文字列を追加します。
+ 初期のクラスター中心を決定するために使用する戦略を指定するには、`init_method` 文字列を追加し、その値を `random` または `k-means++` に設定します。

SageMaker AI k means 推定の詳細については、[Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable)ドキュメントの「[K-means](https://sagemaker.readthedocs.io/en/stable/algorithms/unsupervised/kmeans.html)」を参照してください。

これで、初期の一連のクラスター中心を入手しました。

## ステップ 2: トレーニングデータセットに対して反復処理し、クラスター中心を計算する


前のステップで作成したクラスター中心はほぼランダムであり、トレーニングデータセットに関する考慮事項がいくつかあります。このステップでは、トレーニングデータセットを使用して、これらの中心を真のクラスター中心に向かって移動します。アルゴリズムは、トレーニングデータセットに対して反復処理し、*K* クラスターの中心を再計算します。

1. 観測値のミニバッチ (すべてのレコードからランダムに選択された小さなサブセット) をトレーニングデータセットから読み取り、次の操作を行います。
**注記**  
モデルトレーニングジョブの作成時に、`mini_batch_size` 文字列マップ内の `HyperParameters` 文字列でバッチサイズを指定します。

   1. ミニバッチ内のすべての観測値を、最も近いクラスター中心を持つクラスターの 1 つに割り当てます。

   1. 各クラスターに割り当てられた観測値の数を計算します。次に、クラスターごとに割り当てられた新しいポイントの比率を計算します。

      たとえば、次のクラスターを考えてみます。

      クラスター c1 = 以前に 100 ポイントが割り当てられています。このステップでミニバッチから 25 ポイントを追加しました。

      クラスター c2 = 以前に 150 ポイントが割り当てられています。このステップでミニバッチから 40 ポイントを追加しました。

      クラスター c3 = 以前に 450 ポイントが割り当てられています。このステップでミニバッチから 5 ポイントを追加しました。

      次のように、各クラスターに割り当てられた新しいポイントの比率を計算します。

      ```
      p1 = proportion of points assigned to c1 = 25/(100+25)
      p2 = proportion of points assigned to c2 = 40/(150+40)
      p3 = proportion of points assigned to c3 = 5/(450+5)
      ```

   1. 各クラスターに追加された新しいポイントの中心を計算します。

      ```
      d1 = center of the new points added to cluster 1
      d2 = center of the new points added to cluster 2
      d3 = center of the new points added to cluster 3
      ```

   1. 次のように、加重平均を計算して、更新されたクラスター中心を調べます。

      ```
      Center of cluster 1 = ((1 - p1) * center of cluster 1) + (p1 * d1)
      Center of cluster 2 = ((1 - p2) * center of cluster 2) + (p2 * d2)
      Center of cluster 3 = ((1 - p3) * center of cluster 3) + (p3 * d3)
      ```

1. 次のミニバッチを読み取り、ステップ 1 を繰り返して、クラスター中心を再計算します。

1. ミニバッチ k-means の詳細については、「[Web-Scale k-means Clustering](https://citeseerx.ist.psu.edu/document?repid=rep1type=pdf&doi=b452a856a3e3d4d37b1de837996aa6813bedfdcf)」を参照してください。

## ステップ 3: クラスターを *K* から *k* に減らす


アルゴリズムによって *K* クラスターが作成された場合 (*(K = k\$1x)* で、*x* は 1 より大きい)、*K* クラスターが *k* クラスターに減らされます。(詳細については、前の説明の「`extra_center_factor`」を参照してください。) これは、Lloyd 法と `kmeans++` の初期化を *K* クラスターの中心に適用することで行います。Lloyd 法の詳細については、[k-means clustering](https://pdfs.semanticscholar.org/0074/4cb7cc9ccbbcdadbd5ff2f2fee6358427271.pdf) を参照してください。