K-means 群集與向量量化 (scipy.cluster.vq
)#
提供 k-means 群集、從 k-means 模型產生碼書,以及透過將向量與碼書中的質心進行比較來量化向量的常式。
|
在每個特徵的基礎上正規化一組觀測值。 |
|
從碼書將代碼指派給觀測值。 |
|
對一組形成 k 個群集的觀測向量執行 k-means 演算法。 |
|
使用 k-means 演算法將一組觀測值分類到 k 個群集中。 |
背景資訊#
k-means 演算法將要產生的群集數量 k,以及要群集的一組觀測向量作為輸入。它會傳回一組質心,每個群集一個。觀測向量會根據最接近它的質心的群集編號或質心索引進行分類。
如果向量 v 比任何其他質心更接近質心 i,則向量 v 屬於群集 i。如果 v 屬於 i,我們說質心 i 是 v 的主導質心。k-means 演算法嘗試最小化失真,失真定義為每個觀測向量與其主導質心之間平方距離的總和。透過迭代地將觀測值重新分類到群集中並重新計算質心,直到達到質心穩定的配置來實現最小化。也可以定義最大迭代次數。
由於向量量化是 k-means 的自然應用,因此經常使用資訊理論術語。質心索引或群集索引也稱為「代碼」,而將代碼映射到質心以及反之亦然的表通常稱為「碼書」。k-means 的結果,即一組質心,可用於量化向量。量化的目的是找到一種向量編碼,以減少預期失真。
所有常式都預期 obs 為 M 乘 N 陣列,其中列是觀測向量。碼書是一個 k 乘 N 陣列,其中第 i 列是代碼字 i 的質心。觀測向量和質心具有相同的特徵維度。
舉例來說,假設我們希望在透過網路傳送 24 位元彩色影像(每個像素以一個位元組代表紅色、一個位元組代表藍色和一個位元組代表綠色)之前對其進行壓縮。透過使用較小的 8 位元編碼,我們可以將資料量減少三分之二。理想情況下,應該選擇每個 256 個可能的 8 位元編碼值的顏色,以盡量減少色彩失真。執行 k=256 的 k-means 會產生一個包含 256 個代碼的碼書,其中填滿了所有可能的 8 位元序列。與其為每個像素傳送 3 位元組的值,不如傳輸主導質心的 8 位元質心索引(或代碼字)。碼書也會透過網路傳送,以便每個 8 位元代碼都可以轉換回 24 位元像素值表示。如果感興趣的影像是海洋,我們預期許多 24 位元藍色會以 8 位元代碼表示。如果影像是人臉,則碼書中將表示更多膚色。