Algoritma Winnow adalah salah satu algoritma yang digunakan untuk pengelompokan atau klasifikasi data. Contoh yang dibahas kali ini adalah mengenai penentuan kesimpulan berdasarkan kuisioner yang tersedia.
Diasumsikan ada 10 data kuisioner, yaitu Kuisioner A,B,C,D,E,F,G,H,I,J
Kuisioner tersebut memiliki 5 pertanyaan
Pertanyaan 1 – 4 dijawab dengan “”Ya”” atau “”Tidak””, sedangkan pertanyaan 5 dijawab dengan pilihan A/B/C/D
Kesimpulan masing-masing kuisioner adalah pengelompokan ke dalam 2 kelompok, yaitu kelompok 1 dan kelompok 2
Maka tentukan kelompok sebuah kuisioner apabila semua pertanyaan dijawab dengan “”Ya””
Diasumsikan 10 data kuisioner tersebut adalah sebagai berikut:
Kuisioner | Pertanyaan1 | Pertanyaan2 | Pertanyaan3 | Pertanyaan4 | Pertanyaan5 | Kesimpulan |
---|---|---|---|---|---|---|
Kuisioner A | Tidak | Ya | Tidak | Ya | A | kelompok 1 |
Kuisioner B | Ya | Tidak | Ya | Ya | C | kelompok 1 |
Kuisioner C | Tidak | Ya | Ya | Tidak | D | kelompok 1 |
Kuisioner D | Ya | Ya | Tidak | Tidak | D | kelompok 1 |
Kuisioner E | Tidak | Tidak | Ya | Tidak | B | kelompok 2 |
Kuisioner F | Ya | Ya | Tidak | Ya | C | kelompok 2 |
Kuisioner G | Ya | Ya | Tidak | Tidak | C | kelompok 1 |
Kuisioner H | Ya | Tidak | Ya | Tidak | A | kelompok 1 |
Kuisioner I | Ya | Tidak | Tidak | Tidak | D | kelompok 2 |
Kuisioner J | Ya | Ya | Tidak | Ya | C | kelompok 2 |
Contoh data awal adalah sebagai berikut:
Dim data(9)() As String data(0) = New String() {"Tidak", "Ya", "Tidak", "Ya", "A", "kelompok 1"} data(1) = New String() {"Ya", "Tidak", "Ya", "Ya", "C", "kelompok 1"} data(2) = New String() {"Tidak", "Ya", "Ya", "Tidak", "D", "kelompok 1"} data(3) = New String() {"Ya", "Ya", "Tidak", "Tidak", "D", "kelompok 1"} data(4) = New String() {"Tidak", "Tidak", "Ya", "Tidak", "B", "kelompok 2"} data(5) = New String() {"Ya", "Ya", "Tidak", "Ya", "C", "kelompok 2"} data(6) = New String() {"Ya", "Ya", "Tidak", "Tidak", "C", "kelompok 1"} data(7) = New String() {"Ya", "Tidak", "Ya", "Tidak", "A", "kelompok 1"} data(8) = New String() {"Ya", "Tidak", "Tidak", "Tidak", "D", "kelompok 2"} data(9) = New String() {"Ya", "Ya", "Tidak", "Ya", "C", "kelompok 2"}
Langkah-langkah penggunaan algoritma ini adalah
1. Lakukan konversi data ke dalam matriks yang hanya bernilai angka 0 dan 1
Pada kolom pertanyaan 1 sampai dengan 4, jawaban Tidak akan dikonversi menjadi angka 0, dan jawaban Ya akan dikonversi menjadi angka 1
Pada kolom pertanyaan 5, masing-masing jawaban akan direpresentasikan ke dalam 4 kolom
Jika jawaban adalah A, maka nilai kolom adalah 1,0,0,0
Jika jawaban adalah B, maka nilai kolom adalah 0,1,0,0
Jika jawaban adalah C, maka nilai kolom adalah 0,0,1,0
Jika jawaban adalah D, maka nilai kolom adalah 0,0,0,1
Pada kolom kesimpulan, yang termasuk dalam kelompok 1 akan dikonversi menjadi angka 0, dan yang termasuk dalam kelompok 2 akan dikonversi menjadi angka 1
Dim dataAwal(9)() As Integer For i As Integer = 0 To dataAwal.Length - 1 dataAwal(i) = New Integer(8) {} dataAwal(i)(0) = IIf(data(i)(0) = "Ya", 1, 0) dataAwal(i)(1) = IIf(data(i)(1) = "Ya", 1, 0) dataAwal(i)(2) = IIf(data(i)(2) = "Ya", 1, 0) dataAwal(i)(3) = IIf(data(i)(3) = "Ya", 1, 0) dataAwal(i)(4) = IIf(data(i)(4) = "A", 1, 0) dataAwal(i)(5) = IIf(data(i)(4) = "B", 1, 0) dataAwal(i)(6) = IIf(data(i)(4) = "C", 1, 0) dataAwal(i)(7) = IIf(data(i)(4) = "D", 1, 0) dataAwal(i)(8) = IIf(data(i)(5) = "kelompok 1", 0, IIf(data(i)(5) = "kelompok 2", 1, -1)) Next
2. Tentukan Jumlah kolom input
Diasumsikan dalam kasus ini, jumlah kolom input ada 8 buah,
yaitu 1 kolom untuk pertanyaan 1 – 4, dan 4 kolom untuk pertanyaan 5
Const jumlahInput As Integer = 8
3. Lakukan proses pencarian bobot untuk masing-masing kolom
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
Dim w As New Winnow(jumlahInput) Dim bobot() As Double = w.prosesPerhitungan(dataAwal)
Memasuki perhitungan pada Fungsi prosesPerhitungan
3a. Langkah optional / tidak wajib
Lakukan pengacakan data awal, sehingga urutan perhitungan tidak sesuai dengan urutan inputan data
For i As Integer = 0 To dataAwal.Length - 1 Dim r As Integer = rnd.Next(i, dataAwal.Length) Dim tmp() As Integer = dataAwal(r) dataAwal(r) = dataAwal(i) dataAwal(i) = tmp Next i
3b. Lakukan perulangan pada setiap data
Tentukan hasil pengelompokan pada data awal (berada pada kolom terakhir)
hasilDataAwal = dataAwal(i)(jumlahInput)
3c. Tentukan hasil pengelompokan yang dihitung dengan menggunakan matriks bobot
hasilPerhitungan = HitungNilaiOutput(data)
* Gunakan Fungsi ini untuk menghitung nilai output dari sebuah data
Rumus yang digunakan adalah penjumlahan dari setiap data dikali bobotnya
Apabila jumlah nilai lebih dari threshold, maka nilai output bernilai 1, selain itu bernilai 0
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
Public Function HitungNilaiOutput(ByVal data() As Integer) As Integer Dim jumlah As Double = 0.0 For i As Integer = 0 To jumlahInput - 1 jumlah += bobot(i) * data(i) Next i If jumlah > Me.threshold Then Return 1 Else Return 0 End If End Function
3d. Bandingkan poin 3b dan poin 3c
Jika poin 3b bernilai 0 dan poin 3c bernilai 1, maka lakukan demosi pada matriks bobot
Untuk setiap data yang bernilai bukan 0, bagi nilai bobotnya dengan alpha
Jika poin 3b bernilai 1 dan poin 3c bernilai 0, maka lakukan promosi pada matriks bobot
Untuk setiap data yang bernilai bukan 0, kali nilai bobotnya dengan alpha
If hasilDataAwal = 0 AndAlso hasilPerhitungan = 1 Then For j As Integer = 0 To jumlahInput - 1 If data(j) = 0 Then Continue For bobot(j) = bobot(j) / alpha Next j ElseIf hasilDataAwal = 1 AndAlso hasilPerhitungan = 0 Then For j As Integer = 0 To jumlahInput - 1 If data(j) = 0 Then Continue For bobot(j) = bobot(j) * alpha Next j End If
Lakukan perulangan poin 3b sampai dengan 3d pada setiap data inputan untuk menentukan matriks bobot akhir
4. Lakukan perhitungan dari masing-masing data awal menggunakan matriks bobot yang sudah ditemukan
Dim output As Integer = w.HitungNilaiOutput(input) Console.Write(output.ToString("F2") & " ")
5. Jika nilai output bernilai 0 maka kuisioner tersebut termasuk dalam kelompok 1
Jika nilai output bernilai bukan 0 maka kuisioner tersebut termasuk dalam kelompok 2
If output = 0 Then Console.Write("-> kelompok 1 ") If dataAwal(i)(jumlahInput) = 0 Then jumlahBenar += 1 Console.WriteLine("Benar") ElseIf dataAwal(i)(jumlahInput) <> 0 Then jumlahSalah += 1 Console.WriteLine("Salah") End If ElseIf output = 1 Then Console.Write("-> kelompok 2 ") If dataAwal(i)(jumlahInput) = 0 Then jumlahSalah += 1 Console.WriteLine("Salah") ElseIf dataAwal(i)(jumlahInput) <> 0 Then jumlahBenar += 1 Console.WriteLine("Benar") End If End If
6. Catat tingkat kecocokan perhitungan data dengan hasil awal pada data
Langkah ini tidak wajib, hanya untuk mengetahui seberapa besar tingkat kecocokan perhitungan untuk data baru yang akan dihitung selanjutnya
Console.WriteLine("Jumlah perhitungan benar = " & jumlahBenar & ", jumlah perhitungan salah = " & jumlahSalah) Console.WriteLine("Tingkat kecocokan perhitungan dengan hasil data adalah " & (jumlahBenar / (jumlahBenar + jumlahSalah)).ToString("F2"))
7. Hitung kuisioner menggunakan matriks bobot yang sudah ditentukan apabila semua pertanyaan dijawab dengan “Ya”
Dim prediksi As Integer = w.HitungNilaiOutput(dataSemuaYa) Console.Write("Hasil Perhitungan: " & prediksi.ToString("F2") & " ") If prediksi = 0 Then Console.WriteLine("-> kelompok kuisioner adalah kelompok 1") Else Console.WriteLine("-> kelompok kuisioner adalah kelompok 2") End If
Hasil akhir adalah: (klik untuk perbesar gambar)
Contoh modul / source code dalam bahasa VB (Visual Basic) dapat didownload disini:
Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.