模式识别-----贝叶斯算法(java实现)

来源:互联网 发布:个人网站域名注册 编辑:程序博客网 时间:2024/06/07 11:12
import java.io.*;import java.text.DecimalFormat;import java.util.HashMap;public class TestBys {    public static void main(String[] args) throws IOException {        Classifier classifier = new Classifier();        File file = new File("/home/zy/IdeaProjects/Test/a.txt");        classifier.study(file);        Car car1 = new Car("vhigh","vhigh","2","2","small","low");        Car car2 = new Car("med","low","4","more","big","med");        Car car3=new Car("med","low","4","more","big","high");        System.out.println(classifier.classify(car1));        System.out.println(classifier.classify(car2));        System.out.println(classifier.classify(car3));    }}class Car{    String buy;    String maint;    String door;    String persons;    String safety;    String lug_boot;    public Car(String vhigh, String vhigh1, String s, String s1, String small, String low) {        buy=vhigh;        maint=vhigh1;        door=s;        persons=s1;        safety=low;        lug_boot=small;    }}class Classifier{    DecimalFormat df=new DecimalFormat("0.0000");    DecimalFormat dff=new DecimalFormat("0.0000");    float[] unacc = new float[21];    float[] acc = new float[21];    float[] good = new float[21];    float[] vgood = new float[21];    int pu,pa,pg,pv;    float p1,p2,p3,p4;    HashMap buy = new HashMap<String,Integer>();    HashMap maint = new HashMap<String,Integer>();    HashMap door = new HashMap<String,Integer>();    HashMap persons = new HashMap<String,Integer>();    HashMap Lug_boot = new HashMap<String,Integer>();    HashMap safety = new HashMap<String,Integer>();    Classifier(){        buy.put("vhigh",0);buy.put("high",1);buy.put("med",2);buy.put("low",3);        maint.put("vhigh",4);maint.put("high",5);maint.put("med",6);maint.put("low",7);        door.put("2",8);door.put("3",9);door.put("4",10);door.put("5more",11);        persons.put("2",12);persons.put("4",13);persons.put("more",14);        Lug_boot.put("small",15);Lug_boot.put("med",16);Lug_boot.put("big",17);        safety.put("low",18);safety.put("med",19);safety.put("high",20);    }    public void Fadd(int[] f,int b,int m,int d,int p,int l,int s){        f[b]++;f[m]++;f[d]++;f[p]++;f[l]++;f[s]++;    }    public void study(File file) throws IOException {        int[] usum = new int[21];        int[] asum= new int[21];        int[] gsum = new int[21];        int[] vsum = new int[21];        FileReader fr = new FileReader(file);        BufferedReader br = new BufferedReader(fr);        String str;        while((str=br.readLine())!=null){            String[] strings=str.split(",");            int b= (int) buy.get(strings[0]);            int m= (int) maint.get(strings[1]);            int d= (int) door.get(strings[2]);            int p= (int) persons.get(strings[3]);            int l= (int) Lug_boot.get(strings[4]);            int s= (int) safety.get(strings[5]);            String type = strings[6];            switch (type){                case "":                    break;                case "unacc":                    Fadd(usum,b,m,d,p,l,s);pu++;                    break;                case "acc":                    Fadd(asum,b,m,d,p,l,s);pa++;                    break;                case "good":                    Fadd(gsum,b,m,d,p,l,s);pg++;                    break;                case "vgood":                    Fadd(vsum,b,m,d,p,l,s);pv++;                    break;            }        }        for(int i=0;i<21;i++){            unacc[i]= Float.parseFloat(df.format((float)usum[i]/pu));            acc[i]= Float.parseFloat(df.format((float)asum[i]/pa));            good[i]= Float.parseFloat(df.format((float)gsum[i]/pg));            vgood[i]= Float.parseFloat(df.format((float)vsum[i]/pv));        }        p1= Float.parseFloat(df.format((float)pu/(pa+pu+pg+pv)));        p2= Float.parseFloat(df.format((float)pa/(pa+pu+pg+pv)));        p3= Float.parseFloat(df.format((float)pg/(pa+pu+pg+pv)));        p4= Float.parseFloat(df.format((float)pv/(pa+pu+pg+pv)));    }    public String classify(Car car){        String result=null;        int b= (int) buy.get(car.buy);        int m=(int) maint.get(car.maint);        int d=(int)door.get(car.door);        int p= (int) persons.get(car.persons);        int l= (int) Lug_boot.get(car.lug_boot);        int s= (int) safety.get(car.safety);        float pun = unacc[b]*unacc[m]*unacc[d]*unacc[p]*unacc[l]*unacc[s]*p1;        float pac = acc[b]*acc[m]*acc[d]*acc[p]*acc[l]*acc[s]*p2;        float pgo = good[b]*good[m]*good[d]*good[p]*good[l]*good[s]*p3;        float pvg = vgood[b]*vgood[m]*vgood[d]*vgood[p]*vgood[l]*vgood[s]*p4;        float[] index = new float[]{          pun,pac,pgo,pvg        };        float max=0;        int num=0;        for(int i=0;i<4;i++){            if(index[i]>max){                max=index[i];                num=i;            }        }        switch (num){            case 0:                result="unacc";                break;            case 1:                result= "acc";                break;            case 2:                result= "good";                break;            case 3:                result="vgood";                break;        }        return result;    }}