Pengenalan Pola (Pattern Recognition) dengan teknik Hopfield Network


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:

1111111111111111
11111111
111111111111111
11111
1111111111111111111

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:

11111111111111111
111111111
11111111111111
11111111
111111111111111

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)

cmd73

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 *