Anda di halaman 1dari 3

Di Python, kita dapat menyimpan daftar vektor dalam daftar numpy vektor N.

Jika kita menyebutnya

data daftar, kita dapat mengakses entri ITH (yang merupakan vektor) menggunakan data[0]. Untuk
menentukan

kluster atau keanggotaan grup, kita dapat menggunakan daftar tugas yang disebut pengelompokan, di
mana

pengelompokan[i] adalah jumlah grup tempat data vektor[i] ditetapkan. (Ini adalah

bilangan bulat antara 1 dan k.) (Dalam VMLS, bab 4, kami menjelaskan tugas menggunakan

vektor c atau subset Gj .) Kita dapat menyimpan perwakilan kluster k sebagai daftar Python yang disebut

sentroid, dengan centroids[j] perwakilan klaster jth. (Dalam VMLS kami jelaskan

perwakilan sebagai vektor z1, . . . .

Penugasan kelompok. Kami mendefinisikan fungsi untuk melakukan penetapan grup. Dengan diberikan

nilai awal centorids, kami menghitung jarak antara setiap sentroid dengan masing-masing

vektor dan tetapkan pengelompokan sesuai dengan jarak terkecil. Fungsi kemudian

mengembalikan vektor pengelompokan

In [ ]: def group_assignment(data,centroids): grouping_vec_c = np.zeros(len(data)) for i in


range(len(data)): dist = np.zeros(len(centroids)) for j in range(len(centroids)): dist[j] =
np.linalg.norm(data[i] - centroids[j]) min_dist = min(dist) for j in range(len(centroids)): if min_dist ==
dist[j]: grouping_vec_c[i] = j+1 return grouping_vec_c

. Clustering

Perbarui sentroid. Kami mendefinisikan fungsi untuk memperbarui sentroid setelah penetapan grup,
mengembalikan daftar sentroid grup baru.

In [ ]: def update_centroid(data, grouping, centroids): new_centroids = []; for i in range(len(centroids)):


cent = np.zeros(len(data[0])) count = 0 for j in range(len(data)): if grouping[j] == (i+1): cent = cent+data[j]
count += 1 group_average = cent/count new_centroids.append(group_average) return new_centroids

Tujuan pengelompokan. Mengingat penugasan grup dan sentroid dengan data, kami

dapat menghitung tujuan pengelompokan sebagai kuadrat dari nilai RMS dari vektor

Jarak.

In [ ]: def clustering_objective(data, grouping, centroids): J_obj = 0 for i in range(len(data)): for j in


range(len(centroids)): if grouping[i] == (j+1): J_obj += np.linalg.norm(data[i] - centroids[j])**2 J_obj =
J_obj/len(data) return J_obj
Algoritma k-means

Kita dapat mendefinisikan fungsi Kmeans_alg yang menggunakan tiga fungsi yang didefinisikan dalam

di atas subbagian secara berulang.

In [ ]: def Kmeans_alg(data, centroids): iteration = 0 J_obj_vector = [] Stop = False while Stop == False:
grouping = group_assignment(data, centroids)

new_centroids = update_centroid(data, grouping, centroids) J_obj = clustering_objective(data, grouping,


,→ new_centroids) J_obj_vector.append(J_obj) iteration += 1 if np.linalg.norm(np.array(new_centroids)
- ,→ np.array(centroids)) < 1e-6: Stop = True else: centroids = new_centroids return new_centroids,
grouping, J_obj_vector, iteration

Konvergensi. Di sini kita menggunakan beberapa saat loop, yang mengeksekusi pernyataan di dalam
loop

selama kondisi Stop == False adalah true. Kami mengakhiri algoritma ketika

peningkatan tujuan pengelompokan menjadi sangat kecil (1e-6).

Atau, kita dapat menggunakan fungsi Kmeans dalam modul kluster sklearn

Paket.

In [ ]: from sklearn.cluster import KMeans import numpy as np kmeans = KMeans(n_clusters=4,


random_state=0).fit(data) labels = kmeans.labels_ group_representative = kmeans.cluster_centers_
J_clust = kmeans.inertia_

Di sini kami mencoba menerapkan algoritma k-means pada data, mengelompokkan vektor ke
dalam 4 kelompok.
Perhatikan bahwa fungsi sklearn.cluster.KMeans menginisialisasi algoritma dengan acak
centroids dan dengan demikian nilai awal sentroid tidak diperlukan sebagai argumen tetapi
keadaan acak untuk menggambar inisialisasi acak adalah.
Contoh

Kami menerapkan algoritma pada set N = 300 poin yang dihasilkan secara acak, ditunjukkan dalam Gambar

4.1. Poin-poin ini dihasilkan sebagai berikut.

In [ ]: import matplotlib.pyplot as plt plt.ion()

Clustering X = np.concatenate([[0.3*np.random.randn(2) for i in range(100)], [[1,1] +


0.3*np.random.randn(2) for i in range(100)], [[1,-1] + 0.3* np.random.randn(2) for i in range(100)]])
,→ ,→ plt.scatter( X[:,0],X[:,1]) plt.xlim(-1.5,2.5) plt.ylim(-2,2) plt.show() 1.5 1.0 0.5 0.0 0.5 1.0 1.5 2.0 2.5
2.0 1.5 1.0 0.5 0.0 0.5 1.0 1.5 2.0 Figure 4.1.: 300 points in a plane.
Pada baris pertama, kami mengimpor paket matplotlib untuk plotting. Kemudian kami menghasilkan

tiga array vektor. Setiap set terdiri dari 100 vektor yang dipilih secara acak di sekitar satu

dari tiga poin (0,0),(1,1), dan (1,-1). Tiga array disaat menggunakan np.
concatenate() untuk mendapatkan array 300 poin. Selanjutnya, kita menerapkan fungsi KMeans dan

membuat angka dengan tiga kluster (Gambar 4.2).

In [ ]: from sklearn.cluster import KMeans import numpy as np kmeans = KMeans(n_clusters=3,


random_state=0).fit(X) labels = kmeans.labels_ group_representative = kmeans.cluster_centers_ J_clust
= kmeans.inertia_ grps = [[X[i,:] for i in range(300) if labels[i]==j] for j in ,→ range(3)]

plt.scatter([c[0] for c in grps[0]],[c[1] for c in grps[0]]) plt.scatter([c[0] for c in grps[1]],[c[1] for c in


grps[1]]) plt.scatter([c[0] for c in grps[2]],[c[1] for c in grps[2]]) plt.xlim(-1.5,2.5) plt.ylim(-2,2) plt.show()

Anda mungkin juga menyukai