
- SciPy 教程
- SciPy - 首頁
- SciPy - 簡介
- SciPy - 環境搭建
- SciPy - 基本功能
- SciPy - 聚類
- SciPy - 常量
- SciPy - FFTpack
- SciPy - Integrate
- SciPy - Interpolate
- SciPy - 輸入和輸出
- SciPy - Linalg
- SciPy - Ndimage
- SciPy - Optimize
- SciPy - Stats
- SciPy - CSGraph
- SciPy - Spatial
- SciPy - ODR
- SciPy - Special 包
- SciPy 有用資源
- SciPy - 參考
- SciPy - 快速指南
- SciPy - 有用資源
- SciPy - 討論
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表示聚類。