by Abu Zubayr

Algoritma Naive Bayes Classifier Menggunakan Java

algoritma naive bayes classifier menggunakan java
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
  • X adalah data sampel dengan kelas (label) yang tidak diketahui
  • 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 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 :

  1. Terlebih dahulu buat kelas Koneksi.java yang digunakan untuk koneksi ke database yang di unduh tadi dan masukkan kode dibawah ini.
    
    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;
        }
    }
    
    Untuk nama database, sesuaikan dengan database yang telah anda buat sebelumnya.
  2. 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;
        }
    }
    


  3. 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;
        }
    }
    


  4. 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();
        }
    }
    


  5. Setelah dijalankan terlihat hasilnya seperti gambar dibawah ini :
    hasil running naive bayes

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...
Share:

11 comments:

  1. Artikel yang menarik sekali nich.

    Namun koq saya gak bisa donlot ya?

    ReplyDelete
    Replies
    1. SQL Script nyna gak bisa saya donlot.

      Mohon link nya.

      Delete
    2. Sudah ane perbaiki gan. Silahkan di donlot ulang :)

      Delete
  2. untuk pengguna oracle, langkah connect melalui java nya berbeda atau sama seperti diatas ?

    ReplyDelete
  3. bro linknya mati tolong upload lg pls

    ReplyDelete
  4. Gan, kalo semisal field pada database di tambahkan.
    Agar field tersebut terbaca oleh coding.
    Perulangannya bayesnya seperti apa y?

    ReplyDelete
  5. gan, linknya kok engga bisa tolong diperbaiki
    terima kasih

    ReplyDelete
  6. nilai P(Ci) itu mas dapat dimn ? cara dapat nilainya bagaimn ?

    ReplyDelete
  7. key yang di kelas bayes kok error ya?

    ReplyDelete
  8. pembilang persamaan bayes di sisi kanan bukannya p(X|H)*P(H) ?

    ReplyDelete

DigitalOcean Referral Badge
www.domainesia.com
Powered by Blogger.