SciPy - Cluster

K-means clusteringadalah metode untuk menemukan cluster dan pusat cluster dalam sekumpulan data yang tidak berlabel. Secara intuitif, kita mungkin menganggap cluster sebagai - terdiri dari sekelompok titik data, yang jarak antar titiknya kecil dibandingkan dengan jarak ke titik di luar cluster. Diberikan set awal pusat K, algoritma K-means mengulangi dua langkah berikut -

  • Untuk setiap pusat, subset titik pelatihan (klasternya) yang lebih dekat dengannya diidentifikasi daripada pusat lainnya.

  • Rata-rata setiap fitur untuk titik data di setiap cluster dihitung, dan vektor rata-rata ini menjadi pusat baru untuk cluster tersebut.

Kedua langkah ini diulang sampai pusat tidak lagi bergerak atau tugas tidak lagi berubah. Lalu, poin baruxdapat ditugaskan ke cluster prototipe terdekat. Library SciPy menyediakan implementasi yang baik dari algoritme K-Means melalui paket cluster. Mari kita pahami bagaimana cara menggunakannya.

Implementasi K-Means di SciPy

Kami akan memahami bagaimana menerapkan K-Means di SciPy.

Impor K-Means

Kami akan melihat implementasi dan penggunaan setiap fungsi yang diimpor.

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

Pembuatan data

Kami harus mensimulasikan beberapa data untuk mengeksplorasi clustering.

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

Sekarang, kami harus memeriksa data. Program di atas akan menghasilkan keluaran sebagai berikut.

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],
       …………….

Normalisasi grup observasi pada setiap fitur dasar. Sebelum menjalankan K-Means, ada baiknya untuk mengubah skala setiap dimensi fitur set pengamatan dengan pemutihan. Setiap fitur dibagi dengan deviasi standarnya di semua pengamatan untuk memberikan varian satuan.

Memutihkan data

Kami harus menggunakan kode berikut untuk memutihkan data.

# whitening of data
data = whiten(data)

Hitung K-Means dengan Tiga Cluster

Mari kita sekarang menghitung K-Means dengan tiga cluster menggunakan kode berikut.

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

Kode di atas menjalankan K-Means pada satu set vektor observasi yang membentuk kluster K. Algoritma K-Means menyesuaikan sentroid sampai kemajuan yang memadai tidak dapat dibuat, yaitu perubahan dalam distorsi, karena iterasi terakhir kurang dari beberapa ambang batas. Di sini, kita dapat mengamati centroid cluster dengan mencetak variabel centroid menggunakan kode yang diberikan di bawah ini.

print(centroids)

Kode di atas akan menghasilkan keluaran sebagai berikut.

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

Tetapkan setiap nilai ke cluster dengan menggunakan kode yang diberikan di bawah ini.

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

Itu vq fungsi membandingkan setiap vektor pengamatan di 'M' dengan 'N' obsarray dengan centroids dan menetapkan observasi ke cluster terdekat. Ini mengembalikan cluster dari setiap observasi dan distorsi. Kami juga dapat memeriksa distorsi. Mari kita periksa cluster masing-masing observasi menggunakan kode berikut.

# check clusters of observation
print clx

Kode di atas akan menghasilkan keluaran sebagai berikut.

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)

Nilai berbeda 0, 1, 2 dari larik di atas menunjukkan cluster.