Tugas (lengkap) · Simulasi · Catatan ← → / spasi · salin per slide · cetak PDF
Pertemuan 05 · Tugas 5-NN
80% baris pertama tiap class untuk training, sisanya test. Prediksi yang beda dengan class label dihitung salah.
15 test, salah 0, error rate 0%
Bahan
File 5. ruspini.csv. Satu baris = satu titik (X, Y) plus CLASS.
| Class | Jumlah | Baris di csv |
|---|---|---|
| 1 | 20 | 1–20 |
| 2 | 17 | 21–37 |
| 3 | 23 | 38–60 |
| 4 | 15 | 61–75 |
| Total | 75 |
PDF: 80% baris pertama tiap class label untuk training, sisa baris untuk test, lalu 5-NN. Enam puluh baris pertama hanya class 1, 2, dan 3. Class 4 mulai di baris 61. Kalau 80% diambil dari seluruh file sekaligus, class 4 tidak masuk training data.
1 · Split per class
Class 2 punya 17 baris dan class 3 punya 23. Jumlah training baru bisa dihitung sesudah tiap class terkumpul.
1 · Berapa baris training
n training = bilangan bulat terdekat dari 0,8 × n class
Sisa baris di daftar itu = test.
| Class | n | 0,8 × n | Training | Test |
|---|---|---|---|---|
| 1 | 20 | 16 | 16 | 4 |
| 2 | 17 | 13,6 | 14 | 3 |
| 3 | 23 | 18,4 | 18 | 5 |
| 4 | 15 | 12 | 12 | 3 |
| Total | 75 | 60 | 15 |
Class 1 dan 4 pas. Class 2: 13,6 dibulatkan ke 14. Class 3: 18,4 dibulatkan ke 18. Total 60 training dan 15 test.
1 · Baris mana
Di tiap class, baris yang lebih dulu muncul di csv, sebanyak n training, masuk training. Baris di belakangnya masuk test. Class-nya tidak berubah.
| Class | Training | Test |
|---|---|---|
| 1 | 1–16 | 17–20 |
| 2 | 21–34 | 35–37 |
| 3 | 38–55 | 56–60 |
| 4 | 61–72 | 73–75 |
Class 1: baris 17 (30, 52), 18 (31, 60), 19 (32, 61), dan 20 (36, 72) masuk test. Daftar titik tiap class ada di halaman tugas.
2 · Hasil 5-NN
predict
Euclidean distance. Kalau dua training sama jauh, baris csv yang lebih kecil menang. Class label = majority vote dari 5 nearest neighbor.
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. 80% pertama dibulatkan. Class 2: 13,6 jadi 14. Class 3: 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
2 · Hasil 5-NN
python3 tugas.py, dengan 5. ruspini.csv di folder yang sama. Satu contoh per class. Class 3 yang tampil adalah (54, 124).
$ 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
error rate = (jumlah salah / jumlah test) × 100% = 0 / 15 × 100% = 0%
Salah hanya kalau prediksi tidak sama dengan class label. Baris 17–20 prediksi 1, 35–37 prediksi 2, 56–60 prediksi 3, 73–75 prediksi 4.
Setiap titik test: 5 training paling dekat semuanya class yang sama dengan label asli. Majority vote otomatis benar.
4 · Analisis eksperimen
Selesai
Tabel lengkap dan simulasi (lingkaran isi = training, cincin = test, garis = 5 nearest neighbor). Keluaran yang sama ada di tugas.py.