朴素贝叶斯算法Java 实现

对于朴素贝叶斯算法相信做数据挖掘和推荐系统的小伙们都耳熟能详了,算法原理我就不啰嗦了。我主要想通过java代码实现朴素贝叶斯算法,思想:

1. 用javabean +Arraylist 对于训练数据存储

2. 对于样本数据训练

具体的代码如下:

[html]  view plain  copy
  1. package NB;  
  2. /**  
  3.  * 训练样本的属性 javaBean  
  4.  *  
  5.  */  
  6. public class JavaBean {  
  7.   int age;  
  8.   String income;  
  9.   String student;  
  10.   String credit_rating;  
  11.   String buys_computer;  
  12.  public JavaBean(){  
  13.        
  14.  }  
  15. public JavaBean(int age,String income,String student,String credit_rating,String buys_computer){  
  16.     this.age=age;  
  17.     this.income=income;  
  18.     this.student=student;  
  19.     this.credit_rating=credit_rating;  
  20.     this.buys_computer=buys_computer;  
  21. }  
  22.     
  23.     
  24. public int getAge() {  
  25.     return age;  
  26. }  
  27. public void setAge(int age) {  
  28.     this.age = age;  
  29. }  
  30. public String getIncome() {  
  31.     return income;  
  32. }  
  33. public void setIncome(String income) {  
  34.     this.income = income;  
  35. }  
  36. public String getStudent() {  
  37.     return student;  
  38. }  
  39. public void setStudent(String student) {  
  40.     this.student = student;  
  41. }  
  42. public String getCredit_rating() {  
  43.     return credit_rating;  
  44. }  
  45. public void setCredit_rating(String credit_rating) {  
  46.     this.credit_rating = credit_rating;  
  47. }  
  48. public String getBuys_computer() {  
  49.     return buys_computer;  
  50. }  
  51. public void setBuys_computer(String buys_computer) {  
  52.     this.buys_computer = buys_computer;  
  53. }  
  54.   
  55.   
  56.   
  57. @Override  
  58. public String toString() {  
  59.     return "JavaBean [age=" + age + "income=" + income + "student="  
  60.             + student + ", credit_rating=" + credit_rating + "buys_computer="  
  61.             + buys_computer + "]";  
  62. }  
  63.   
  64.     
  65.     
  66.     
  67.     
  68. }  
算法实现的部分:

[html]  view plain  copy
  1. package NB;  
  2.   
  3. import java.io.BufferedReader;  
  4. import java.io.File;  
  5. import java.io.FileReader;  
  6. import java.util.ArrayList;  
  7.   
  8. public class TestNB {  
  9.   
  10.     /**data_length  
  11.      * 算法的思想  
  12.      */  
  13.     public static  ArrayList<JavaBean> list = new ArrayList<JavaBean>();;  
  14.     static int data_length=0;  
  15.     public static void main(String[] args) {  
  16.         // 1.读取数据,放入list容器中  
  17.         File file = new File("E://test.txt");  
  18.         txt2String(file);  
  19.         //数据测试样本  
  20.         testData(25,"Medium","Yes","Fair");  
  21.     }  
  22.     // 读取样本数据  
  23.     public static void txt2String(File file) {  
  24.           
  25.         try {  
  26.             BufferedReader br = new BufferedReader(new FileReader(file));// 构造一个BufferedReader类来读取文件  
  27.             String s = null;  
  28.             while ((s = br.readLine()) != null) {// 使用readLine方法,一次读一行  
  29.                 data_length++;   
  30.                 splitt(s);  
  31.             }  
  32.             br.close();  
  33.         } catch (Exception e) {  
  34.             e.printStackTrace();  
  35.         }  
  36.           
  37.     }  
  38.     // 存入ArrayList中  
  39.       public static void splitt(String str){  
  40.              
  41.             String strr = str.trim();  
  42.             String[] abc = strr.split("[\\p{Space}]+");  
  43.             int age=Integer.parseInt(abc[0]);  
  44.             JavaBean bean=new JavaBean(age, abc[1], abc[2], abc[3], abc[4]);  
  45.             list.add(bean);       
  46.              
  47.              
  48.         }  
  49.       // 训练样本,测试  
  50.       public static void testData(int age,String a,String b,String c){  
  51.           //训练样本    
  52.           int number_yes=0;  
  53.           int bumber_no=0;  
  54.             
  55.          // age情况 个数  
  56.           int num_age_yes=0;  
  57.           int num_age_no=0;  
  58.           // income   
  59.           int num_income_yes=0;  
  60.           int num_income_no=0;  
  61.           // student   
  62.           int num_student_yes=0;  
  63.           int num_stdent_no=0;  
  64.           //credit  
  65.           int num_credit_yes=0;  
  66.           int num_credit_no=0;  
  67.             
  68.           //遍历List 获得数据  
  69.           for(int i=0;i<list.size();i++){  
  70.             JavaBean bb=list.get(i);  
  71.             if(bb.getBuys_computer().equals("Yes")){ //Yes  
  72.                 number_yes++;  
  73.                 if(bb.getIncome().equals(a)){//income  
  74.                     num_income_yes++;  
  75.                 }  
  76.                 if(bb.getStudent().equals(b)){//student  
  77.                     num_student_yes++;  
  78.                 }  
  79.                 if(bb.getCredit_rating().equals(c)){//credit  
  80.                     num_credit_yes++;  
  81.                 }  
  82.                 if(bb.getAge()==age){//age  
  83.                     num_age_yes++;  
  84.                 }  
  85.                   
  86.                   
  87.             }else {//No  
  88.                 bumber_no++;  
  89.                 if(bb.getIncome().equals(a)){//income  
  90.                     num_income_no++;  
  91.                 }  
  92.                 if(bb.getStudent().equals(b)){//student  
  93.                     num_stdent_no++;  
  94.                 }  
  95.                 if(bb.getCredit_rating().equals(c)){//credit  
  96.                     num_credit_no++;  
  97.                 }  
  98.                 if(bb.getAge()==age){//age  
  99.                     num_age_no++;  
  100.                 }  
  101.                   
  102.             }    
  103.           }  
  104.             
  105.             System.out.println("购买的历史个数:"+number_yes);  
  106.             System.out.println("不买的历史个数:"+bumber_no);  
  107.               
  108.             System.out.println("购买+age:"+num_age_yes);  
  109.             System.out.println("不买+age:"+num_age_no);  
  110.               
  111.             System.out.println("购买+income:"+num_income_yes);  
  112.             System.out.println("不买+income:"+num_income_no);  
  113.               
  114.             System.out.println("购买+stundent:"+num_student_yes);  
  115.             System.out.println("不买+student:"+num_stdent_no);  
  116.               
  117.             System.out.println("购买+credit:"+num_credit_yes);  
  118.             System.out.println("不买+credit:"+num_credit_no);  
  119.               
  120.              概率判断  
  121.             double buy_yes=number_yes*1.0/data_length; // 买的概率  
  122.             double buy_no=bumber_no*1.0/data_length; //  不买的概率  
  123.             System.out.println("训练数据中买的概率:"+buy_yes);  
  124.             System.out.println("训练数据中不买的概率:"+buy_no);  
  125.             /// 未知用户的判断  
  126.             double nb_buy_yes=(1.0*num_age_yes/number_yes)*(1.0*num_income_yes/number_yes)*(1.0*num_student_yes/number_yes)*(1.0*num_credit_yes/number_yes)*buy_yes;         
  127.             double nb_buy_no=(1.0*num_age_no/bumber_no)*(1.0*num_income_no/bumber_no)*(1.0*num_stdent_no/bumber_no)*(1.0*num_credit_no/bumber_no)*buy_no;         
  128.             System.out.println("新用户买的概率:"+nb_buy_yes);  
  129.             System.out.println("新用户不买的概率:"+nb_buy_no);  
  130.             if(nb_buy_yes>nb_buy_no){  
  131.                 System.out.println("新用户买的概率大");  
  132.             }else {  
  133.                 System.out.println("新用户不买的概率大");  
  134.             }      
  135.       }     
  136. }  

对于样本数据:

[html]  view plain  copy
  1. 25  High    No  Fair       No  
  2. 25  High    No  Excellent  No  
  3. 33  High    No  Fair       Yes  
  4. 41  Medium  No  Fair       Yes       
  5. 41  Low     Yes Fair       Yes  
  6. 41  Low     Yes Excellent  No  
  7. 33  Low     Yes Excellent  Yes  
  8. 25  Medium  No  Fair       No  
  9. 25  Low     Yes Fair       Yes  
  10. 41  Medium  Yes Fair       Yes  
  11. 25  Medium  Yes Excellent  Yes  
  12. 33  Medium  No  Excellent  Yes  
  13. 33  High    Yes Fair       Yes  
  14. 41  Medium  No  Excellent  No  

对于未知用户的数据得出的结果:

[html]  view plain  copy
  1. 购买的历史个数:9  
  2. 不买的历史个数:5  
  3. 购买+age:2  
  4. 不买+age:3  
  5. 购买+income:4  
  6. 不买+income:2  
  7. 购买+stundent:6  
  8. 不买+student:1  
  9. 购买+credit:6  
  10. 不买+credit:2  
  11. 训练数据中买的概率:0.6428571428571429  
  12. 训练数据中不买的概率:0.35714285714285715  
  13. 新用户买的概率:0.028218694885361547  
  14. 新用户不买的概率:0.006857142857142858  
  15. 新用户买的概率大  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值