Pascasarjana Diary

Tugas · Pertemuan 05

5-NN pada data Ruspini

Soal: 80% baris pertama tiap class untuk training, sisanya untuk test, lalu klasifikasi 5-NN. Prediksi yang beda dengan class label dihitung salah. Dari 15 titik test, yang salah 0, jadi error rate 0%.

1. Split per class

PDF meminta 80% baris pertama tiap class untuk training, sisanya untuk test, mengikuti urutan csv. Potongan dihitung di dalam tiap class, sesudah baris dikelompokkan menurut CLASS. 60 baris pertama hanya class 1, 2, dan 3. Class 4 mulai di baris 61. Kalau 80% diambil dari seluruh file, class 4 tidak masuk training data, dan 5-NN tidak bisa memprediksi 4.

Jumlah training = bilangan bulat terdekat dari 0,8 × n. Class 2: 13,6 dibulatkan ke 14. Class 3: 18,4 dibulatkan ke 18. Total 60 training dan 15 test. Baris berwarna di tabel adalah test.

Class n Training Test
120164
217143
323185
415123
Total756015

Class 1

NoXYPeran
1453training
2563training
31059training
4977training
51349training
61369training
71288training
81575training
91861training
101965training
112274training
122772training
132876training
142458training
152755training
162860training
173052test
183160test
193261test
203672test

Class 2

NoXYPeran
2186132training
2285115training
238596training
247894training
257496training
2697122training
2798116training
2898124training
2999119training
3099128training
31101115training
32108111training
33110111training
34108116training
35111126test
36115117test
37117115test

Class 3

NoXYPeran
3828147training
3932149training
4035153training
4133154training
4238151training
4341150training
4438145training
4538143training
4632143training
4734141training
4844156training
4944149training
5044143training
5146142training
5247149training
5349152training
5450142training
5553144training
5652152test
5755155test
5854124test
5960136test
6063139test

Class 4

NoXYPeran
61704training
627712training
638321training
646115training
656915training
667816training
676618training
685813training
696420training
706921training
716623training
726125training
737627test
747231test
756430test

2. Hasil 5-NN

Cuplikan tugas.py

predict

Jaraknya Euclidean distance. Kalau dua training data sama jauh, nomor baris yang lebih kecil yang diambil. Class label dipilih lewat voting 5 nearest training data.

def predict(point, train):
    nearest = sorted(
        train,
        key=lambda tr: (math.hypot(point[1] - tr[1], point[2] - tr[2]), tr[0]),
    )[:K]
    return Counter(tr[3] for tr in nearest).most_common(1)[0][0]

split

Kelompokkan menurut class, urutan csv tetap. 80% pertama dibulatkan: class 2 dari 13,6 jadi 14, class 3 dari 18,4 jadi 18. Sisanya test.

def split(rows):
    by = defaultdict(list)
    for row in rows:
        by[row[3]].append(row)
    train, test = [], []
    for label in sorted(by):
        items = by[label]
        n = round(len(items) * 0.8)
        train += items[:n]
        test += items[n:]
    return train, test

Keluarannya

python3 tugas.py, dengan 5. ruspini.csv di folder yang sama. Teks di bawah ini sama dengan yang tercetak.

tugas.py
$ python3 tugas.py

Total data   : 75
Data training: 60
Data testing : 15

 Titik uji | Asli | Prediksi | Status
--------------------------------------
(  30,  52) | 1 | 1 | benar
( 111, 126) | 2 | 2 | benar
(  54, 124) | 3 | 3 | benar
(  76,  27) | 4 | 4 | benar
... (15 data uji, semua benar) ...
--------------------------------------

Jumlah error : 0 dari 15
Error rate   : 0.00%
Akurasi      : 100.00%

3. Persen error

Soal meminta jumlah error seluruh test, dalam persen. Satu baris dihitung salah hanya kalau prediksi 5-NN tidak sama dengan CLASS di csv. Lima belas baris test dibandingkan satu per satu: baris 17–20 prediksi 1, baris 35–37 prediksi 2, baris 56–60 prediksi 3, baris 73–75 prediksi 4. Semuanya sama dengan class label. Tidak ada baris yang menang tipis: tiap voting 5 lawan 0, jadi 0% tidak bergantung pada 1 nearest neighbor.

error rate = (jumlah salah / jumlah test) × 100% = 0 / 15 × 100% = 0%

4. Analisis

Sebaran 75 titik Ruspini. Class 1 di kiri, class 3 di atas, class 2 di kanan atas, class 4 di kanan bawah. Satu titik class 3 turun sendiri di sekitar (54, 124).
75 titik Ruspini. Angka pada titik adalah class. Titik class 3 yang turun sendiri, di sekitar (54, 124), adalah baris 58.

Empat kelompok di gambar itu terpisah: class 1 di kiri, class 3 di atas, class 2 di kanan atas, class 4 di kanan bawah. Pusat class kira-kira (20, 65), (98, 115), (44, 146), dan (69, 19). Sepanjang 75 baris, dua titik berbeda class yang paling dekat adalah baris 21 (86, 132), class 2, dan baris 60 (63, 139), class 3. Euclidean distance 24.04.

Prediksi berganti class kalau ada training data class lain di dalam 5 nearest neighbor. Tabel di bawah membandingkan jarak nearest neighbor ke-5 dengan jarak training data class lain yang terdekat. Selisih positif berarti 5 nearest neighbor masih satu class label dengan label asli.

Selisih = jarak class lain terdekat − jarak nearest neighbor ke-5. Selisih terkecil ada di baris 60.
No Class Nearest neighbor ke-5 Class lain terdekat Jarak lain Selisih
17117.03#72 class 441.1124.08
18113.00#72 class 446.1033.10
19113.60#72 class 446.2332.63
20118.38#25 class 244.9426.56
35214.56#55 class 360.7346.17
36216.12#55 class 367.6251.50
37218.44#55 class 370.2651.82
5638.94#21 class 239.4530.50
57312.53#21 class 238.6026.07
58324.84#22 class 232.287.44
59318.38#21 class 226.317.92
60319.10#21 class 224.044.94
73413.45#15 class 156.4442.98
74414.32#15 class 151.0036.68
75412.17#15 class 144.6532.49

Selisih paling kecil ada di baris 60: nearest neighbor ke-5 berjarak 19.10, baris 21 class 2 berjarak 24.04, selisih 4.94. Baris 58 (54, 124) duduk di bawah kawanan class 3. Nearest neighbor ke-5-nya, baris 45, berjarak 24.84. Titik class lain terdekat, baris 22 class 2, berjarak 32.28. Selisihnya 7.44, lebih besar daripada selisih baris 60.

Lima belas baris itu voting 5 lawan 0, jadi error rate pada pecahan ini 0%. Pengecekan tambahan: memotong dengan int(n × 0,8) tanpa pembulatan memindahkan baris 34 ke test. Enam belas titik test pada potongan itu tetap terprediksi benar. Di simulasi, lingkaran isi = training, cincin = test, garis = 5 nearest neighbor titik yang dipilih.