Penjelasan dan Inputan Data Perceptron Perceptron adalah salah satu metode JST training yang sederhana dipakaikan prosedur algoritma training yang pertama kali. Terdiri dari neuron tunggal dengan bobot synaptic yang diatur menggunakan fungsi aktifasi hard limit. Perceptron lebih powerful dari Hebb. Pembelajaran perceptron mampu menemukan konvergensi terhadap bobot yang benar.
Data yang Diinputkan Pola aksara jawa “wa” berdimensi “wa” berdimensi 5x10 yang diinputkan menggunakan excel seperti dibawah ini: 1. Pola 1
2. Pola 2
3. Pola 3
4. Pola 4
5. Pola 5
6. Pola 6
7. Pola 7
8. Pola 8
Penjelasan Koding 1. Source code utama program public Perceptron() throws IOException, BiffException { read();//membaca file excel mInput = new Matrix(input); mTY = new Matrix(target.length, 3); for (int i = 0; i < target.length; i++) { mTY.isiMatrix(i, 0, target[i]); } mBobot = new Matrix(input.length, (input[0].length + 1));//+1 untuk alokasi b(bias) mDeltaBobot = new Matrix(mBobot.getBaris(), mBobot.getKolom());//alokasi sama dengan mBobot (matrix bobot) bobotAkhir = new float[mBobot.getKolom()];//alokasi bobot akhir dan bias akhir kondisiTerbaik = new float[3];//indeks 0 untuk menyimpan alfa, indeks 1 untuk menyimpan teta, indeks 2 untuk menyimpan epoch, epoch = 0; } public void startPerhitungan() { perhitungan(1, 0.1f); kondisiTerbaik[0] = 1; kondisiTerbaik[1] = 0.1f; kondisiTerbaik[2] = epoch; if (epoch != 2f) { for (float alf = 0.9f; alf > 0; alf -= 0.1) { for (float tta = 0.03f; tta < 1; tta += 0.2) { epoch = 0; perhitungan(alf, tta); if (epoch == 2) { kondisiTerbaik[0] = alf; kondisiTerbaik[1] = tta; kondisiTerbaik[2] = epoch; break; } else { cariTerbaik(alf, tta, epoch); } } } } printHasil(bobotAkhir); }
private void cariTerbaik(float alfa, float teta, float iter) { if (iter < kondisiTerbaik[2]) { kondisiTerbaik[0] = alfa; kondisiTerbaik[1] = teta; kondisiTerbaik[2] = iter; } } private void perhitungan(float alfa, float teta) { this.alfa = alfa; this.teta = teta; do { for (int i = 0; i < mInput.getBaris(); i++) { mTY.isiMatrix(i, 1, hitungY_in(i)); mTY.isiMatrix(i, 2, hitungY(mTY.getData(i, 1))); for (int j = 0; j < mBobot.getKolom() - 1; j++) { mDeltaBobot.isiMatrix(i, j, hitungDeltaW(i, j)); mBobot.isiMatrix(i, j, hitungW(i, j)); } int k = mDeltaBobot.getKolom() - 1; mDeltaBobot.isiMatrix(i, k, hitungDelta_b(i, k)); mBobot.isiMatrix(i, k, hitungW(i, k)); } for (int j = 0; j < mBobot.getKolom(); j++) { bobotAkhir[j] = mBobot.getData(mBobot.getBaris() - 1, j); } ++epoch; System.out.println("epoch : " + epoch); System.out.println("TY :"); printMatrix(mTY.getDataMatrix()); System.out.println("Delta W :"); printMatrix(mDeltaBobot.getDataMatrix()); System.out.println("Bobot :"); printMatrix(mBobot.getDataMatrix()); } while (isBobotBerubah()); } private boolean isBobotBerubah() { for (int i = 0; i < mDeltaBobot.getBaris(); i++) { for (int j = 0; j < mDeltaBobot.getKolom(); j++) { if (mDeltaBobot.getData(i, j) != 0) { return true; } } } return false; } private float hitungY_in(int baris) { float y_in = 0; if (baris == 0) {
for (int j = 0; j < mInput.getKolom(); j++) { y_in += (mInput.getData(baris, j) * bobotAkhir[j]);//y_in += Xi*Wi } y_in += bobotAkhir[bobotAkhir.length - 1];//y_in += b } else { for (int j = 0; j < mInput.getKolom(); j++) { y_in += (mInput.getData(baris, j) * mBobot.getData(baris - 1, j));//y_in += Xi*Wi } y_in += mBobot.getData(baris, mBobot.getKolom() 1);//y_in += b } return y_in; } private int hitungY(float y_in) { if (y_in > teta) { return 1; } else if (y_in < -teta) { return -1; } else { return 0; } } private float hitungDeltaW(int i, int j) { if (mTY.getData(i, 0) == mTY.getData(i, 2)) { return 0; } else { return alfa * mTY.getData(i, 0) * mInput.getData(i, j);//return alfa*teta*Xi } } private float hitungDelta_b(int i, int j) { if (mTY.getData(i, 0) == mTY.getData(i, 2)) { return 0; } else { return alfa * mTY.getData(i, 0);//return alfa*teta } } private float hitungW(int i, int j) { if (i == 0) { return mDeltaBobot.getData(i, j) + bobotAkhir[j]; } else { return mDeltaBobot.getData(i, j) + mBobot.getData(i 1, j); } } public boolean isWa(int testing[]){ float y_in =0; for(int i =0;i
y_in += (testing[i] * bobotAkhir[i]);//y_in+=testing_i*Wi } y_in += bobotAkhir[bobotAkhir.length-1];//y_in+=b return y_in >= 0; } public float getAlfa(){ return kondisiTerbaik[0]; } public float getTeta(){ return kondisiTerbaik[1]; } public int getEpoch(){ return (int)kondisiTerbaik[2]; } public float[] getBobotAkhir(){ return bobotAkhir; }
Screenshot Program 1. Screenshot Awal Tampilan saat pertama kali menjalankan program
2. Screenshot Hasil Tampilan setelah dilakukan proses learning
3. Screenshot Pengenalan “ Wa ” Tampilan program ketika diinputkan pola huruf “Wa“
4. Screenshot pengenalan bukan aksara “Wa” Tampilan ketika diinputkan bukan pola “Wa”