實驗描述:
對指定資料集進行分類問題的分析,選擇适當的分類算法,編寫程式實作,送出程式和結果報告
資料集: 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的分類還是有一定的誤差,具體原因會在思考與改進中說明。
思考與改進:
本次實驗程式設計利用樸素貝葉斯算法建構的分類器,雖然整體情況是擁有較高的分類正确率(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