KMeans adalah satu metode unsupervised learning pada machine learning. Metode ini menentukan jumlah cluster sesuai dengan jumlah k yang dipilih. Proses KMeans secara manual, dapat dilihat pada tautan berikut,
Pada modul jobsheet ini, kita akan langsung mempraktikkan pembuatan model KMeans dengan menggunakan python. Untuk modul pertama ini, kita akan menggunakan contoh kasus yang sederhana, yaitu dengan menggunakan dataset iris. Sedangkan untuk modul kedua, kita akan melakukan clustering dengan lebih advance, yaitu reduksi warna dengan data gambar
// Persiapan dataimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom sklearn.cluster import KMeansdf = pd.read_csv('Iris.csv')df.head()
# Plot Data# Karena data 4 dimensi, maka akan kita coba# plot cluster berdasarkan Sepal Length dan Sepal Width sajaplt.scatter(X.iloc[:, 0], X.iloc[:, 1], s =100)
Maka akan muncul tampilan seperti dibawah ini
<matplotlib.collections.PathCollection at 0x7b277bf5d5d0>
# Buat Model KMeans# Kali ini kita coba menggunakan k=2 - anggap saja kita tidak tahu jumlah label ada 3 :)from sklearn.cluster import KMeans# Inisiasi obyek KMeanscl_kmeans =KMeans(n_clusters=2)# Fit dan predict modely_kmeans = cl_kmeans.fit_predict(X)
# Plot hasi cluster berdasarkan Sepal Length dan Sepal Widthplt.scatter(X.iloc[:, 0], X.iloc[:, 1], s =100, c=y_kmeans)# Plot centroidcenters = cl_kmeans.cluster_centers_plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.5)
Nanti akan muncul tampilan seperti dibawah ini
# Cek Nilai SSEprint(f'Nilai SSE: {cl_kmeans.inertia_}')
Nilai SSE: 152.36870647733906
# Implementasi Metode Elbow# List nilai SSEsse = []# Cari k terbaik dari 1-10K =range(1,10)# Cek nilai SSE setiap kfor k in K: kmeanModel =KMeans(n_clusters=k) kmeanModel.fit(X) sse.append(kmeanModel.inertia_)# Plotting the distortionsplt.figure(figsize=(8,4))plt.plot(K, sse, "bx-")plt.xlabel("k")plt.ylabel("SSE")plt.title("Metode Elbow untuk Mengetahui Jumlah k Terbaik")plt.show()```
Nanti akan muncul tampilan seperti dibawah ini
# Cek Nilai SSE setiap kfor idx, sse_val inenumerate(sse, start=1):print(f'k={idx}; SSE={sse_val}')