朴素贝叶斯算法:
import java.util.List;
//计算不同分类的先验概率与条件概率乘积
public class Probability {
public double[] Priori(List<Object[]> list,Object[] objects, Object[] y){
int n = objects.length;
double[] p = new double[y.length];
for(int k = 0; k <y.length; k ++){
double pp[] = new double[objects.length];
double num = 0;
for (int i = 0; i < list.size(); i++) {
if (list.get(i)[n] == y[k]) {
num = num + 1;
}
}
p[k] = num / list.size();
pp = condition(list,objects,y[k],num);
double result = 1;
for(int m =0 ; m < pp.length; m++){
result = result * pp[m];
}
p[k] = p[k] * result;
}
return p;
}
//计算条件概率
public double[] condition(List<Object[]> list,Object[] objects, Object y, double num){
int n = objects.length;
double[] pp = new double[objects.length];
for(int m =0 ; m<objects.length; m ++){
double nums =0;
for(int i = 0; i <list.size(); i ++) {
if (list.get(i)[n] == y) {
if(list.get(i)[m] == objects[m]){
nums++;
}
}
}
pp[m] = nums/num;
}
return pp;
}
}
//返回分类结果
public class Result {
public Object output(double[] p, Object[] y){
int max = 0;
for( int i = 1; i < p.length ; i ++){
if(p[i] > p[max]){
max = i;
}
}
return y[max];
}
}
//例子
import java.util.ArrayList;
import java.util.List;
public class test {
public static void main(String[] args) {
int[] A1= new int[]{1,2,3};
char[] A2 = new char[]{'S','M','L'};
Object[] y = new Object[]{1,-1};
Object[] o1 = new Object[]{A1[0],A2[0],y[1]};
Object[] o2 = new Object[]{A1[0],A2[1],y[1]};
Object[] o3 = new Object[]{A1[0],A2[1],y[0]};
Object[] o4 = new Object[]{A1[0],A2[0],y[0]};
Object[] o5 = new Object[]{A1[0],A2[0],y[1]};
Object[] o6 = new Object[]{A1[1],A2[0],y[1]};
Object[] o7 = new Object[]{A1[1],A2[1],y[1]};
Object[] o8 = new Object[]{A1[1],A2[1],y[0]};
Object[] o9 = new Object[]{A1[1],A2[2],y[0]};
Object[] o10 = new Object[]{A1[1],A2[2],y[0]};
Object[] o11 = new Object[]{A1[2],A2[2],y[0]};
Object[] o12 = new Object[]{A1[2],A2[1],y[0]};
Object[] o13 = new Object[]{A1[2],A2[1],y[0]};
Object[] o14 = new Object[]{A1[2],A2[2],y[0]};
List<Object[]> list = new ArrayList<Object[]>();
list.add(o1);
list.add(o2);
list.add(o3);
list.add(o4);
list.add(o5);
list.add(o6);
list.add(o7);
list.add(o8);
list.add(o9);
list.add(o10);
list.add(o11);
list.add(o12);
list.add(o13);
list.add(o14);
Object[] x = new Object[]{2,'S'};
Probability p = new Probability();
double[] pp = p.Priori(list,x,y);
System.out.println("该点的类标记应该是:");
System.out.println(new Result().output(pp,y));
}
}