

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# K 平均數叢集的運作方式
<a name="algo-kmeans-tech-notes"></a>

K 平均數是一種演算法，會訓練模型將類似的物件分為同組。k 平均值演算法的做法是將輸入資料集的每個觀察項映射到 *n* 維空間中的一點 (*n* 為觀察的屬性數量)。舉例而言，您的資料集可能有對特定位置的溫度和濕度的觀察，其中的觀察即會對應至 2 維空間的點 (*t, h*)。



**注意**  
叢集演算法並未監督。在無監督學習情況下，標籤可能會與訓練資料集內未使用的物件建立關聯。如需詳細資訊，請參閱[非監督式學習](algorithms-choose.md#algorithms-choose-unsupervised-learning)。

在 K 平均數叢集中，各叢集都有一個中心。在模型訓練其間，K 平均數演算法建立叢集的基礎，是運用與資料集內的觀察相對應的點與叢集中心之間的距離。您選擇要建立的叢集數量 (*k*)。

舉例而言，假設您想要建立一個可辨識手寫數字的模型，而選擇以 MNIST 資料集來進行訓練。該資料集提供了數千張手寫數字 (0 到 9) 的影像。在此例中，您大概會選擇建立 10 個叢集，一個叢集代表一個數字 (0、1、…、9)。做為模型訓練的一環，K 平均數演算法會將輸入的圖片分為 10 個叢集。

MNIST 資料集中的每張圖片都是 28x28 像素的影像，共有 784 像素。每張圖片對應至 784 維空間中的一個點，類似於 2 維空間中的點 (x、y)。為了找出某個點所屬的叢集，K 平均數演算法會找出該點與所有叢集中心之間的距離。接下來便選擇最靠近的叢集中心所在的叢集做為該圖片所屬的叢集。

**注意**  
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` 字串。

以下概略介紹 K 平均數在 SageMaker AI 中進行模型訓練的方式：

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：決定初始的叢集中心
<a name="kmeans-step1"></a>

於 SageMaker AI 使用 K 平均數時，會從一小批次隨機採樣的觀察中，選出初始的叢集中心。需選擇以下其中一種策略，來判斷初始叢集中心的選擇方式：
+ 隨機方法——隨機選擇輸入資料集中的 *K* 觀察值做為叢集中心。舉例而言，您可能會選出一個指向 784 維空間的叢集中心，對應至 MNIST 訓練資料集內任 10 張圖片。
+ K 平均數\$1\$1 方式，運作模式如下：

  1. 先從一個叢集開始，指定其中心。您會從訓練資料集中隨機選取一個觀察項，使用對應至該觀察項的點做為叢集中心。比方在 MNIST 資料集中隨機選擇一張手寫數字的圖片。然後再選擇在 784 維空間內與該圖相對應的點做為叢集中心。這就是叢集中心 1。

  1. 決定叢集 2 的中心。此時再從訓練資料集內剩下的觀察中，隨機挑出一項觀察。所選的點必須與先前所遠的不同。這項觀察要對應到與叢集中心 1 距離遙遠的一點。以 MNIST 資料集為例，需執行下列動作：
     + 找出剩下的每張圖片所對應的點與叢集中心 1 之間的距離。將該距離乘以平方，並指定一個與距離平方成正比的概率。以此方式，與先前所選的不同的圖片，就會有比較高的構率被選為叢集中心 2。
     + 根據上一步所指定的概率，隨機選擇其中一個圖片。對應至該圖的點就是叢集中心 2。

  1. 重複步驟 2，再找出叢集中心 3。這時需找出剩餘圖片與叢集中心 2 之間的距離。

  1. 重複此程序，直到出現 *K* 個叢集中心為止。

若要在 SageMaker AI 中訓練模型，請建立訓練任務。在此請求中，需指定 `HyperParameters` 字串對應，來提供組態資訊：
+ 為了指定所要建立的叢集數量，請新增 `k` 字串。
+ 為了提高準確度，可選擇加入 `extra_center_factor` 字串。
+ 為了指定想要用來判斷初始叢集中心的策略，請加入 `init_method` 字串，並將其值設為 `random` 或 `k-means++`。

有關 SageMaker AI k 平均值估計器的詳細資訊，請參閱 [Amazon SageMaker Python SDK](https://sagemaker.readthedocs.io/en/stable) 文件中的 [K-平均值](https://sagemaker.readthedocs.io/en/stable/algorithms/unsupervised/kmeans.html)。

您現在已有一組初始的叢集中心。

## 步驟 2：逐一查看訓練資料集並計算叢集中心
<a name="kmeans-step2"></a>

前一步驟中建立的叢集中心大多為隨機產生，有針對訓練資料集略作考量。在此步驟中，要使用訓練資料集，將這些中心往真正得叢集中心移動。此演算法會逐一查看訓練資料集，並重新計算 *K* 個叢集中心。

1. 從訓練資料集中讀取微批次的觀察 (由所有記錄中隨機選取的少量子集)，並進行以下事項。
**注意**  
建立模型訓練工作時，要在 `mini_batch_size` 字串對應中的 `HyperParameters` 字串指定批次的大小。

   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* 平均數的詳細資訊，請參閱 [Web-Scale k-means Clustering](https://citeseerx.ist.psu.edu/document?repid=rep1type=pdf&doi=b452a856a3e3d4d37b1de837996aa6813bedfdcf))。

## 步驟 3：將叢集數量從 *K* 縮減至 *k*
<a name="kmeans-step3"></a>

若演算法建立了 *K* 個叢集 (*(K = k\$1x)* 其中 *x* 大於 1) 則會再將 *K* 個叢集縮減為 *k* 個叢集。(如需詳細資訊，請參閱上述討論中的 `extra_center_factor`。) 其做法是 Lloyd 方法加 `kmeans++` 初始化，套用到 *K* 個叢集中心。如需 Lloyd 方法的詳細資訊，請參閱 [k 平均值叢集化](https://pdfs.semanticscholar.org/0074/4cb7cc9ccbbcdadbd5ff2f2fee6358427271.pdf)。