Bismillah…
Sempat pada beberapa waktu yang lalu ada pengunjung blog saya meminta untuk membahas sebuah materi tentang algoritma Naive Bayes. Kemudian dialanjutkan dengan membuat contoh perhitungan sederhana algoritma tersebut menggunakan bahasa java. Dan alhamdulillah, sekarang saya bisa menyempatkan waktu untuk menulis materi yang dimintanya tersebut.
Seperti diketahui bahwa Naive Bayes adalah salah satu machine learning yang sampai saat ini masih digunakan untuk kasus klasifikasi data. Naive Bayes ditemukan oleh seorang ilmuan Inggris bernama Thomas Bayes. Pada perhitungannya, Naive Bayes menggunakan probabilitas dengan konsep dasar Teorema Bayes, yaitu teorema dalam ilmu statistik untuk menghitung peluang sebuah kejadian.
Teori Bayesian : Sebagai Dasar
Berikut ini adalah contoh sampel data yang akan kita gunakan untuk perhitungan algoritma Naive Bayes.
Kemudian jika ada sebuah data baru yang belum memiliki kelas misalnya : x = (age<=30, income = medium, student = yes, credit_rating = fair), maka kelas dari data baru ini dapat dicari dengan cara berikut :
Nah, sesudah tahu langkah perhitungannya selanjutnya adalah implementasi algoritma diatas kedalam program java. Data sampel diatas akan kita ambil dari database langsung. Untuk mengunduh data tersebut dalam format .sql bisa membuka link ini http://adf.ly/1fy60F. Jika sudah langsung saja kita ikuti langkah-langkah pembuatannya :
Demikianlah tutorial Algoritma Naive Bayes Classifier Menggunakan Java. Semoga ada manfaatnya bagi anda dan saya. Jika ada pertanyaan mengenai tutorial diatas, silahkan bertanya melalui form komentar dibawah. Kemudian jika ingin meng-update secara rutin artikel yang kami posting dari blog ini, silahkan isi email anda pada isian Follow by Email dibawah.
Project program diatas bisa anda unduh melalui link ini http://adf.ly/1fusYL.
Terima kasih... wassalam
Sempat pada beberapa waktu yang lalu ada pengunjung blog saya meminta untuk membahas sebuah materi tentang algoritma Naive Bayes. Kemudian dialanjutkan dengan membuat contoh perhitungan sederhana algoritma tersebut menggunakan bahasa java. Dan alhamdulillah, sekarang saya bisa menyempatkan waktu untuk menulis materi yang dimintanya tersebut.
Seperti diketahui bahwa Naive Bayes adalah salah satu machine learning yang sampai saat ini masih digunakan untuk kasus klasifikasi data. Naive Bayes ditemukan oleh seorang ilmuan Inggris bernama Thomas Bayes. Pada perhitungannya, Naive Bayes menggunakan probabilitas dengan konsep dasar Teorema Bayes, yaitu teorema dalam ilmu statistik untuk menghitung peluang sebuah kejadian.
Teori Bayesian : Sebagai Dasar
- X adalah data sampel dengan kelas (label) yang tidak diketahui
- H adalah hipotesa bahwa X adalah data dengan kelas (label) C. P(H) adalah peluang dari hipotesa H.
- P(X) adalah peluang data sampel yang akan diamati.
- P(X|H) merupakan peluang data sampel X, bila diasumsikan bahwa hipotesa benar (valid).
- Untuk masalah klasifikasi, yang dihitung adalah P(H|X), yaitu peluang bahwa hipotesa benar (valid) untuk data sampel X yang diamati :
Berikut ini adalah contoh sampel data yang akan kita gunakan untuk perhitungan algoritma Naive Bayes.
Age
|
Income
|
Student
|
Credit
Rating
|
Buy
Com
|
<=30
|
high
|
no
|
fair
|
no
|
<=30
|
high
|
no
|
excellent
|
no
|
31 s.d 40
|
high
|
no
|
fair
|
yes
|
>40
|
medium
|
no
|
fair
|
yes
|
>40
|
low
|
yes
|
fair
|
yes
|
31 s.d 40
|
low
|
yes
|
excellent
|
yes
|
<=30
|
medium
|
no
|
fair
|
no
|
<=30
|
low
|
yes
|
fair
|
yes
|
>40
|
medium
|
yes
|
fair
|
yes
|
<=30
|
medium
|
yes
|
excellent
|
yes
|
31 s.d 40
|
medium
|
no
|
excellent
|
yes
|
31 s.d 40
|
high
|
yes
|
fair
|
yes
|
>40
|
medium
|
no
|
excellent
|
no
|
Kemudian jika ada sebuah data baru yang belum memiliki kelas misalnya : x = (age<=30, income = medium, student = yes, credit_rating = fair), maka kelas dari data baru ini dapat dicari dengan cara berikut :
- Hitung P(Xk|Ci) untuk setiap kelas i :
P(age<=30 | buy_com = yes) = 2/9 = 0.222
P(age<=30 | buy_com = no) = 3/5 = 0.6
P(income = medium | buy_com = yes) = 4/9 = 0.444
P(income = medium | buy_com = no) = 2/5 = 0.4
P(student = yes | buy_com = yes) = 6/9 = 0.667
P(student = yes | buy_com = no) = 1/5 = 0.2
P(credit_rating = fair | buy_com = yes) = 6/9 = 0.667
P(credit_rating = fair | buy_com = no ) = 2/5 = 0.4
- Hitung P(X|Ci) untuk setiap kelas.
P(X|buy_com = yes) = 0.222*0.444*0.667*0.667 = 0.044
P(X|buy_com = no) = 0.6*0.4*0.2*0.4 = 0.019
- P(X|Ci) * P(Ci)
P(X|buy_com = yes) * P(buy_com = yes) = 0.028
P(X|buy_com = no) * P(buy_com = no) = 0.007 - Sehingga diketahui kelas dari data yang dimasukkan berada pada kelas (yes) karena memiliki nilai probabilitas yang besar.
Nah, sesudah tahu langkah perhitungannya selanjutnya adalah implementasi algoritma diatas kedalam program java. Data sampel diatas akan kita ambil dari database langsung. Untuk mengunduh data tersebut dalam format .sql bisa membuka link ini http://adf.ly/1fy60F. Jika sudah langsung saja kita ikuti langkah-langkah pembuatannya :
- Terlebih dahulu buat kelas Koneksi.java yang digunakan untuk koneksi ke database yang di unduh tadi dan masukkan kode dibawah ini.
Untuk nama database, sesuaikan dengan database yang telah anda buat sebelumnya.import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class Koneksi { public static Connection getConnection(){ Connection con=null; try{ Class.forName("com.mysql.jdbc.Driver"); con=DriverManager.getConnection("jdbc:mysql://localhost:3306/bayes","root",""); } catch(ClassNotFoundException | SQLException e){ e.printStackTrace(); } return con; } }
- Setelah itu buat lagi sebuah kelas dengan nama Key.java. Kelas ini digunakan untuk memasukkan informasi kelas atau label yang terdapat pada database.
public class Key { private int k; private String info; private double value; public Key(){ this.k = 0; this.info = null; this.value = 0; } public Key(int k, String info){ this.k = k; this.info = info; } public Key(int k, String info, double value){ this.k = k; this.info = info; this.value = value; } public int getK(){ return k; } public String getInfo(){ return info; } public double getValue(){ return value; } public void setK(int k) { this.k = k; } public void setInfo(String info) { this.info = info; } public void setValue(double value) { this.value = value; } }
- Setelah itu selanjutnya adalah membuat kelas inti yang memuat algoritma Naive Bayes. Nama kelas ini beri saja dengan nama Bayes.java.
import java.text.DecimalFormat; import java.util.ArrayList; public class Bayes { private Object[][] data; private Object[] category; private Object[][] input; private double[][] temp; public ArrayList
key = new ArrayList<>(); private DecimalFormat df = new DecimalFormat("#.####"); public ArrayList dataBaru = new ArrayList<>(); public Bayes(Object[][] data, Object[] category, Object[][] input, int label, int jlhAtt){ this.data = data; this.category = category; this.input = input; temp = new double[label][jlhAtt]; } public void classify(int sum[]){ int label[]; int total = 0; for(int t = 0; t < sum.length; t++) total+=sum[t]; for(int k = 0; k < input.length; k++){ for(int y = 0; y < input[k].length; y++){ label = new int[sum.length]; for(int i = 0; i < data.length; i++){ for(int j = 0; j < data[i].length; j++){ if(data[i][j].equals(input[k][y])){ for(int v = 0; v < key.size(); v++) if(category[i].equals(key.get(v).getInfo())) label[key.get(v).getK()]++; } } } //P(Xk|Ci) for(int l = 0; l < label.length; l++){ temp[l][y] = (double)label[l]/sum[l]; System.out.println("P(Xk|Ci) variabel ke "+(y+1)+" = " + "("+(double)label[l]+"/"+sum[l]+"="+df.format(temp[l][y])+")"); } System.out.println("------------------------------------------"); } // P(X|Ci) double X[] = new double[sum.length]; for(int i = 0; i < temp.length; i++){ for(int j = 0; j < temp[i].length; j++){ if(j!=0) // (47) X[i] *= (double)temp[i][j]; else X[i] = (double)temp[i][j]; } System.out.println("P(X|Ci) : kelas ke ("+(i+1)+") = "+df.format(X[i])); } System.out.println("------------------------------------------"); // P(X|Ci) * P(Ci) double c[] = new double[sum.length]; for(int i = 0; i < X.length; i++){ c[i] = (double)sum[i]/total; } addNewLabel(c, X, k); } } public void addNewLabel(double c[], double X[], int k){ double max = -1; String info = ""; for(int i = 0; i < c.length; i++){ if(c[i]*X[i] > max){ max = c[i]*X[i]; info = key.get(i).getInfo(); } if(i==c.length-1) dataBaru.add(new Key(k, info, max)); System.out.println("P(X|Ci) * P(Ci) kelas ke ("+(i+1)+") = "+df.format(c[i]*X[i])); } } public ArrayList getNewLabel(){ return dataBaru; } }
- Terakhir buat sebuah kelas dengan nama Main.java untuk mencoba menjalankan algoritma Naive Bayes yang sudah kita buat diatas.
import java.sql.ResultSet; import java.sql.Statement; import java.util.HashSet; import java.util.logging.Level; import java.util.logging.Logger; public class Main { private Object[][] data; private Object[] category; private Object[][] klasifikasi = {{"<=30","medium","yesn","fair"}};// isi data input yang akan di klasifikasi disini private HashSet
hash = new HashSet<>(); int sum[]; private Bayes b; public void read_db()throws Exception{ String Query = "select * from data_bayes"; Statement st = Koneksi.getConnection().createStatement(); ResultSet rs = st.executeQuery(Query); data = new Object[getRow()][5]; System.out.println("Data :"); int i = 0; while(rs.next()){ for(int j = 0; j < data[0].length; j++){ data[i][j] = rs.getString(j+1); System.out.print(data[i][j]+", "); } System.out.println(); i++; } System.out.println("-----------------------------------"); category = new Object[data.length]; for(i = 0; i < data.length; i++){ category[i] = data[i][data[i].length-1]; hash.add(String.valueOf(category[i])); } sum = new int[hash.size()]; } public void proses(){ b= new Bayes(data, category, klasifikasi, hash.size(), 4); if(!b.dataBaru.isEmpty()){ b.dataBaru.clear(); b.key.clear(); } int idx = 0; for(String s:hash){ for(int ii = 0; ii < category.length; ii++){ if(s.equals(String.valueOf(category[ii]))){ sum[idx]+=1; } } b.key.add(new Key(idx, s)); idx++; } b.classify(sum); System.out.println("\nHasil Klasifikasi :"); int row = 0; for(Key key:b.getNewLabel()){ System.out.println("Data ke "+(row+1)+" diklasifikasikan ke kelas :\t"+key.getInfo()); row++; } } public Main(){ try { read_db(); proses(); } catch (Exception ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); } } public int getRow()throws Exception{ int row = 0; String Query = "SELECT COUNT(*) as baris FROM data_bayes"; Statement st = Koneksi.getConnection().createStatement(); ResultSet rs = st.executeQuery(Query); while(rs.next()) row = rs.getInt("baris"); st.close(); rs.close(); return row; } public static void main(String[]args){ new Main(); } }
- Setelah dijalankan terlihat hasilnya seperti gambar dibawah ini :
Demikianlah tutorial Algoritma Naive Bayes Classifier Menggunakan Java. Semoga ada manfaatnya bagi anda dan saya. Jika ada pertanyaan mengenai tutorial diatas, silahkan bertanya melalui form komentar dibawah. Kemudian jika ingin meng-update secara rutin artikel yang kami posting dari blog ini, silahkan isi email anda pada isian Follow by Email dibawah.
Project program diatas bisa anda unduh melalui link ini http://adf.ly/1fusYL.
Terima kasih... wassalam
loading...
Artikel yang menarik sekali nich.
ReplyDeleteNamun koq saya gak bisa donlot ya?
SQL Script nyna gak bisa saya donlot.
DeleteMohon link nya.
Sudah ane perbaiki gan. Silahkan di donlot ulang :)
Deleteuntuk pengguna oracle, langkah connect melalui java nya berbeda atau sama seperti diatas ?
ReplyDeletebro linknya mati tolong upload lg pls
ReplyDeleteterima kasih
ReplyDeleteGan, kalo semisal field pada database di tambahkan.
ReplyDeleteAgar field tersebut terbaca oleh coding.
Perulangannya bayesnya seperti apa y?
gan, linknya kok engga bisa tolong diperbaiki
ReplyDeleteterima kasih
nilai P(Ci) itu mas dapat dimn ? cara dapat nilainya bagaimn ?
ReplyDeletekey yang di kelas bayes kok error ya?
ReplyDeletepembilang persamaan bayes di sisi kanan bukannya p(X|H)*P(H) ?
ReplyDelete