Anda di halaman 1dari 7

#Tugas Python Clustering

#Nama : I Made Putra Dipanala


#NIM : 2205551147
#Kelas : Aljabar Linear F

#Group assignment adalah proses dalam algoritma K-means di mana setiap


data dipetakan ke kelompok yang sesuai berdasarkan jarak terdekat
dengan centroid.
#Pada setiap iterasi, jarak antara setiap data dengan setiap centroid
kelompok dihitung menggunakan metrik jarak, seperti norma Euclidean.
#Data kemudian ditempatkan ke kelompok yang memiliki jarak terdekat
yang paling kecil dengan data tersebut.

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
#Fungsi group_assignment digunakan untuk memetakan setiap data ke
kelompok yang sesuai berdasarkan jarak terdekat dengan centroid.
#Fungsi ini menerima dua parameter, yaitu data dan posisi centroid
kelompok. Pada setiap iterasi, untuk setiap data, dilakukan
perhitungan jarak antara data tersebut dengan setiap centroid kelompok
menggunakan norma Euclidean.
#Jarak-jarak ini disimpan dalam array dist. Setelah itu, jarak
terdekat yang paling kecil diidentifikasi menggunakan fungsi min().
#Selanjutnya, pemetaan data dilakukan dengan mengassign nomor kelompok
(j+1) ke elemen grouping_vec_c berdasarkan indeks kelompok yang
memiliki jarak terdekat.
#Fungsi ini mengembalikan array grouping_vec_c yang berisi nomor
kelompok yang telah dipetakan untuk setiap data.

#Update centroid adalah proses dalam algoritma K-means yang digunakan


untuk memperbarui posisi centroid setiap kelompok berdasarkan pemetaan
data ke kelompok-kelompok yang ada.
#Pada setiap iterasi, setelah melakukan pemetaan data ke kelompok-
kelompok yang sesuai, posisi centroid setiap kelompok dihitung ulang
dengan cara mengambil rata-rata dari seluruh data yang termasuk dalam
kelompok tersebut.

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
#Fungsi update_centroid digunakan untuk menghitung posisi baru dari
centroid kelompok berdasarkan pemetaan data ke kelompok-kelompok yang
ada.
#Fungsi ini menerima tiga parameter, yaitu data, pemetaan kelompok
(grouping), dan posisi centroid kelompok saat ini.
#Pada setiap iterasi, fungsi ini melakukan perhitungan rata-rata dari
data yang termasuk dalam setiap kelompok.
#Untuk setiap kelompok, fungsi ini menjumlahkan semua vektor data yang
termasuk dalam kelompok tersebut dan kemudian membaginya dengan jumlah
data dalam kelompok tersebut untuk mendapatkan rata-rata.
#Hasil rata-rata ini kemudian digunakan sebagai posisi baru untuk
centroid kelompok tersebut.
#Fungsi ini mengembalikan array baru yang berisi posisi centroid
kelompok yang telah diperbarui.

#Clustering objective, atau tujuan clustering, adalah sebuah metrik


atau nilai yang digunakan untuk mengukur sejauh mana data dalam setiap
kelompok (cluster) mendekati atau sesuai dengan centroid kelompoknya.
#Dalam algoritma K-means, objective function sering diukur dengan
menghitung jumlah kuadrat jarak antara setiap data dengan centroid
kelompoknya.
#Tujuan utama dari objective function adalah untuk meminimalkan
variasi atau dispersi data dalam setiap kelompok, sehingga kelompok-
kelompok tersebut menjadi semakin homogen atau serupa satu sama lain.

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

#Fungsi clustering_objective digunakan untuk menghitung nilai


objective function dari hasil clustering dengan menggunakan metode K-
means.
#Fungsi ini menerima tiga parameter, yaitu data yang telah
dikelompokkan, pemetaan kelompok (grouping), dan posisi centroid
kelompok. Pada setiap iterasi, fungsi ini menjumlahkan kuadrat jarak
antara setiap data dengan centroid kelompoknya, kemudian membagi hasil
penjumlahan tersebut dengan jumlah data untuk mendapatkan nilai rata-
rata.
#Tujuan dari fungsi ini adalah untuk mengukur sejauh mana data dalam
kelompok berdekatan dengan centroidnya, dan semakin kecil nilai
objective function, semakin baik kualitas clustering yang dihasilkan.

#K-means adalah algoritma clustering yang digunakan untuk


mengelompokkan data ke dalam beberapa kelompok berdasarkan kemiripan
antara data tersebut.
#Algoritma ini bekerja dengan cara menginisialisasi centroid awal
secara acak, kemudian melakukan iterasi untuk memperbarui posisi
centroid dan memperbarui pemetaan data ke kelompok berdasarkan jarak
Euclidean antara data dan centroid terdekat.

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

#Kode di atas merupakan implementasi fungsi Kmeans_alg yang menerapkan


algoritma K-Means dalam bahasa Python.
#Fungsi ini menerima data yang akan dikelompokkan dan posisi awal
centroid untuk setiap kelompok. Pada setiap iterasi, data
dikelompokkan berdasarkan jaraknya ke centroid menggunakan fungsi
group_assignment.
# Setelah itu, posisi centroid diperbarui menggunakan fungsi
update_centroid.
#Proses ini akan berlanjut hingga posisi centroid konvergen atau
perbedaan posisi centroid yang baru dengan yang lama sudah cukup
kecil. Setiap iterasi, nilai objective function dihitung dengan fungsi
clustering_objective dan disimpan dalam list J_obj_vector.
#Akhirnya, fungsi mengembalikan posisi centroid yang konvergen,
pemetaan data ke kelompok, vektor nilai objective function, dan jumlah
iterasi yang dilakukan.

#Alternatifnya, kita bisa menggunakan fungsi Kmeans di modul cluster


dari paket sklearn

from sklearn.cluster import KMeans


import numpy as np
data = np.array([[1, 2], [3, 4], [5, 6], [7, 8]])

kmeans = KMeans(n_clusters=4, random_state=0).fit(data)


labels = kmeans.labels_
group_representative = kmeans.cluster_centers_
inertia = kmeans.inertia_

C:\Users\firman\anaconda3\lib\site-packages\sklearn\cluster\
_kmeans.py:870: FutureWarning: The default value of `n_init` will
change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly
to suppress the warning
warnings.warn(
C:\Users\firman\anaconda3\lib\site-packages\sklearn\cluster\
_kmeans.py:1382: UserWarning: KMeans is known to have a memory leak on
Windows with MKL, when there are less chunks than available threads.
You can avoid it by setting the environment variable
OMP_NUM_THREADS=1.
warnings.warn(

import matplotlib.pyplot as plt


plt.ion()
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()
#Kode di atas merupakan contoh penggunaan library matplotlib untuk
membuat scatter plot dari data X.
#Pada baris pertama, kita mengimpor modul pyplot dari library
matplotlib dan menggunakan plt.ion() untuk mengaktifkan mode
interaktif pada plot, yang memungkinkan kita untuk memperbarui plot
secara dinamis.
#Pada baris kedua, kita mendefinisikan data X dengan menggunakan
np.concatenate() untuk menggabungkan tiga kelompok data. Setiap
kelompok data terdiri dari 100 sampel, yang dihasilkan dengan
menggunakan distribusi normal dengan mean dan standar deviasi
tertentu.
#Pada baris ketiga, kita menggunakan plt.scatter() untuk membuat
scatter plot dari data X. Kita menggunakan X[:,0] dan X[:,1] untuk
mengambil kolom pertama dan kedua dari X sebagai koordinat x dan y
untuk setiap titik dalam plot.
#Pada baris keempat, kita menggunakan plt.xlim() dan plt.ylim() untuk
menentukan batas sumbu x dan y pada plot agar data yang ditampilkan
sesuai dengan rentang yang diinginkan.
#Pada baris kelima, kita menggunakan plt.show() untuk menampilkan plot
yang telah dibuat.

from sklearn.cluster import KMeans


import numpy as np
import matplotlib.pyplot as plt

# Contoh data
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)]])

# Melakukan clustering dengan KMeans


kmeans = KMeans(n_clusters=3, random_state=0).fit(X)

# Mendapatkan label untuk setiap data


labels = kmeans.labels_

# Mengelompokkan data berdasarkan label


grps = [[X[i, :] for i in range(len(X)) if labels[i] == j] for j in
range(3)]

# Menampilkan scatter plot untuk setiap kelompok


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

C:\Users\firman\anaconda3\lib\site-packages\sklearn\cluster\
_kmeans.py:870: FutureWarning: The default value of `n_init` will
change from 10 to 'auto' in 1.4. Set the value of `n_init` explicitly
to suppress the warning
warnings.warn(
C:\Users\firman\anaconda3\lib\site-packages\sklearn\cluster\
_kmeans.py:1382: UserWarning: KMeans is known to have a memory leak on
Windows with MKL, when there are less chunks than available threads.
You can avoid it by setting the environment variable
OMP_NUM_THREADS=2.
warnings.warn(
#kode di atas mengimpor modul KMeans dari library sklearn.cluster
untuk melakukan clustering menggunakan algoritma K-Means, serta modul
numpy untuk manipulasi array dan matplotlib.pyplot untuk membuat plot.
#Kode di atas membuat contoh data X dengan menggabungkan tiga kelompok
data. Setiap kelompok data terdiri dari 100 sampel, yang dihasilkan
dengan menggunakan distribusi normal dengan mean dan standar deviasi
tertentu.
#Kode di atas membuat objek KMeans dengan n_clusters=3, yang berarti
kita ingin mengelompokkan data menjadi tiga kelompok. Kemudian, metode
fit(X) dipanggil untuk melakukan clustering pada data X.
#Kode di atas mengambil label yang telah ditentukan oleh algoritma K-
Means untuk setiap sampel data. Setiap label mengidentifikasi kelompok
mana yang menjadi anggota dari sampel data tersebut.
#Kode di atas mengelompokkan data X berdasarkan label yang diberikan
oleh K-Means. Ini dilakukan dengan menggunakan list comprehension
untuk membuat kelompok-kelompok data baru berdasarkan labelnya.
#Kode di atas menampilkan scatter plot untuk setiap kelompok data.
Setiap kelompok direpresentasikan oleh warna dan simbol yang berbeda
dalam plot.
#Kode di atas menentukan batas sumbu x dan y pada plot agar data yang
ditampilkan sesuai dengan rentang yang diinginkan.
#Kode di atas menampilkan plot scatter setelah semua pengaturan
selesai dilakukan.

Anda mungkin juga menyukai