NBayes.Calculated_probability();//计算概率 NBayes.TestData();//导入测试样本数据 NBayes.show();//输出结果 }
/*汽车属性类 * */
publicclass Property{//汽车有6个属性,每个属性都有几种类别,根据这6个属性来判断汽车的性价比Classvalue如何,
public String buying;//vhigh,high,med,low public String maint;//vhigh,high,med,low public String doors;//2,3,4,5more public String persons;//2,4,more
public String lug_boot;//small ,med,big public String safety;// low,med,high
public String ClassValues;//unacc,acc, good,vgood
public String[] PredictResult = new String[5];// 记录预测结果 public Property(String b,String m,String d,String p,String l,String s,String c){
buying=b;maint=m;doors=d;
persons=p;lug_boot=l;safety=s; ClassValues=c; } };
Vector
Vector
* 文件读写获取训练样本 * */
publicvoid ReadFile(String filename) throws IOException {
BufferedReader br=new BufferedReader(new FileReader(filename)); String temp=null; temp=br.readLine();
String []str = null;
Property TempClass = null; while(temp!=null){
str=temp.split(\);
TempClass=new Property(str[0],str[1],str[2],str[3],str[4],str[5],str[6]); Statistics(TempClass);//统计个数 testTotal++;
temp=br.readLine(); } br.close(); } /*
* 统计每一项的个数vhigh,vhigh,2,2,small,low,unacc * */
publicvoid Statistics(Property car){ for(inti=0;i<4;i++){
if(car.ClassValues.equals(ClassValueName[i])){ ClassValues[i]++; //vhigh,high,med,low
if(car.buying.equals(\)) buy[0][i]++; elseif(car.buying.equals(\)) buy[1][i]++; elseif(car.buying.equals(\)) buy[2][i]++; elsebuy[3][i]++;
//vhigh,high,med,low
if(car.maint.equals(\)) maint[0][i]++; elseif(car.maint.equals(\)) maint[1][i]++; elseif(car.maint.equals(\)) maint[2][i]++; elsemaint[3][i]++; //2,3,4,5more
if(car.doors.equals(\)) door[0][i]++;
elseif(car.doors.equals(\)) door[1][i]++; elseif(car.doors.equals(\)) door[2][i]++; elsedoor[3][i]++; //2,4,more
if(car.persons.equals(\)) person[0][i]++;
elseif(car.persons.equals(\)) person[1][i]++; elseperson[2][i]++; //small ,med,big
if(car.lug_boot.equals(\)) lug_boot[0][i]++; elseif(car.lug_boot.equals(\)) lug_boot[1][i]++; elselug_boot[2][i]++; // low,med,high
if(car.safety.equals(\)) safe[0][i]++;
elseif(car.safety.equals(\)) safe[1][i]++; elsesafe[2][i]++; } } }/*
*计算概率 */
publicvoid Calculated_probability(){ for(inti=0;i ClassValue_gl[i]=(float)ClassValues[i]/testTotal; for(inti=0;i for(intj=0;j buy_Vlaue_gl[i][j]=(float)buy[i][j]/ClassValues[j]; maint_Value_gl[i][j]=(float)maint[i][j]/ClassValues[j]; door_Value_gl[i][j]=(float)door[i][j]/ClassValues[j]; } for(inti=0;i for(intj=0;j person_Value_gl[i][j]=(float)person[i][j]/ClassValues[j]; lugboot_Value_gl[i][j]=(float)lug_boot[i][j]/ClassValues[j]; safe_Value_gl[i][j]=(float)safe[i][j]/ClassValues[j]; } } /* * 获取测试数据 * */ publicvoid TestData() throws IOException { BufferedReader br=new BufferedReader(new FileReader(\)); String temp; temp=br.readLine(); String []str = null; Property Car = null; while(temp!=null){ str=temp.split(\); Car=new Property(str[0],str[1],str[2],str[3],str[4],str[5],str[6]); predictTotal++; Data.addElement(Car); calculate(Car); temp=br.readLine(); } } /** * 对分类器进行性能测试,判断其成功率为多少 * @param car */ publicvoid calculate(Property car){ // unacc,acc,good,vgood, P(yi)--ClassValueTotal_gl 、 P(x|yi)=low,vhigh,4,2,small,low,unacc第一条 floatitemGl;// 每一条的概率 intb, m, d, p, l, s; b = m = d = p = l = s = -1; floatMaxGl = 0; if (car.buying.equals(\)) b = 0; elseif (car.buying.equals(\)) b = 1; elseif (car.buying.equals(\))b = 2; elseb = 3; if (car.maint.equals(\)) m = 0; elseif (car.maint.equals(\)) m = 1; elseif (car.maint.equals(\))m = 2; elsem = 3; if (car.doors.equals(\)) d = 0; elseif (car.doors.equals(\)) d = 1; elseif (car.doors.equals(\))d = 2; elsed = 3; if (car.persons.equals(\)) p = 0; elseif (car.persons.equals(\))p = 1; elsep = 2; if (car.lug_boot.equals(\)) l = 0; elseif (car.lug_boot.equals(\)) l = 1; elsel = 2; if (car.safety.equals(\)) s = 0; elseif (car.safety.equals(\)) s= 1; elses = 2; intt = 0;// 记录最大概率的下标 inti; for (i = 0; i itemGl = 0; BigDecimal[] bigDecimal = { new BigDecimal(Float.toString(ClassValue_gl[i])), new BigDecimal(Float.toString(buy_Vlaue_gl[b][i])), new BigDecimal(Float.toString(maint_Value_gl[m][i])), new BigDecimal(Float.toString(door_Value_gl[d][i])), new BigDecimal(Float.toString(person_Value_gl[p][i])), new BigDecimal(Float.toString(lugboot_Value_gl[l][i])), newBigDecimal(Float.toString(safe_Value_gl[s][i])), }; for (intj = 1; j bigDecimal[0] = bigDecimal[0].multiply(bigDecimal[j]);//multiply乘 itemGl = bigDecimal[0].floatValue(); car.PredictResult[i] = itemGl + \; if (MaxGl // 判断结果是否正确 if (car.ClassValues.equals(ClassValueName[t])) {// 预测结果和开始给定的结果相等 car.PredictResult[i] = \; predictSucess++; } else car.PredictResult[i] = \; } publicvoid show() { for (inti =0; i for (intj = 0; j // 分类器的准确率 floatt = (float) predictSucess / predictTotal; t=t*10000/100; System.out.println(\分类器的准确率为:\ + t+ \); } } 四、思考题 1.实验A中的分类器的优缺点。 可能存在0概率问题 存在准确度问题,朴素贝叶斯分类器是基于样本属性条件独立的假设的前提下的,但是实际情况可能并不成立,这样也就缺失准确性了. 解决朴素贝叶斯准确性问题提出的一种方法叫做:贝叶斯网络(Bayesian Belief Networks ) 2.评价最小错误概率贝叶斯分类器和最小风险概率贝叶斯分类器 基于最小错误率的贝叶斯决策 实质:通过观察x把状态的先验概率P(wi)转化为后验概率 判别错误率的问题 基于最小风险的贝叶斯决策考虑到各种错误照成的损失不同而提出的一种决策规则 最小风险的贝叶斯决策的计算方法: 1)根据贝叶斯公式,计算出后验概率 2)利用后验概率和决策表,计算出条件风险 3)比较2中的计算结果,找出使条件风险最小的决策Ak,则它就是最小风险的贝叶斯决策 两者之间的关系:基于最小错误率的决策是基于最小风险决策的一个特例 3.计算实验B中叶斯分类器和最小风险概率贝叶斯分类器的分类临界值[x1 x2],比较差别,并统计两种正确率。(同上) 4. 提出一种提高分类器性能的方法并通过实验验证。 Adaboost:基于错误提升分类器的性能 Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器,即弱分类器,然后把这些弱分类器集合起来,构造一个更强的最终分类器,比起弱分类器,这个“强”分类器的错误率会低很多。 Adaboost算法本身是改变数据分布实现的,它根据每次训练集之中的每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改权值的新数据送给下层分类器进行训练,然后将每次训练得到的分类器融合起来,作为最后的决策分类器。以下给出 Adaboost算法的运行过程: 1. 训练数据中的每个样本,并赋予其一个权重,这些权重构成向量D,一开始时权重D初始化为 相等的值; 2. 先在训练样本上训练得到第一个弱分类器并计算分类器的错误率 ; 3. 在同一数据集上再次训练弱分类器,在分类器的二次训练中,会重新调整每个样本的权重,其 中第一次分类正确的样本的权重将会降低,而分类错误的样本权重将会提高 ; 4. 为了从所有弱分类器中得到最终的分类结果,Adaboost为每个分类器都分配了一个权重值 alpha,这一组值是基于每个弱分类器的错误率进行计算的。 其中,错误率由以下公式定义: