Scipy簇聚
K均值聚類是一種在一組未標記數據中查找聚類和聚類中心的方法。 直覺上,我們可以將一個羣集(簇聚)看作 - 包含一組數據點,其點間距離與羣集外點的距離相比較小。 給定一個K中心的初始集合,K均值算法重複以下兩個步驟 -
- 對於每個中心,比其他中心更接近它的訓練點的子集(其聚類)被識別出來。
- 計算每個聚類中數據點的每個要素的平均值,並且此平均向量將成爲該聚類的新中心。
重複這兩個步驟,直到中心不再移動或分配不再改變。 然後,可以將新點x
分配給最接近的原型的羣集。 SciPy庫通過集羣包提供了K-Means算法的良好實現。 下面來了解如何使用它。
SciPy中實現K-Means
我們來看看並理解如何在SciPy中實現K-Means。
導入K-Means
下面來看看每個導入的函數的實現和用法。
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)))
現在,我們來看看生成的模擬數據,上述程序將生成以下輸出。
[[ 1.34103331 1.13924682 0.68465819]
[ 1.28481332 0.91318917 0.84225546]
[ 0.96498008 1.42382266 0.83564809]
[ 1.37049373 0.66635033 1.46568707]
[ 0.87424166 0.86090225 1.22545336]
[ 1.0264795 0.90724604 1.46837972]
[ 1.40996857 1.37769991 1.39805802]
[ 0.964556 0.71632157 1.47983347]
[ 0.69909637 1.21695335 1.46434369]
[ 1.01887602 0.86448455 1.02242951]
[ 0.82573176 1.19165063 1.09085707]
[ 0.64378227 0.70673944 0.69484097]
[ 1.16087103 0.64371977 0.89720984]
[ 1.23410673 0.56805382 1.33534058]
[ 0.50417695 1.29632466 0.96589447]
[ 0.91395183 1.39173555 1.0748435 ]
[ 1.04540644 1.20721464 0.97173727]
... ...
[ 0.79250839 0.48689797 0.42250824]
[ 0.05846914 0.83469742 0.57586067]
[ 0.0308333 0.8642561 0.1111777 ]
[ 0.61327069 0.43425013 0.99716439]
[ 0.81698148 0.91098877 0.12706862]
[ 0.60665992 0.55999208 0.57454962]
[ 0.13894142 0.03315365 0.43182983]
[ 0.62293781 0.34701877 0.61229591]]
根據每個要素標準化一組觀察值。 在運行K-Means之前,使用白化重新縮放觀察集的每個特徵維度是有好處的。 每個特徵除以所有觀測值的標準偏差以給出其單位差異。
美化數據
我們可使用以下代碼來美白數據。
# whitening of data
data = whiten(data)
print (data)
用三個集羣計算K均值
現在使用以下代碼計算三個羣集的K均值。
# computing K-Means with K = 3 (2 clusters)
centroids,_ = kmeans(data,3)
上述代碼對形成K個簇的一組觀測向量執行K均值。 K-Means算法調整質心直到不能獲得足夠的進展,即失真的變化,因爲最後一次迭代小於某個閾值。 在這裏,可以通過使用下面給出的代碼打印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
數組與centroids
進行比較,並將觀察值分配給最近的聚類。 它返回每個觀察和失真的聚類。 我們也可以檢查失真。使用下面的代碼檢查每個觀察的聚類。
# 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
表示簇。