Anda di halaman 1dari 10

Algoritma K-Nearest Neighbor (K-NN)

Apa itu KNN?


Algoritma K-Nearest Neighbor (K-NN) adalah sebuah metode klasifikasi terhadap sekumpulan
data berdasarkan pembelajaran data yang sudah terklasifikasikan sebelumya. Termasuk dalam
supervised learning, dimana hasil query instance yang baru diklasifikasikan berdasarkan
mayoritas kedekatan jarak dari kategori yang ada dalam K-NN.
Ilustrasi
lustrasi cerita dari K-NN adalah sebagai berikut:
Bertanya pada Tetangga – Anda diundang ke sebuah pertemuan. Namun, Anda tidak tahu tema
dari pertemuan tersebut, maupun kegiatan apa saja yang akan dilakukan di pertemuan tersebut.
Anda benar-benar tidak tahu apakah pertemuan itu akan bermanfaat atau tidak untuk Anda.
Yang Anda tahu, beberapa orang teman Anda juga diundang ke acara yang sama. Dalam
kondisi seperti itu, apa yang Anda lakukan?
Cara yang biasanya dilakukan oleh banyak orang dalam menangani masalah seperti itu
adalah dengan bertanya kepada teman-teman apakah mereka akan datang ke pertemuan
tersebut atau tidak. Biasanya, orang-orang yang pertama ditanya adalah orang-orang
yang dekat dengan Anda. Maka, Anda mencoba mengontak enam orang teman yang
biasa jadi teman main Anda. Dari enam orang tersebut, empat orang menyatakan akan
datang, tapi dua orang ternyata memutuskan tidak datang, entah mengapa alasannya.
Keputusan apa yang Anda akan ambil?
Kasus di atas menggambarkan ide dari algoritma k-Nearest Neighbours (kNN). Anda ingin
mengambil sebuah keputusan (kelas) antara datang atau tidak datang ke sebuah pertemuan.
Untuk mendukung pengambilan keputusan tersebut, Anda melihat mayoritas dari keputusan
teman-teman Anda (instance lainnya). Teman-teman tersebut Anda pilih berdasarkan
kedekatannya dengan Anda. Ukuran kedekatan pertemanan ini bisa bermacam-macam:
tetangga, satu hobi, satu kelas, atau hal-hal lainnya. Ukuran-ukuran tersebut bisa juga
digunakan bersamaan, misalnya si A itu tetangga, satu hobi, dan satu kelas; sedangkan si B
hanya satu kelas saja.
ambar di atas menggambarkan ide dari algoritma k-Nearest Neighbours (kNN). Anda ingin
mengambil sebuah keputusan (kelas) antara datang atau tidak datang ke sebuah pertemuan.
Untuk mendukung pengambilan keputusan tersebut, Anda melihat mayoritas dari keputusan
teman atau tetangga Anda (instance lainnya). Teman atau tetangga tersebut Anda pilih
berdasarkan kedekatannya dengan Anda. Ukuran kedekatan pertemanan ini bisa bermacam-
macam: satu hobi, satu kelas, atau hal-hal lainnya. Ukuran-ukuran tersebut bisa juga digunakan
bersamaan, misalnya si A itu tetangga, satu hobi, dan satu kelas; sedangkan si B hanya satu
kelas saja.
Dekat atau jauhnya tetangga biasanya dihitung berdasarkan Euclidean Distance, atau dapat
juga menggunakan rumus jarak yang lain, seperti yang dijelaskan pada artikel Vector Space
Model dan Pengukuran Jarak. Kedekatan dapat dianggap sebagai invers jarak, alias berbanding
terbalik dengan jarak. Semakin kecil jarak antara dua instance, semakin besar “kedekatan”
antara dua instance tersebut. Dengan demikian, k nearest neighbours dari sebuah instance x
didefinisikan sebagai k instance yang memiliki jarak terkecil (kedekatan terbesar, nearest)
dengan x.
Tahapan Langkah Algoritma K-NN
1. Menentukan parameter k (jumlah tetangga paling dekat).
2. Menghitung kuadrat jarak eucliden objek terhadap data training yang diberikan.
3. Mengurutkan hasil no 2 secara ascending (berurutan dari nilai tinggi ke rendah)
4. Mengumpulkan kategori Y (Klasifikasi nearest neighbor berdasarkan nilai k)
5. Dengan menggunakan kategori nearest neighbor yang paling mayoritas maka dapat
dipredisikan kategori objek.
Kelebihan dan Kekurangan dari Algoritma K-NN
Sangat nonlinear
kNN merupakan salah satu algoritma (model) pembelajaran mesin yang bersifat
nonparametrik. Pembahasan mengenai model parametrik dan model nonparametrik bisa
menjadi artikel sendiri, namun secara singkat, definisi model nonparametrik adalah model yang
tidak mengasumsikan apa-apa mengenai distribusi instance di dalam dataset. Model
nonparametrik biasanya lebih sulit diinterpretasikan, namun salah satu kelebihannya adalah
garis keputusan kelas yang dihasilkan model tersebut bisa jadi sangat fleksibel dan nonlinear.
Pada ilustrasi di atas, kNN dapat melakukan klasifikasi dengan tepat karena garis keputusan
kelasnya nonlinear. Bandingkan dengan model linear (e.g. logistic regression) yang tentunya
akan menghasilkan banyak misklasifikasi jika garis keputusan kelas dalam dataset sebenarnya
bersifat nonlinear.
Mudah dipahami dan diimplementasikan
Dari paparan yang diberikan dan penjelasan cara menghitung jarak dalam artikel ini, cukup
jelas bahwa algoritma kNN mudah dipahami dan juga mudah dimplementasikan. Untuk
mengklasifikasi instance x menggunakan kNN, kita cukup mendefinisikan fungsi untuk
menghitung jarak antar-instance, menghitung jarak x dengan semua instance lainnya
berdasarkan fungsi tersebut, dan menentukan kelas x sebagai kelas yang paling banyak muncul
dalam k instance terdekat.
Kekurangan
 Perlu menunjukkan parameter K (jumlah tetangga terdekat)
 Tidak menangani nilai hilang (missing value) secara implisit
 Jika terdapat nilai hilang pada satu atau lebih variabel dari suatu instance, perhitungan
jarak instance tersebut dengan instance lainnya menjadi tidak terdefinisi. Bagaimana
coba, menghitung jarak dalam ruang 3-dimensi jika salah satu dimensi hilang?
Karenanya, sebelum menerapkan kNN kerap dilakukan imputasi untuk mengisi nilai-
nilai hilang yang ada pada dataset. Contoh teknik imputasi yang paling umum adalah
mengisi nilai hilang pada suatu variabel dengan nilai rata-rata variabel tersebut (mean
imputation).
Sensitif terhadap data pencilan (outlier)
Seperti yang telah dijelaskan Ali pada artikel sebelumnya, kNN bisa jadi sangat fleksibel jika
k kecil. Fleksibilitas ini mengakibatkan kNN cenderung sensitif terhadap data pencilan,
khususnya pencilan yang terletak di “tengah-tengah” kelas yang berbeda. Lebih jelasnya,
perhatikan ilustrasi di bawah. Pada gambar kiri, seluruh instance bisa diklasifikasikan dengan
benar ke dalam kelas biru dan jingga. Tetapi, ketika ditambahkan instance biru di antara
instance jingga, beberapa instance jingga menjadi salah terklasifikasi.Perlu dipilih k yang tepat
untuk mengurangi dampak data pencilan dalam kNN.
Rentan terhadap variabel yang non-informatif
Meskipun kita telah menstandardisasi rentang variabel, kNN tetap tidak dapat mengetahui
variabel mana yang signifikan dalam klasifikasi dan mana yang tidak. Lihat contoh berikut:

Pada ilustrasi di atas, klasifikasi sebetulnya bisa dilakukan menggunakan variabel a saja
(perhatikan garis vertikal yang memisahkan kedua kelas secara linear). Namun, kNN tidak
dapat mengetahui bahwa variabel b tidak informatif. Alhasil, dua instance kelas biru
terklasifikasi dengan salah, karena kedua instance tersebut dekat dengan instance kelas jingga
dalam dimensi b. Andaikan kita hanya menggunakan variabel a dan membuang variabel b,
semua instance akan terklasifikasi dengan tepat.Pemilihan variabel sebelum menerapkan kNN
dapat membantu menangani permasalahan di atas. Selain itu, kita juga bisa memberi bobot
pada variabel dalam perhitungan jarak antar-instance. Variabel yang kita tahu noninformatif
kita beri bobot yang kecil, misalnya:

Rentan terhadap dimensionalitas yang tinggi


Berbagai permasalahan yang timbul dari tingginya dimensionalitas (baca: banyaknya variabel)
menimpa sebagian besar algoritma pembelajaran mesin, dan kNN adalah salah satu algoritma
yang paling rentan terhadap tingginya dimensionalitas. Hal ini karena semakin banyak dimensi,
ruang yang bisa ditempati instance semakin besar, sehingga semakin besar pula kemungkinan
bahwa nearest neighbour dari suatu instance sebetulnya sama sekali tidak “near“.
Masalah tingginya dimensionalitas (terkadang) bisa diatasi dengan pemilihan variabel atau
rekayasa fitur, misalnya dengan PCA.
Rentan terhadap perbedaan rentang variabel
Dalam perhitungan jarak antar-instance, kNN menganggap semua variabel setara atau sama
penting (lihat bagian penjumlahan pada rumus perhitungan jarak di atas). Jika terdapat variabel
p yang memiliki rentang jauh lebih besar dibanding variabel-variabel lainnya, maka
perhitungan jarak akan didominasi oleh p. Misalkan ada dua variabel, a dan b, dengan rentang
variabel a 0 sampai 1.000 dan rentang variabel b 0 sampai 10. Kuadrat selisih dua nilai variabel
b tidak akan lebih dari 100, sedangkan untuk variabel a kuadrat selisihnya bisa mencapai
1.000.000. Hal ini bisa mengecoh kNN sehingga kNN menganggap a tidak membawa pengaruh
dalam perhitungan jarak karena rentangnya sangat besar dibanding rentang b.Ilustrasinya
diberikan di bawah ini. Manakah yang merupakan nearest neighbour dari instance x? Jika
dilihat dari “kacamata” komputer, nearest neighbour x bukanlah y, melainkan z, Mengapa?
Untuk mengatasi perbedaan rentang, biasanya dilakukan preproses berupa standardisasi
rentang semua variabel sebelum menerapkan algoritma kNN. Contohnya yaitu melalui operasi
centre-scale atau operasi min-max.

Nilai komputasi yang tinggi


Untuk mengklasifikasi sebuah instance x, kNN harus menghitung jarak antara x dengan semua
instance lain dalam dataset yang kita miliki. Dengan kata lain, kompleksitas waktu klasifikasi
kNN berbanding lurus dengan jumlah instance latih. Jika dataset yang kita miliki berukuran
besar (terdiri dari banyak instance dan/atau banyak variabel), proses ini bisa jadi sangat lambat.
Bayangkan, jika kita punya 10.000 instance dengan masing-masing 20 variabel dan kita ingin
mengklasifikasi 100 instance baru (instance uji), maka total operasi yang harus dilakukan
menjadi:(100 instance uji x 10.000 instance latih) x 20 variabel/instance x 2 operasi/variabel =
40 juta operasiBeberapa cara pengindexan (K-D tree) dapat digunakan untuk mereduksi biaya
komputasi.
Contoh Kasus Perhitungan K-NN
Terdapat beberapa data yang berasal dari survey questioner tentang klasifikasi kualitas kertas
tissue apakah baik atau jelek, dengan objek training dibawah ini menggunakan dua attribute
yaitu daya tahan terhadap asam dan kekuatan.

Akan diproduksi kembali kertas tissue dengan attribute X1=7 dan X2=4, tanpa harus
mengeluarkan biaya untuk melakukan survey, maka dapat diklasifikasikan kertas tissue
tersebut termasuk yang baik atau jelek.

Dengan mengurutkan jarak terkecil, semisal diambil K=3, maka perbandingan nya adalah 2
(Baik) >1 (Jelek). Maka dapat disimpulkan kertas tissue dengan attribute X1=7 dan X2=4
masuk ke kelas Baik.
Contoh penerapan matlab
1. Mempersiapkan citra untuk proses pelatihan. Pada proses tersebut digunakan 60 citra
yang terdiri dari 15 citra apel, 15 citra tulang, 15 citra gajah, dan 15 citra garpu

2. Mempersiapkan citra untuk proses pengujian. Pada proses tersebut digunakan 20 citra
yang terdiri dari 5 citra apel, 5 citra tulang, 5 citra gajah, dan 5 citra garpu

3. Setelah citra untuk proses pelatihan dan pengujian disiapkan, dilakukan pemrograman
untuk kedua proses tersebut. Source code untuk mengklasifikasi bentuk suatu objek
dalam citra digital menggunakan algoritma k-nearest neighbor adalah sebagai berikut:
clc;clear;close all;

image_folder = 'data latih';


filenames = dir(fullfile(image_folder, '*.gif'));
total_images = numel(filenames);

for n = 1:total_images
full_name= fullfile(image_folder, filenames(n).name);
our_images = logical(imread(full_name));
our_images = bwconvhull(our_images,'objects');
stats = regionprops(our_images,'Area','Perimeter','Eccentricity');
area(n) = stats.Area;
perimeter(n) = stats.Perimeter;
metric(n) = 4*pi*area(n)/(perimeter(n).^2);
eccentricity(n) = stats.Eccentricity;
training = [metric;eccentricity]';

group = cell(60,1);
group(1:15,:) = {'tulang'};
group(16:30,:) = {'apel'};
group(31:45,:) = {'gajah'};
group(46:60,:) = {'garpu'};
end

figure,
gscatter(metric',eccentricity',group,'rgbk','.',15)
legend('Tulang pelatihan','Apel pelatihan','Gajah pelatihan','Garpu
pelatihan',...
'Location','SouthWest')
grid on

image_folder_uji = 'data uji';


filenames_uji = dir(fullfile(image_folder_uji, '*.gif'));
total_images_uji = numel(filenames_uji);
for n = 1:total_images_uji
full_name_uji = fullfile(image_folder_uji, filenames_uji(n).name);
our_images_uji = logical(imread(full_name_uji));
our_images_uji = bwconvhull(our_images_uji,'objects');
stats_uji =
regionprops(our_images_uji,'Area','Perimeter','Eccentricity');
area_uji(n) = stats_uji.Area;
perimeter_uji(n) = stats_uji.Perimeter;
metric_uji(n) = (4*pi*area_uji(n))./(perimeter_uji(n).^2);
eccentricity_uji(n) = stats_uji.Eccentricity;
sample = [metric_uji;eccentricity_uji]';
end

c = fitcknn(training, group,'NumNeighbors',1,'Standardize',1);
Class = predict(c,sample);
figure,
gscatter(metric',eccentricity',group,'rgbk','.',15)
grid on
hold on
gscatter(metric_uji',eccentricity_uji',Class,[1 1 0; 1 0 1; 0 1 1; .5 .5
.5],'x',15);
legend('Tulang pelatihan','Apel pelatihan','Gajah pelatihan','Garpu
pelatihan',...
'Tulang pengujian','Garpu pengujian','Apel pengujian','Gajah
pengujian',...
'Location','SouthWest')
hold off
4. Sehingga pada proses pelatihan diperoleh hasil berupa grafik seperti pada gambar berikut:

Pada grafik tersebut terlihat distribusi data (nilai metric dan ecentricity) pada masing-masing
kelas grup (apel, tulang, gajah, garpu). Pada proses pengujian, suatu data uji dikatakan masuk
ke dalam kelas grup apel apabila tetangga terdekat dari data uji tersebut dominan dengan kelas
grup A
5. Pada proses pengujian dihasilkan grafik seperti pada gambar di bawah ini
6. Kelas keluaran yang dihasilkan dalam proses pengujian adalah sbb:

sehingga hasil perbandingan antara kelas keluaran dengan kelas target pada proses pengujian
adalah:

Berdasarkan tabel di atas, tampak bahwa terdapat empat buah data uji yang diklasifikasikan ke
dalam kelas yang salah (tidak sesuai dengan kelas target). Sehingga akurasi sistem dalam
mengklasifikasikan bentuk objek adalah (16/20) x 100% = 80%. Nilai akurasi tersebut
menunjukkan bahwa algoritma k-nearest neighbor cukup baik dalam mengklasifikasikan
bentuk objek pada citra yang diberikan.

Anda mungkin juga menyukai