实验描述:
对指定数据集进行分类问题的分析,选择适当的分类算法,编写程序实现,提交程序和结果报告
数据集: balance-scale.data(见附件一) ,已有数据集构建贝叶斯分类器。
数据包括四个属性:五个属性值 第一个属性值表示样本的类别号,其他四个属性为四个不同的特征值。
实验环境和编程语言:
本实验使用的编程语言为:Java
编程环境为:Intellij idea
构建分类器的算法为:朴素贝叶斯算法
训练的样本个数为:625个
样本示例:R,1,1,1,2(表示属于R类,四各属性值为1 1 1 2)
训练样本和测试样本见附件一。
工程和测试数据下载地址:
http://download.csdn.net/detail/qq_24369113/9711643
实验结果分析:
根据程序运行的结果如图1-1所示,使用训练的样本对分类器进行检测,分类得到295个R类(实际288个),330个L类(实际288个),0个B类(实际49个),综合分类正确率为92.16%。可以认为分类器有较高的正确率,但是对于类B的分类还是有一定的误差,具体原因会在思考与改进中说明。
思考与改进:
- <strong>思考点:</strong>
本次实验编程利用朴素贝叶斯算法构建的分类器,虽然整体情况是拥有较高的分类正确率(92.16%),但是对训练样本再检测时没有发现一个B类样本,出现的较大的偏差,分析原因如下:
1. B类样本点总数很少,以至于P(yB)就远远小于P(yR)和P(yL),所以对于后验概率公式,P(yB|x)必然比P(yL|x)和P(yR|x)要小,因此导致最后样本难以分到B类。
2. 观察训练样本集可以发现,B类的样本点和L类以及R类并没有很大区别,其不具备很强的统计可分性,所以对于依赖于统计概率的贝叶斯方法无法体现出其优势,所以导致了最终没有样本被分到B类中。
改进点:
本算法在实现贝叶斯分类的时候,每一次都进行了遍历样本集来求出
P(a1|y1)、P(a2|y1)……P(an|yn),所以导致算法的整体时间复杂度较高,在面临较大的数据集时可能就会出现问题,因此可以考虑实现将已经计算过的
P(ax|yx)存储到变量或者数组中,在下一次计算的时候可以直接调用,从而可以避免再一次的遍历训练集来计算概率,实现时间复杂度的降低。
编程实现:
- package com.company;
- /********************************************************************************
- *
- *
- * 数据挖掘实验,分类实验
- * 朴素贝叶斯分类
- *
- *训练样本示例格式:(R,1,5,5,4)
- */
- import java.io.File;
- import java.util.Scanner;
- import java.util.Vector;
- public class Bayes {
- static Vector<String> indata = new Vector<>();//读入数据
- static Vector<int[]> catagory_R = new Vector<>();//存储类别R的所有数据
- static Vector<int[]> catagory_L = new Vector<>();//存储类别L的所有数据
- static Vector<int[]> catagory_B = new Vector<>();//存储类别B的所有数据
- public static boolean loadData(String url) {//加载测试的数据文件
- try {
- Scanner in = new Scanner(new File(url));//读入文件
- while (in.hasNextLine()) {
- String str = in.nextLine();//将文件的每一行存到str的临时变量中
- indata.add(str);//将每一个样本点的数据追加到Vector 中
- }
- return true;
- } catch (Exception e) { //如果出错返回false
- return false;
- }
- }
- public static void pretreatment(Vector<String> indata) { //数据预处理,将原始数据中的每一个属性值提取出来存放到Vector<double[]> data中
- int i = 0;
- String t;
- while (i < indata.size()) {//取出indata中的每一行值
- int[] tem = new int[4];
- t = indata.get(i);
- String[] sourceStrArray = t.split(",", 5);//使用字符串分割函数提取出各属性值
- switch (sourceStrArray[0]) {
- case "R": {
- for (int j = 1; j < 5; j++) {
- tem[j - 1] = Integer.parseInt(sourceStrArray[j]);
- }
- catagory_R.add(tem);
- break;
- }
- case "L": {
- for (int j = 1; j < 5; j++) {
- tem[j - 1] = Integer.parseInt(sourceStrArray[j]);
- }
- catagory_L.add(tem);
- break;
- }
- case "B": {
- for (int j = 1; j < 5; j++) {
- tem[j - 1] = Integer.parseInt(sourceStrArray[j]);
- }
- catagory_B.add(tem);
- break;
- }
- }
- i++;
- }
- }
- public static double bayes(int[] x, Vector<int[]> catagory) {
- double[] ai_y = new double[4];
- int[] sum_ai = new int[4];
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < catagory.size(); j++) {
- if (x[i] == catagory.get(j)[i])
- sum_ai[i]++;
- }
- }
- for (int i = 0; i < 4; i++) {
- ai_y[i] = (double) sum_ai[i] / (double) catagory.size();
- }
- return ai_y[0] * ai_y[1] * ai_y[2] * ai_y[3];
- }
- public static void main(String[] args) {
- loadData("balance-scale.data");
- pretreatment(indata);
- double p_yR = (double) catagory_R.size() / (double) (indata.size());//表示概率p(R)
- double p_yB = (double) catagory_B.size() / (double) (indata.size());//表示概率p(B)
- double p_yL = (double) catagory_L.size() / (double) (indata.size());//表示概率p(L)
- int[] x = new int[4];
- double x_in_R, x_in_L, x_in_B;
- int sumR=0, sumL=0, sumB=0;
- double correct=0;
- System.out.println("请输入样本x格式如下:\n 1 1 1 1\n");
- int r = 0;
- while (r < indata.size()) {
- for (int i = 0; i < 4; i++)
- //读取数字放入数组的第i个元素
- x[i] = Integer.parseInt(indata.get(r).split(",", 5)[i + 1]);
- x_in_B = bayes(x, catagory_B) * p_yB;
- x_in_L = bayes(x, catagory_L) * p_yL;
- x_in_R = bayes(x, catagory_R) * p_yR;
- if (x_in_B == Math.max(Math.max(x_in_B, x_in_L), x_in_R)) {
- System.out.println("输入的第"+r+"样本属于类别:B");
- sumB++;
- if(indata.get(r).split(",",5)[0].equals("B"))
- correct++;
- } else if (x_in_L == Math.max(Math.max(x_in_B, x_in_L), x_in_R)) {
- System.out.println("输入的第"+r+"样本属于类别:L");
- sumL++;
- if(indata.get(r).split(",",5)[0].equals("L"))
- correct++;
- } else if (x_in_R == Math.max(Math.max(x_in_B, x_in_L), x_in_R)) {
- System.out.println("输入的第"+r+"样本属于类别:R");
- sumR++;
- if(indata.get(r).split(",",5)[0].equals("R"))
- correct++;
- }
- r++;
- }
- System.out.println("使用训练样本进行分类器检验得到结果统计如下:");
- System.out.println("R类有:"+sumR+" 实际有R类样本"+catagory_R.size()+"个");
- System.out.println("L类有:"+sumL+" 实际有L类样本"+catagory_L.size()+"个");
- System.out.println("B类有:"+sumB+" 实际有B类样本"+catagory_B.size()+"个");
- System.out.println("分类的正确率为"+correct*1.0/indata.size()*100+"%");
- }
- }
(附件一)训练样本和测试样本集:
- B,1,1,1,1
- R,1,1,1,2
- R,1,1,1,3
- R,1,1,1,4
- R,1,1,1,5
- R,1,1,2,1
- R,1,1,2,2
- R,1,1,2,3
- R,1,1,2,4
- R,1,1,2,5
- R,1,1,3,1
- R,1,1,3,2
- R,1,1,3,3
- R,1,1,3,4
- R,1,1,3,5
- R,1,1,4,1
- R,1,1,4,2
- R,1,1,4,3
- R,1,1,4,4
- R,1,1,4,5
- R,1,1,5,1
- R,1,1,5,2
- R,1,1,5,3
- R,1,1,5,4
- R,1,1,5,5
- L,1,2,1,1
- B,1,2,1,2
- R,1,2,1,3
- R,1,2,1,4
- R,1,2,1,5
- B,1,2,2,1
- R,1,2,2,2
- R,1,2,2,3
- R,1,2,2,4
- R,1,2,2,5
- R,1,2,3,1
- R,1,2,3,2
- R,1,2,3,3
- R,1,2,3,4
- R,1,2,3,5
- R,1,2,4,1
- R,1,2,4,2
- R,1,2,4,3
- R,1,2,4,4
- R,1,2,4,5
- R,1,2,5,1
- R,1,2,5,2
- R,1,2,5,3
- R,1,2,5,4
- R,1,2,5,5
- L,1,3,1,1
- L,1,3,1,2
- B,1,3,1,3
- R,1,3,1,4
- R,1,3,1,5
- L,1,3,2,1
- R,1,3,2,2
- R,1,3,2,3
- R,1,3,2,4
- R,1,3,2,5
- B,1,3,3,1
- R,1,3,3,2
- R,1,3,3,3
- R,1,3,3,4
- R,1,3,3,5
- R,1,3,4,1
- R,1,3,4,2
- R,1,3,4,3
- R,1,3,4,4
- R,1,3,4,5
- R,1,3,5,1
- R,1,3,5,2
- R,1,3,5,3
- R,1,3,5,4
- R,1,3,5,5
- L,1,4,1,1
- L,1,4,1,2
- L,1,4,1,3
- B,1,4,1,4
- R,1,4,1,5
- L,1,4,2,1
- B,1,4,2,2
- R,1,4,2,3
- R,1,4,2,4
- R,1,4,2,5
- L,1,4,3,1
- R,1,4,3,2
- R,1,4,3,3
- R,1,4,3,4
- R,1,4,3,5
- B,1,4,4,1
- R,1,4,4,2
- R,1,4,4,3
- R,1,4,4,4
- R,1,4,4,5
- R,1,4,5,1
- R,1,4,5,2
- R,1,4,5,3
- R,1,4,5,4
- R,1,4,5,5
- L,1,5,1,1
- L,1,5,1,2
- L,1,5,1,3
- L,1,5,1,4
- B,1,5,1,5
- L,1,5,2,1
- L,1,5,2,2
- R,1,5,2,3
- R,1,5,2,4
- R,1,5,2,5
- L,1,5,3,1
- R,1,5,3,2
- R,1,5,3,3
- R,1,5,3,4
- R,1,5,3,5
- L,1,5,4,1
- R,1,5,4,2
- R,1,5,4,3
- R,1,5,4,4
- R,1,5,4,5
- B,1,5,5,1
- R,1,5,5,2
- R,1,5,5,3
- R,1,5,5,4
- R,1,5,5,5
- L,2,1,1,1
- B,2,1,1,2
- R,2,1,1,3
- R,2,1,1,4
- R,2,1,1,5
- B,2,1,2,1
- R,2,1,2,2
- R,2,1,2,3
- R,2,1,2,4
- R,2,1,2,5
- R,2,1,3,1
- R,2,1,3,2
- R,2,1,3,3
- R,2,1,3,4
- R,2,1,3,5
- R,2,1,4,1
- R,2,1,4,2
- R,2,1,4,3
- R,2,1,4,4
- R,2,1,4,5
- R,2,1,5,1
- R,2,1,5,2
- R,2,1,5,3
- R,2,1,5,4
- R,2,1,5,5
- L,2,2,1,1
- L,2,2,1,2
- L,2,2,1,3
- B,2,2,1,4
- R,2,2,1,5
- L,2,2,2,1
- B,2,2,2,2
- R,2,2,2,3
- R,2,2,2,4
- R,2,2,2,5
- L,2,2,3,1
- R,2,2,3,2
- R,2,2,3,3
- R,2,2,3,4
- R,2,2,3,5
- B,2,2,4,1
- R,2,2,4,2
- R,2,2,4,3
- R,2,2,4,4
- R,2,2,4,5
- R,2,2,5,1
- R,2,2,5,2
- R,2,2,5,3
- R,2,2,5,4
- R,2,2,5,5
- L,2,3,1,1
- L,2,3,1,2
- L,2,3,1,3
- L,2,3,1,4
- L,2,3,1,5
- L,2,3,2,1
- L,2,3,2,2
- B,2,3,2,3
- R,2,3,2,4
- R,2,3,2,5
- L,2,3,3,1
- B,2,3,3,2
- R,2,3,3,3
- R,2,3,3,4
- R,2,3,3,5
- L,2,3,4,1
- R,2,3,4,2
- R,2,3,4,3
- R,2,3,4,4
- R,2,3,4,5
- L,2,3,5,1
- R,2,3,5,2
- R,2,3,5,3
- R,2,3,5,4
- R,2,3,5,5
- L,2,4,1,1
- L,2,4,1,2
- L,2,4,1,3
- L,2,4,1,4
- L,2,4,1,5
- L,2,4,2,1
- L,2,4,2,2
- L,2,4,2,3
- B,2,4,2,4
- R,2,4,2,5
- L,2,4,3,1
- L,2,4,3,2
- R,2,4,3,3
- R,2,4,3,4
- R,2,4,3,5
- L,2,4,4,1
- B,2,4,4,2
- R,2,4,4,3
- R,2,4,4,4
- R,2,4,4,5
- L,2,4,5,1
- R,2,4,5,2
- R,2,4,5,3
- R,2,4,5,4
- R,2,4,5,5
- L,2,5,1,1
- L,2,5,1,2
- L,2,5,1,3
- L,2,5,1,4
- L,2,5,1,5
- L,2,5,2,1
- L,2,5,2,2
- L,2,5,2,3
- L,2,5,2,4
- B,2,5,2,5
- L,2,5,3,1
- L,2,5,3,2
- L,2,5,3,3
- R,2,5,3,4
- R,2,5,3,5
- L,2,5,4,1
- L,2,5,4,2
- R,2,5,4,3
- R,2,5,4,4
- R,2,5,4,5
- L,2,5,5,1
- B,2,5,5,2
- R,2,5,5,3
- R,2,5,5,4
- R,2,5,5,5
- L,3,1,1,1
- L,3,1,1,2
- B,3,1,1,3
- R,3,1,1,4
- R,3,1,1,5
- L,3,1,2,1
- R,3,1,2,2
- R,3,1,2,3
- R,3,1,2,4
- R,3,1,2,5
- B,3,1,3,1
- R,3,1,3,2
- R,3,1,3,3
- R,3,1,3,4
- R,3,1,3,5
- R,3,1,4,1
- R,3,1,4,2
- R,3,1,4,3
- R,3,1,4,4
- R,3,1,4,5
- R,3,1,5,1
- R,3,1,5,2
- R,3,1,5,3
- R,3,1,5,4
- R,3,1,5,5
- L,3,2,1,1
- L,3,2,1,2
- L,3,2,1,3
- L,3,2,1,4
- L,3,2,1,5
- L,3,2,2,1
- L,3,2,2,2
- B,3,2,2,3
- R,3,2,2,4
- R,3,2,2,5
- L,3,2,3,1
- B,3,2,3,2
- R,3,2,3,3
- R,3,2,3,4
- R,3,2,3,5
- L,3,2,4,1
- R,3,2,4,2
- R,3,2,4,3
- R,3,2,4,4
- R,3,2,4,5
- L,3,2,5,1
- R,3,2,5,2
- R,3,2,5,3
- R,3,2,5,4
- R,3,2,5,5
- L,3,3,1,1
- L,3,3,1,2
- L,3,3,1,3
- L,3,3,1,4
- L,3,3,1,5
- L,3,3,2,1
- L,3,3,2,2
- L,3,3,2,3
- L,3,3,2,4
- R,3,3,2,5
- L,3,3,3,1
- L,3,3,3,2
- B,3,3,3,3
- R,3,3,3,4
- R,3,3,3,5
- L,3,3,4,1
- L,3,3,4,2
- R,3,3,4,3
- R,3,3,4,4
- R,3,3,4,5
- L,3,3,5,1
- R,3,3,5,2
- R,3,3,5,3
- R,3,3,5,4
- R,3,3,5,5
- L,3,4,1,1
- L,3,4,1,2
- L,3,4,1,3
- L,3,4,1,4
- L,3,4,1,5
- L,3,4,2,1
- L,3,4,2,2
- L,3,4,2,3
- L,3,4,2,4
- L,3,4,2,5
- L,3,4,3,1
- L,3,4,3,2
- L,3,4,3,3
- B,3,4,3,4
- R,3,4,3,5
- L,3,4,4,1
- L,3,4,4,2
- B,3,4,4,3
- R,3,4,4,4
- R,3,4,4,5
- L,3,4,5,1
- L,3,4,5,2
- R,3,4,5,3
- R,3,4,5,4
- R,3,4,5,5
- L,3,5,1,1
- L,3,5,1,2
- L,3,5,1,3
- L,3,5,1,4
- L,3,5,1,5
- L,3,5,2,1
- L,3,5,2,2
- L,3,5,2,3
- L,3,5,2,4
- L,3,5,2,5
- L,3,5,3,1
- L,3,5,3,2
- L,3,5,3,3
- L,3,5,3,4
- B,3,5,3,5
- L,3,5,4,1
- L,3,5,4,2
- L,3,5,4,3
- R,3,5,4,4
- R,3,5,4,5
- L,3,5,5,1
- L,3,5,5,2
- B,3,5,5,3
- R,3,5,5,4
- R,3,5,5,5
- L,4,1,1,1
- L,4,1,1,2
- L,4,1,1,3
- B,4,1,1,4
- R,4,1,1,5
- L,4,1,2,1
- B,4,1,2,2
- R,4,1,2,3
- R,4,1,2,4
- R,4,1,2,5
- L,4,1,3,1
- R,4,1,3,2
- R,4,1,3,3
- R,4,1,3,4
- R,4,1,3,5
- B,4,1,4,1
- R,4,1,4,2
- R,4,1,4,3
- R,4,1,4,4
- R,4,1,4,5
- R,4,1,5,1
- R,4,1,5,2
- R,4,1,5,3
- R,4,1,5,4
- R,4,1,5,5
- L,4,2,1,1
- L,4,2,1,2
- L,4,2,1,3
- L,4,2,1,4
- L,4,2,1,5
- L,4,2,2,1
- L,4,2,2,2
- L,4,2,2,3
- B,4,2,2,4
- R,4,2,2,5
- L,4,2,3,1
- L,4,2,3,2
- R,4,2,3,3
- R,4,2,3,4
- R,4,2,3,5
- L,4,2,4,1
- B,4,2,4,2
- R,4,2,4,3
- R,4,2,4,4
- R,4,2,4,5
- L,4,2,5,1
- R,4,2,5,2
- R,4,2,5,3
- R,4,2,5,4
- R,4,2,5,5
- L,4,3,1,1
- L,4,3,1,2
- L,4,3,1,3
- L,4,3,1,4
- L,4,3,1,5
- L,4,3,2,1
- L,4,3,2,2
- L,4,3,2,3
- L,4,3,2,4
- L,4,3,2,5
- L,4,3,3,1
- L,4,3,3,2
- L,4,3,3,3
- B,4,3,3,4
- R,4,3,3,5
- L,4,3,4,1
- L,4,3,4,2
- B,4,3,4,3
- R,4,3,4,4
- R,4,3,4,5
- L,4,3,5,1
- L,4,3,5,2
- R,4,3,5,3
- R,4,3,5,4
- R,4,3,5,5
- L,4,4,1,1
- L,4,4,1,2
- L,4,4,1,3
- L,4,4,1,4
- L,4,4,1,5
- L,4,4,2,1
- L,4,4,2,2
- L,4,4,2,3
- L,4,4,2,4
- L,4,4,2,5
- L,4,4,3,1
- L,4,4,3,2
- L,4,4,3,3
- L,4,4,3,4
- L,4,4,3,5
- L,4,4,4,1
- L,4,4,4,2
- L,4,4,4,3
- B,4,4,4,4
- R,4,4,4,5
- L,4,4,5,1
- L,4,4,5,2
- L,4,4,5,3
- R,4,4,5,4
- R,4,4,5,5
- L,4,5,1,1
- L,4,5,1,2
- L,4,5,1,3
- L,4,5,1,4
- L,4,5,1,5
- L,4,5,2,1
- L,4,5,2,2
- L,4,5,2,3
- L,4,5,2,4
- L,4,5,2,5
- L,4,5,3,1
- L,4,5,3,2
- L,4,5,3,3
- L,4,5,3,4
- L,4,5,3,5
- L,4,5,4,1
- L,4,5,4,2
- L,4,5,4,3
- L,4,5,4,4
- B,4,5,4,5
- L,4,5,5,1
- L,4,5,5,2
- L,4,5,5,3
- B,4,5,5,4
- R,4,5,5,5
- L,5,1,1,1
- L,5,1,1,2
- L,5,1,1,3
- L,5,1,1,4
- B,5,1,1,5
- L,5,1,2,1
- L,5,1,2,2
- R,5,1,2,3
- R,5,1,2,4
- R,5,1,2,5
- L,5,1,3,1
- R,5,1,3,2
- R,5,1,3,3
- R,5,1,3,4
- R,5,1,3,5
- L,5,1,4,1
- R,5,1,4,2
- R,5,1,4,3
- R,5,1,4,4
- R,5,1,4,5
- B,5,1,5,1
- R,5,1,5,2
- R,5,1,5,3
- R,5,1,5,4
- R,5,1,5,5
- L,5,2,1,1
- L,5,2,1,2
- L,5,2,1,3
- L,5,2,1,4
- L,5,2,1,5
- L,5,2,2,1
- L,5,2,2,2
- L,5,2,2,3
- L,5,2,2,4
- B,5,2,2,5
- L,5,2,3,1
- L,5,2,3,2
- L,5,2,3,3
- R,5,2,3,4
- R,5,2,3,5
- L,5,2,4,1
- L,5,2,4,2
- R,5,2,4,3
- R,5,2,4,4
- R,5,2,4,5
- L,5,2,5,1
- B,5,2,5,2
- R,5,2,5,3
- R,5,2,5,4
- R,5,2,5,5
- L,5,3,1,1
- L,5,3,1,2
- L,5,3,1,3
- L,5,3,1,4
- L,5,3,1,5
- L,5,3,2,1
- L,5,3,2,2
- L,5,3,2,3
- L,5,3,2,4
- L,5,3,2,5
- L,5,3,3,1
- L,5,3,3,2
- L,5,3,3,3
- L,5,3,3,4
- B,5,3,3,5
- L,5,3,4,1
- L,5,3,4,2
- L,5,3,4,3
- R,5,3,4,4
- R,5,3,4,5
- L,5,3,5,1
- L,5,3,5,2
- B,5,3,5,3
- R,5,3,5,4
- R,5,3,5,5
- L,5,4,1,1
- L,5,4,1,2
- L,5,4,1,3
- L,5,4,1,4
- L,5,4,1,5
- L,5,4,2,1
- L,5,4,2,2
- L,5,4,2,3
- L,5,4,2,4
- L,5,4,2,5
- L,5,4,3,1
- L,5,4,3,2
- L,5,4,3,3
- L,5,4,3,4
- L,5,4,3,5
- L,5,4,4,1
- L,5,4,4,2
- L,5,4,4,3
- L,5,4,4,4
- B,5,4,4,5
- L,5,4,5,1
- L,5,4,5,2
- L,5,4,5,3
- B,5,4,5,4
- R,5,4,5,5
- L,5,5,1,1
- L,5,5,1,2
- L,5,5,1,3
- L,5,5,1,4
- L,5,5,1,5
- L,5,5,2,1
- L,5,5,2,2
- L,5,5,2,3
- L,5,5,2,4
- L,5,5,2,5
- L,5,5,3,1
- L,5,5,3,2
- L,5,5,3,3
- L,5,5,3,4
- L,5,5,3,5
- L,5,5,4,1
- L,5,5,4,2
- L,5,5,4,3
- L,5,5,4,4
- L,5,5,4,5
- L,5,5,5,1
- L,5,5,5,2
- L,5,5,5,3
- L,5,5,5,4
- B,5,5,5,5