SciPy - 聚類



K均值聚類是一種用於在未標記資料集中查詢聚類和聚類中心的方法。直觀地,我們可以將聚類理解為——包含一組資料點,這些資料點之間的距離相對於該聚類外部點的距離來說較小。給定一組初始的K箇中心,K均值演算法迭代執行以下兩個步驟:

  • 對於每個中心,識別出訓練點(其聚類)的子集,該子集比任何其他中心更靠近它。

  • 計算每個聚類中資料點每個特徵的均值,並且該均值向量成為該聚類的新的中心。

這兩個步驟被迭代執行,直到中心不再移動或分配不再改變。然後,一個新的點x可以被分配到最接近原型的聚類。SciPy庫透過cluster包提供了K均值演算法的一個很好的實現。讓我們瞭解如何使用它。

SciPy中的K均值實現

我們將瞭解如何在SciPy中實現K均值。

匯入K均值

我們將看到每個匯入函式的實現和用法。

from SciPy.cluster.vq import kmeans,vq,whiten

資料生成

我們必須模擬一些資料來探索聚類。

from numpy import vstack,array
from numpy.random import rand

# data generation with three features
data = vstack((rand(100,3) + array([.5,.5,.5]),rand(100,3)))

現在,我們必須檢查資料。上述程式將生成以下輸出。

array([[ 1.48598868e+00, 8.17445796e-01, 1.00834051e+00],
       [ 8.45299768e-01, 1.35450732e+00, 8.66323621e-01],
       [ 1.27725864e+00, 1.00622682e+00, 8.43735610e-01],
       …………….

基於每個特徵對一組觀測值進行歸一化。在執行K均值之前,最好透過白化重新縮放觀測集的每個特徵維度。每個特徵除以其在所有觀測值上的標準差,以使其具有單位方差。

對資料進行白化

我們必須使用以下程式碼對資料進行白化。

# whitening of data
data = whiten(data)

使用三個聚類計算K均值

現在讓我們使用以下程式碼使用三個聚類計算K均值。

# computing K-Means with K = 3 (2 clusters)
centroids,_ = kmeans(data,3)

上述程式碼對形成K個聚類的一組觀測向量執行K均值。K均值演算法調整質心,直到無法取得足夠的進展,即自上次迭代以來的失真變化小於某個閾值。在這裡,我們可以透過使用下面給出的程式碼列印centroids變數來觀察聚類的質心。

print(centroids)

上述程式碼將生成以下輸出。

print(centroids)[ [ 2.26034702  1.43924335  1.3697022 ]
                  [ 2.63788572  2.81446462  2.85163854]
                  [ 0.73507256  1.30801855  1.44477558] ]

使用下面給出的程式碼將每個值分配到一個聚類。

# assign each sample to a cluster
clx,_ = vq(data,centroids)

vq函式將'M'乘以'N'的obs陣列中的每個觀測向量與質心進行比較,並將觀測值分配到最接近的聚類。它返回每個觀測值的聚類和失真。我們也可以檢查失真。讓我們使用以下程式碼檢查每個觀測值的聚類。

# check clusters of observation
print clx

上述程式碼將生成以下輸出。

array([1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 2, 0, 2, 0, 1, 1, 1,
0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0,
0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,
0, 1,  0, 0, 0, 0, 1, 0, 0, 1, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 0, 0,
2, 2, 2, 1, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], dtype=int32)

上述陣列的不同值0、1、2表示聚類。

廣告