

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

# K 平均數演算法
<a name="k-means"></a>

K 平均數是無監督學習演算法。其會試圖找出資料內分散的群組，盡可能讓群組成員彼此相似，而進能可和其他群組內的成員有所差異。您需定義演算法要用來判定相似度的屬性。

Amazon SageMaker AI 使用的是 Web 規模的 K 平均數叢集演算法的修改版本。與此演算法的原始版本相較之下，Amazon SageMaker AI 所用的版本更加準確。與原始演算法相同，其可擴充配合大量的資料集，在訓練時間上獲得改善。為了辦到這點，Amazon SageMaker AI 所用的版本會以微批次串流訓練資料 (小型隨機的子集)。如需微批次 k 平均值的詳細資訊，請參閱 [Web 規模的 k 平均值叢集](https://dl.acm.org/doi/10.1145/1772690.1772862)。

K 平均數演算法預期的是表格化的資料，資料列代表的是您想要建立叢集的觀察，而資料行是觀察的屬性。各資料列的 *n* 屬性代表的是 *n* 維空間內的一點。點與點之間的歐幾里德距離代表了相對應的觀察之間的相似度。此演算法會以類似的屬性值將觀察分組 (對應至這些觀察的點彼此間距離較近)。如需 k 平均值如何在 Amazon SageMaker AI 中運作的詳細資訊，請參閱[K 平均數叢集的運作方式](algo-kmeans-tech-notes.md)。

**Topics**
+ [K 平均值演算法的輸入/輸出介面](#km-inputoutput)
+ [適用於 K 平均值演算法的 EC2 執行個體建議](#km-instances)
+ [K 平均值範例筆記本](#kmeans-sample-notebooks)
+ [K 平均數叢集的運作方式](algo-kmeans-tech-notes.md)
+ [K 平均數超參數](k-means-api-config.md)
+ [調校 K 平均值模型](k-means-tuning.md)
+ [K 平均值回應格式](km-in-formats.md)

## K 平均值演算法的輸入/輸出介面
<a name="km-inputoutput"></a>

針對訓練，k 平均值演算法預期以*訓練*通道提供資料 (建議使用 `S3DataDistributionType=ShardedByS3Key`)，以選用的*測試*通道 (建議使用 `S3DataDistributionType=FullyReplicated`) 評分資料。訓練支援 `recordIO-wrapped-protobuf` 和 `CSV` 兩種格式。您可以使用檔案模式或管道模式，以 `recordIO-wrapped-protobuf` 或 `CSV` 格式的資料來訓練模型。

針對推論，支援 `text/csv`、`application/json` 和 `application/x-recordio-protobuf`。k 平均值會針對每個觀察項傳回一個 `closest_cluster` 標籤和 `distance_to_cluster`。

如需輸入和輸出檔案格式的詳細資訊，請參閱適用於推論的[K 平均值回應格式](km-in-formats.md)以及[K 平均值範例筆記本](#kmeans-sample-notebooks)。K 平均值演算法不支援多執行個體學習，其中訓練集由標籤為 “包” 組成，每個包都是未標籤執行個體的集合。

## 適用於 K 平均值演算法的 EC2 執行個體建議
<a name="km-instances"></a>

建議在 CPU 執行個體上訓練 K 平均數。您可以在 GPU 執行個體上進行訓練，但應將 GPU 訓練限制於單一 GPU 執行個體 (例如 ml.g4dn.xlarge)，因為每個執行個體只會使用一個 GPU。K 平均數演算法可支援 P2、P3、G4dn 和 G5 執行個體，進行訓練和推論。

## K 平均值範例筆記本
<a name="kmeans-sample-notebooks"></a>

如需依使用原則元件分析找到的屬性，使用 SageMaker AI K 平均數演算法區隔美國各郡人口的範例筆記本，請參閱[使用 Amazon SageMaker AI 分析美國人口普查資料以進行人口細分](https://sagemaker-examples.readthedocs.io/en/latest/introduction_to_applying_machine_learning/US-census_population_segmentation_PCA_Kmeans/sagemaker-countycensusclustering.html)。如需如何建立並存取 Jupyter 筆記本執行個體以用來執行 SageMaker AI 中範例的指示，請參閱[Amazon SageMaker 筆記本執行個體](nbi.md)。在建立並開啟筆記本執行個體後，請選取 **SageMaker AI 範例**索引標籤以查看所有 SageMaker AI 範例的清單。若要開啟筆記本，請按一下其**使用**標籤，然後選取**建立複本**。

# 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)。

# K 平均數超參數
<a name="k-means-api-config"></a>

在 [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html) 請求中，請指定您想要使用的訓練演算法。您也可以指定演算法特定的超參數做為字串對字串的對應。下表為 Amazon SageMaker AI 所提供的 K 平均數訓練演算法的超參數。如需 K 平均數如何建立叢集的詳細資訊，請參閱[K 平均數叢集的運作方式](algo-kmeans-tech-notes.md)。


| 參數名稱 | Description | 
| --- | --- | 
| feature\$1dim | 輸入資料中的特徵數量。 **必要** 有效值：正整數  | 
| k |  所需叢集的數目。 **必要** 有效值：正整數  | 
| epochs | 經由訓練資料傳遞完成的次數。 **選用** 有效值：正整數 預設值：1  | 
| eval\$1metrics | 用於報告模型分數的指標類型 JSON 清單。允許的值為用於均方偏差的 `msd` 和用於平方距離總和的 `ssd`。如果提供測試資料，則針對每個請求的指標回報分數。 **選用** 有效值：`[\"msd\"]` 或 `[\"ssd\"]` 或 `[\"msd\",\"ssd\"]`。 預設值：`[\"msd\"]`  | 
| extra\$1center\$1factor | 此演算法會在執行時建立 K 個中心 = `num_clusters` \$1 `extra_center_factor`，並在完成模型時將中心的數量從 K 縮減至 `k`。 **選用** 有效值：正整數或 `auto`。 預設值：`auto`  | 
| half\$1life\$1time\$1size | 在計算叢集平均值時用以判斷提供給觀察項的權重。此權重也會隨著觀察到更多點，呈指數衰減。當首先觀察到點時，它會在計算叢集平均值時獲指派權數 1。針對指數衰減函式選擇衰減不變，以便在觀察 `half_life_time_size` 個點後，其權重為 1/2。若設為 0，則不會衰減。 **選用** 有效值：非負整數 預設值：0  | 
| init\$1method | 演算法選擇初始叢集中心的方法。標準 k 平均值方法會隨機選擇它們。其他 k 平均值\$1\$1 方法隨機選擇第一個叢集中心。然後，依與現有中心剩餘資料點的距離平方呈成比的機率分布，按比例選取中心，散布剩餘初始叢集的位置。 **選用** 有效值：`random` 或 `kmeans++`。 預設值：`random`  | 
| local\$1lloyd\$1init\$1method | 用來建置包含 `k` 個中心之最終模型的 Lloyd 最大期望 (EM) 程序初始化方法。 **選用** 有效值：`random` 或 `kmeans++`。 預設值：`kmeans++`  | 
| local\$1lloyd\$1max\$1iter | 用來建置包含 `k` 個中心之最終模型的 Lloyd 最大期望 (EM) 程序疊代運算次數上限。 **選用** 有效值：正整數 預設值：300  | 
| local\$1lloyd\$1num\$1trials | 損失最少之 Lloyd 最大期望 (EM) 程序的次數，是在建置包含 `k` 個中心的最終模型時執行。 **選用** 有效值：正整數或 `auto`。 預設值：`auto`  | 
| local\$1lloyd\$1tol | 用來建置包含 `k` 個中心之最終模型以提早停止 Lloyd 最大期望 (EM) 程序的損失變更容錯能力。 **選用** 有效值：浮點數。範圍在 [0, 1] 之間。 預設值：0.0001  | 
| mini\$1batch\$1size | 資料反覆運算器每個微型批次的觀察項數量。 **選用** 有效值：正整數 預設值：5000  | 

# 調校 K 平均值模型
<a name="k-means-tuning"></a>

*自動模型調校*，又稱為超參數調校，會透過在您的資料集上，執行許多測試超參數範圍的任務，來尋找最佳版本的模型。您可以選擇可調校的超參數、每一個超參數的值範圍，及目標指標。您可以從演算法運算的指標中選擇目標指標。自動模型調校會搜尋所選擇的超參數，以找出產生之模型可最佳化目標指標的值組合。

Amazon SageMaker AI K 平均數演算法是一種無監督演算法，可將資料分組為成員盡可能類似的叢集。因為無監督，所以不使用可使用超參數最佳化的驗證資料集。但會採用測試資料集，根據資料點和每次訓練執行結束時之最終叢集質量中心間的距離平方發出指標。若要尋找報告測試資料集中最緊密叢集的模型，您可以使用超參數調校任務。叢集會最佳化其成員的相似度。

如需模型調校的詳細資訊，請參閱[使用 SageMaker AI 執行自動模型調校](automatic-model-tuning.md)。

## 依 K 平均值演算法計算的指標
<a name="km-metrics"></a>

k 平均值演算法會在訓練期間計算下列指標。調校模型時，請選擇這些指標的其中之一做為目標指標。


| 指標名稱 | Description | 最佳化方向 | 
| --- | --- | --- | 
| test:msd | 測試集中每個記錄之間的均方距離和最近的模型中心。 | 最小化 | 
| test:ssd | 測試集中每個記錄之間的距離平方和及最近的模型中心。 | 最小化 | 



## 可調校 K 平均值超參數
<a name="km-tunable-hyperparameters"></a>

使用下列超參數調校 Amazon SageMaker AI k 平均值模型。對 k 平均值目標指標影響最大的超參數為：`mini_batch_size`、`extra_center_factor` 和 `init_method`。調校超參數 `epochs` 通常會得到細微的改進結果。


| 參數名稱 | 參數類型 | 建議範圍 | 
| --- | --- | --- | 
| epochs | IntegerParameterRanges | MinValue：1、MaxValue：10 | 
| extra\$1center\$1factor | IntegerParameterRanges | MinValue：4、MaxValue：10 | 
| init\$1method | CategoricalParameterRanges | ['kmeans\$1\$1', 'random'] | 
| mini\$1batch\$1size | IntegerParameterRanges | MinValue：3000、MaxValue：15000 | 

# K 平均值回應格式
<a name="km-in-formats"></a>

所有 SageMaker AI 內建的演算法，皆採用[常見的資料格式 - 推論](https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-inference.html)中所述之常見輸入推論格式。此主題包含 SageMaker AI K 平均數演算法的可用輸出格式清單。

## JSON 回應格式
<a name="km-json"></a>

```
{
    "predictions": [
        {
            "closest_cluster": 1.0,
            "distance_to_cluster": 3.0,
        },
        {
            "closest_cluster": 2.0,
            "distance_to_cluster": 5.0,
        },

        ....
    ]
}
```

## JSONLINES 回應格式
<a name="km-jsonlines"></a>

```
{"closest_cluster": 1.0, "distance_to_cluster": 3.0}
{"closest_cluster": 2.0, "distance_to_cluster": 5.0}
```

## RECORDIO 回應格式
<a name="km-recordio"></a>

```
[
    Record = {
        features = {},
        label = {
            'closest_cluster': {
                keys: [],
                values: [1.0, 2.0]  # float32
            },
            'distance_to_cluster': {
                keys: [],
                values: [3.0, 5.0]  # float32
            },
        }
    }
]
```

## CSV 回應格式
<a name="km-csv"></a>

每行中的第一個值對應至 `closest_cluster`。

每行中的第二個值對應至 `distance_to_cluster`。

```
1.0,3.0
2.0,5.0
```