Algoritma Winnow


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:

KuisionerPertanyaan1Pertanyaan2Pertanyaan3Pertanyaan4Pertanyaan5Kesimpulan
Kuisioner ATidakYaTidakYaAkelompok 1
Kuisioner BYaTidakYaYaCkelompok 1
Kuisioner CTidakYaYaTidakDkelompok 1
Kuisioner DYaYaTidakTidakDkelompok 1
Kuisioner ETidakTidakYaTidakBkelompok 2
Kuisioner FYaYaTidakYaCkelompok 2
Kuisioner GYaYaTidakTidakCkelompok 1
Kuisioner HYaTidakYaTidakAkelompok 1
Kuisioner IYaTidakTidakTidakDkelompok 2
Kuisioner JYaYaTidakYaCkelompok 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)

cmd39

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.

Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *