Pengenalan Pola adalah cabang kecerdasan yang menitik-beratkan pada metode pengklasifikasian objek ke dalam kelas – kelas tertentu untuk menyelesaikan masalah tertentu. Contoh yang dibahas kali ini adalah mengenai penentuan pola angka baru berdasarkan pola angka sebelumnya.
Pengenalan Pola sebelumnya sudah pernah dibahas dengan menggunakan Algoritma Perceptron. Pada kali ini akan digunakan algoritma lain yang dinamakan algoritma HN (Hopfield Network) untuk memecahkan masalah yang sama. Algoritma ini sangat bergantung dari korelasi dari contoh data yang digunakan, sehingga hasil akhir akan ditentukan dari perpaduan contoh data yang digunakan. Algoritma ini cukup populer dan sangat mudah untuk diterapkan, tetapi memiliki sisi buruk dimana penghitungan nilai jawaban berujung pada jawaban yang kurang tepat.
Diasumsikan ada 5 pola angka yang diketahui, yaitu pola angka 1 sampai dengan 5
Diasumsikan 5 pola angka tersebut adalah sebagai berikut:
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |||||||||||||||
1 | 1 | 1 | 1 | 1 | |||||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Contoh data awal adalah sebagai berikut:
Dim contohData As Integer()() = New Integer(4)() {} 'Pola Angka 1 contohData(0) = New Integer() _ {0, 1, 1, 0, 0, _ 1, 0, 1, 0, 0, _ 0, 0, 1, 0, 0, _ 0, 0, 1, 0, 0, _ 1, 1, 1, 1, 1, _ 0} 'Pola Angka 2 contohData(1) = New Integer() _ {0, 1, 1, 1, 0, _ 1, 0, 0, 0, 1, _ 0, 0, 1, 1, 0, _ 0, 1, 0, 0, 0, _ 1, 1, 1, 1, 1, _ 0} 'Pola Angka 3 contohData(2) = New Integer() _ {1, 1, 1, 1, 0, _ 0, 0, 0, 0, 1, _ 1, 1, 1, 1, 0, _ 0, 0, 0, 0, 1, _ 1, 1, 1, 1, 0, _ 0} 'Pola Angka 4 contohData(3) = New Integer() _ {0, 0, 0, 1, 1, _ 0, 0, 1, 0, 1, _ 0, 1, 1, 1, 1, _ 0, 0, 0, 0, 1, _ 0, 0, 0, 0, 1, _ 1} 'Pola Angka 5 contohData(4) = New Integer() _ {1, 1, 1, 1, 1, _ 1, 0, 0, 0, 0, _ 1, 1, 1, 1, 0, _ 0, 0, 0, 0, 1, _ 1, 1, 1, 1, 0, _ 0}
Selanjutnya ada pola baru yang ingin diketahui hasilnya
Maka tentukan pola baru ini cocok dengan pola yang mana
Diasumsikan pola baru adalah sebagai berikut:
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | |||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ||||||||||||||||||||||
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
Contoh data baru yang akan dihitung adalah sebagai berikut:
Dim dataBaru As Integer()() = New Integer(1)() {} 'Pola Baru 1 = Pola angka 6 dataBaru(0) = New Integer() _ {0, 1, 1, 1, 0, _ 1, 0, 0, 0, 0, _ 1, 1, 1, 1, 0, _ 1, 0, 0, 0, 1, _ 1, 1, 1, 1, 0} 'Pola Baru 2 = Pola angka 7 dataBaru(1) = New Integer() _ {1, 1, 1, 1, 1, _ 0, 0, 0, 1, 1, _ 0, 0, 1, 0, 0, _ 0, 0, 1, 0, 0, _ 0, 0, 1, 0, 0} 'Pola Baru 3 = Pola angka 8 dataBaru(2) = New Integer() _ {0, 1, 1, 1, 0, _ 1, 0, 0, 0, 1, _ 0, 1, 1, 1, 0, _ 1, 0, 0, 0, 1, _ 0, 1, 1, 1, 0} 'Pola Baru 4 = Pola angka 9 dataBaru(3) = New Integer() _ {0, 1, 1, 1, 0, _ 1, 0, 0, 0, 1, _ 0, 1, 1, 1, 1, _ 0, 0, 0, 0, 1, _ 0, 1, 1, 1, 0} 'Pola Baru 5 = Pola angka 0 dataBaru(4) = New Integer() _ {0, 1, 1, 1, 0, _ 1, 0, 0, 0, 1, _ 1, 0, 0, 0, 1, _ 1, 0, 0, 0, 1, _ 0, 1, 1, 1, 0}
Sebelum masuk kedalam langkah-langkah pembahasan algoritma, ada beberapa konstanta atau parameter yang harus diketahui, yaitu:
* Tentukan jumlah dimensi pola contoh angka yang digunakan
Diasumsikan dalam kasus ini, jumlah dimensi pola adalah 5, karena setiap pola angka berdimensi 5 x 5
Const jumlahDimensiPola As Integer = 5
Langkah-langkah penggunaan algoritma ini adalah
1. Masukkan contoh pola angka kedalam variabel yang dibutuhkan
Tidak semua contoh pola digunakan sebagai data pembelajaran pada masing-masing pola baru,
melainkan hanya 3 data yang paling memiliki kemiripan dengan masing-masing pola baru
1a. Lakukan perhitungan pada masing-masing contoh data (poin 1a1 – 1a2)
1a1. Hitung jumlah data yang sama antara data baru dengan masing-masing contoh data
Dim JumlahNilaiSama As Integer = 0 For jDataBaru As Integer = 0 To dataBaru(i).Length - 1 If dataBaru(i)(jDataBaru) = contohData(iContohData)(jDataBaru) Then JumlahNilaiSama += 1 Next
1a2. Tentukan 3 contoh pola angka yang memiliki kemiripan dengan pola baru yang sedang dihitung
bobot = alpha * delta * nilai contoh data (0 atau 1)
If maksJumlahNilaiSama(2) < JumlahNilaiSama Then If maksJumlahNilaiSama(0) < JumlahNilaiSama Then maksJumlahNilaiSama(2) = maksJumlahNilaiSama(1) maksJumlahNilaiSama(1) = maksJumlahNilaiSama(0) maksJumlahNilaiSama(0) = JumlahNilaiSama ElseIf maksJumlahNilaiSama(1) < JumlahNilaiSama Then maksJumlahNilaiSama(2) = maksJumlahNilaiSama(1) maksJumlahNilaiSama(1) = JumlahNilaiSama ElseIf maksJumlahNilaiSama(2) < JumlahNilaiSama Then maksJumlahNilaiSama(2) = JumlahNilaiSama End If If idxContohData(0) < iContohData Then idxContohData(2) = idxContohData(1) idxContohData(1) = idxContohData(0) idxContohData(0) = iContohData ElseIf idxContohData(1) < iContohData Then idxContohData(2) = idxContohData(1) idxContohData(1) = iContohData ElseIf idxContohData(2) < iContohData Then idxContohData(2) = iContohData End If End If
1b. Lakukan perhitungan pada 3 contoh data yang telah terpilih (poin 1b1 – 1b4)
1b1. Buat neuron baru
Dim n As New Neuron()
1b2. Tentukan state / keadaan dari masing-masing neuron apakah bernilai -1 atau +1
If contohData(idxContohData(iContohData))(j * jumlahDimensiPola + k) = 1 Then n.State = StateNeuron.Melebihi0 Else n.State = StateNeuron.TidakMelebihi0 End If
1b3. Rangkai neuron-neuron yang sudah dihitung ke dalam sebuah pola
pola.Add(n)
1b4. Tambahkan pola yang didapatkan ke dalam matriks T
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
HN.TambahKeMatriksT(pola)
* Gunakan fungsi ini untuk memasukkan pola yang digunakan ke dalam matriks T
Nilai pada posisi diagonal matriks tersebut akan selalu bernilai 0
Sisanya dihitung dengan perkalian antara s(i) * s(j)
dimana s(i) = state pola neuron pada indeks ke i
dan s(j) = state pola neuron pada indeks ke j
Public Sub TambahKeMatriksT(pola As List(Of Neuron)) For i As Integer = 0 To m_JumlahNeuron - 1 For j As Integer = 0 To m_JumlahNeuron - 1 If i = j Then T(i, j) = 0 Else T(i, j) += (pola(i).State * pola(j).State) End If Next Next End Sub
2. Lakukan perhitungan pada masing-masing data baru (poin 2a – 2d)
2a. Buat neuron baru
Dim n As New Neuron()
2b. Tentukan state / keadaan dari masing-masing neuron apakah bernilai -1 atau +1
Dim p As Integer = dataBaru(i)(j * jumlahDimensiPola + k) If p = 1 Then n.State = StateNeuron.Melebihi0 Else n.State = StateNeuron.TidakMelebihi0 End If
2c. Rangkai neuron-neuron yang sudah dihitung menjadi sebuah state / keadaan awal
StateAwal.Add(n)
2d. Lakukan perhitungan data baru menggunakan state awal neuron yang sudah ditemukan sebelumnya
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
HN.Hitung(StateAwal, dataBaru(i))
Memasuki perhitungan pada fungsi Hitung
2d1. Lakukan perhitungan selama masih ada neuron yang berubah state / keadaan
2d1a. Lakukan perhitungan pada semua neuron (poin 2d1a1 – 2d1a3)
For i As Integer = 0 To m_JumlahNeuron - 1 . . .
2d1a1. Hitung total jumlah dari W(i,j) * s(i)
For j As Integer = 0 To m_JumlahNeuron - 1 h += T(i, j) * (m_daftarNeuron(j).State) Next
2d1a2. Cek neuron tersebut apakah berubah state / keadaan
Perubahan state adalah keadaan dimana nilai neuron tersebut berubah tanda (dari positif ke negatif atau dari negatif ke positif)
If m_daftarNeuron(i).isStateBerubah(h) Then . . .
* Gunakan fungsi ini untuk menentukan apakah neuron ini berubah state / keadaaan nya
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
Public Function isStateBerubah(data As Double) As Boolean If data * m_state < 0 Then m_state = -m_state Return True End If Return False End Function
2d1a3. Apabila neuron tersebut berubah state / keadaan,
Maka hitung energi yang baru,
Kemudian lakukan perubahan data baru untuk dataBaru
HitungEnergi() UpdateDataBaru(i, dataBaru)
* Gunakan fungsi ini untuk menghitung nilai energi pada jaringan Hopfield
Nilai Energi dihitung dengan rumus:
Energi = -(1/2) * E(W(i,j) * s(i) * s(j))
dimana s(i) = state neuron pada indeks ke i
dan s(j) = state neuron pada indeks ke j
Penjelasan lebih detail tentang fungsi ini dapat dilihat pada penjelasan skrip dibawah ini
Private Sub HitungEnergi() Dim tmp As Double = 0 'Hitung E(W(i,j) * s(i) * s(j)) For i As Integer = 0 To m_JumlahNeuron - 1 For j As Integer = 0 To m_JumlahNeuron - 1 If i <> j Then tmp += T(i, j) * m_daftarNeuron(i).State * m_daftarNeuron(j).State End If Next Next 'Hitung -(1/2) * E(W(i,j) * s(i) * s(j)) m_energi = -(1 / 2) * tmp End Sub
* Gunakan fungsi ini untuk mengupdate data baru
Data pada posisi tertentu, apabila bernilai 1 akan diubah menjadi 0, dan sebaliknya data yang bernilai 0 akan diubah menjadi 1
Public Sub UpdateDataBaru(ByVal idxNeuron As Integer, ByRef dataBaru() As Integer) If dataBaru(idxNeuron) = 1 Then dataBaru(idxNeuron) = 0 ElseIf dataBaru(idxNeuron) = 0 Then dataBaru(idxNeuron) = 1 End If End Sub
2d2. Lakukan proses perhitungan energi sekali lagi sebagai nilai energi dari neuron akhir
Penjelasan fungsi Hitung Energi sudah dijelaskan pada perhitungan sebelumnya
HitungEnergi()
* Agar dapat menjalankan skrip diatas, maka diperlukan sebuah 4 buah class
Class Neuron digunakan untuk menampung data state / keadaan neuron tersebut
Class StateNeuron digunakan untuk membatasi nilai state / keadaan dari sebuah neuron, apakah bernilai -1 atau +1
Class EnergiNeuron digunakan untuk menampung nilai energi dan menyimpan indeks neuron yang mengalami perubahan state / keadaan
Class HopfieldNetwork sebagai class utama untuk melakukan perhitungan data
Deklarasi masing-masing class adalah sebagai berikut:
Public Class Neuron Private m_state As Integer 'State / keadaan dari sebuah neuron Public Property State() As Integer Get Return m_state End Get Set(value As Integer) m_state = value End Set End Property Public Sub New() Dim r As Integer = New Random().[Next](2) Select Case r Case 0 m_state = StateNeuron.Melebihi0 Case 1 m_state = StateNeuron.TidakMelebihi0 End Select End Sub . . . End Class Public NotInheritable Class StateNeuron Public Shared Melebihi0 As Integer = 1 Public Shared TidakMelebihi0 As Integer = -1 End Class Public Class EnergiNeuron Private m_energi As Double 'Nilai energi pada Jaringan Hopfield Private m_idxNeuron As Integer 'Indeks neuron, dimana setiap state / keadaan yang berubah akan menurunkan nilai energi Public ReadOnly Property Energi() As Double Get Return m_energi End Get End Property Public ReadOnly Property idxNeuron() As Integer Get Return m_idxNeuron End Get End Property Public Sub New(Energi As Double, idxNeuron As Integer) Me.m_energi = Energi Me.m_idxNeuron = idxNeuron End Sub End Class Public Class HopfieldNetwork Private m_daftarNeuron As List(Of Neuron) Private m_JumlahNeuron As Integer Private m_energi As Double Private T As Integer(,) 'Menyimpan bobot kekuatan koneksi antar neuron Public ReadOnly Property JumlahNeuron() As Integer Get Return m_JumlahNeuron End Get End Property Public ReadOnly Property Energi() As Double Get Return m_energi End Get End Property Public Sub New(jumlahNeuron As Integer) m_JumlahNeuron = jumlahNeuron m_daftarNeuron = New List(Of Neuron)(jumlahNeuron) For i As Integer = 0 To jumlahNeuron - 1 Dim neuron As New Neuron() neuron.State = 0 m_daftarNeuron.Add(neuron) Next T = New Integer(jumlahNeuron - 1, jumlahNeuron - 1) {} End Sub . . . End Class
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.