標籤:

[貝葉斯六]之樸素貝葉斯分類器設計

<個人網頁blog已經上線,一大波乾貨即將來襲:faiculty.com/>

/* 版權聲明:公開學習資源,只供線上學習,不可轉載,如需轉載請聯繫本人 .*/


同樣,類似於[貝葉斯四]之貝葉斯分類器設計,我們用一個例子:字母分類,來闡述樸素貝葉斯分類器的設計。

老套路,搞個三部曲

  • 特徵向量生成
  • 決策函數設計
  • 模型訓練

在做問題分析之前,請先做數據集的分析

一、數據集分析

數據集來自於UCI:UCI字母分類數據集鏈接

這個數據集原始數據一共包含20000張圖像(一般取前16000張圖像作為訓練,後4000張圖像作為測試),每張圖像經過作者處理後得到了一個16維的特徵(特徵值是一個0-15的整數),標籤就是所代表的字母A-Z。數據形式如下:

1. lettr capital letter (26 values from A to Z) 2. x-box horizontal position of box (integer) 3. y-box vertical position of box (integer) 4. width width of box (integer) 5. high height of box (integer) 6. onpix total # on pixels (integer) 7. x-bar mean x of on pixels in box (integer) 8. y-bar mean y of on pixels in box (integer) 9. x2bar mean x variance (integer) 10. y2bar mean y variance (integer) 11. xybar mean x y correlation (integer) 12. x2ybr mean of x * x * y (integer) 13. xy2br mean of x * y * y (integer) 14. x-ege mean edge count left to right (integer) 15. xegvy correlation of x-ege with y (integer) 16. y-ege mean edge count bottom to top (integer) 17. yegvx correlation of y-ege with x (integer)

其中20000張圖像的分布如下:

1. 789 A 766 B 736 C 805 D 768 E 775 F 773 G 2. 734 H 755 I 747 J 739 K 761 L 792 M 783 N 3. 753 O 803 P 783 Q 758 R 748 S 796 T 813 U 4. 764 V 752 W 787 X 786 Y 734 Z

整理一下這個數據集。

  • 一個文件。共20000條數據,我們將前16000條數據作為訓練數據,後4000條數據作為測試數據。
  • 數據格式。16維的特徵向量,一個A-Z的label

二、特徵向量生成

由上述的數據集的描述中我們可以知道,字母數據集已經幫我們做好了特徵向量提取(16維數據)的工作。數據形式如下所示。

由此我們只需要經過簡單的處理就能得到我們想要的數據。

  • Image數據。上圖所示每行16維向量,每個特徵值取值為0-15的整數。形式為16*N。
  • Label。上圖中每行第1列,A-Z。

Step1:數據讀入(loadData.m)

% load data from file, start --start line, end --end linefunction [labels, features] = loadData(filename,start,endl)[data1,data2,data3,data4,data5,data6,data7,data8,data9,data10,data11,data12,data13,data14,data15,data16,data17] = textread(filename, %c%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d,delimiter,,);labels = data1(start:endl,1);features = [data2,data3,data4,data5,data6,data7,data8,data9,data10,data11,data12,data13,data14,data15,data16,data17];features = features(start:endl,:);%labels = labels.;features = features. + 1;% 注意:這裡的下標是0~15end

三、決策函數分析

這裡我們也使用最小錯分準則來設計貝葉斯分類器。所以,我們的目的是求解後驗概率 p(w_i|x).

3.1 決策函數

[貝葉斯五]之樸素貝葉斯分析可以知道。

egin{align} p(w_i|x) &= frac {p(x|w_i)p(w_i)}{p(x)}\ & = frac {p(w_i)}{p(x)} prod_{k=1}^d p(x_k|w_i) end{align}

樸素貝葉斯的目標函數如下所示。egin{align} f &= underset {i}{argmax}  p(w_i|x)\ &=underset {i}{argmax}  p(w_i) prod_{k=1}^d p(x_k|w_i) end{align}

對於字母數據集的訓練數據集來說:

  • 類別w共有26類
  • 樣本x是16維,每個元素的取值是0~15整數

3.2 模型建立

根據訓練數據和決策函數,我們需要計算模型的參數(也可以稱為訓練過程)。決策函數如下。

egin{align} g_i(x) = p(w_i) prod_{k=1}^d p(x_k|w_i) end{align}

其中:

  • p(w_i)是先驗概率,表示每類樣本出現的概率。egin{align} p(w_i) = frac {# 類別i的訓練樣本數量}{# 訓練樣本總數n} end{align}
  • p(x_k|w_i)是用來統計類別i的條件下,x_k在各種取值下的可能性(概率)。

egin{align} p(x_k=j | w_i) = frac {# 類別i的所有訓練樣本中第k個元素為j的樣本數}{# 類別為i的訓練樣本總數} end{align}

在模型建立的時候,我們只需要計算上面兩個參數即可。

Step2: 訓練模型(bc_train.m)

function [model] = bc_train(x, y, J)[K,N] = size(x); %K為維度,N為樣本數% p(w): 類別 i 出現的概率py = zeros(J,1);for i=1:J py(i,:) = sum(y == i)/N;end% p(x_k_i): 樣本中第k個元素為i的個數 / 樣本總數pki = zeros(16,16);for k=1:16 for i=1:16 pki(k,i) = sum(x(k,:) == i)/N; endend% p(x_k_i | j): 第j類樣本中第k個元素為i的樣本數 / 第j類樣本總數pkij = zeros(16,16,J);for j=1:J for k=1:16 xj = x(:,y==j); %屬於第j類的樣本 for i=1:16 pkij(k,i,j) = sum(xj(k,:)==i)/size(xj,2); end endendmodel.pki = pki;model.py = py;model.pkij = pkij;end

3.3 模型測試

決策函數有了,模型有了,那麼我們如何來測試一個數據呢?簡而言之就是輸入樣本x,如何得到x所屬的類別?

針對輸入樣本x,每個樣本的p(w_i)肯定是相同的。根據式子。

egin{align} g_i(x) = p(w_i) prod_{k=1}^d p(x_k|w_i) end{align}

我們只需要得到p(x_k|w_i)即可,因為有輸入樣本x,所以其實我們是知道x_k的值的,然後加上模型中已經計算出了p(x_k=j | w_i),由此我們將x_k帶入,得到了p(x_k|w_i)。然後統計出所有類別的最大值 underset {i}{max}  g_i(x),這個類別就是預測得到的類別。

Step3: 測試數據(bc_predict.m)

function [yp] = bc_predict(model,x,J)[K,N] = size(x);pki = model.pki;py = model.py;pkij = model.pkij;% p(y_j|i): 樣本第i個元素為 x(:,i) 情況下,類別為j的概率pyji = zeros(J,16,N);for j=1:J for i = 1:16 for n=1:N pyji(j,i,n) = pkij(i,x(i,n),j) * py(j) / pki(i,x(i,n)); end endendresult = prod(pyji,2);yp = zeros(N,1);for i=1:N [m,yp(i,:)] = max(result(:,:,i));end

Step4: 主程序(runChar.m)

clearclc%% Step1: read data[train_labels,train_char] = loadData(./char/letter-recognition.data.txt,1,16000);[test_labels,test_char] = loadData(./char/letter-recognition.data.txt,16001,20000);%% Step2: train modeltrain_labels = train_labels - A + 1;model = bc_train(train_char, train_labels, 26);%% Step3: predicttest_labels = test_labels - A + 1;yp = bc_predict(model,test_char,26);accuary_test = sum(yp == test_labels) / length(test_labels);

最終得到的測試精度是: 72.9%

讀者可以在特徵向量生成的時候做點文章以此來提高精度,具體的可以查看我們寫的特徵生成部分,比如PCA等等。

四、參考文獻

[1] UCI Machine Learning Repository: Letter Recognition Data Set.下載鏈接[2] Using the MNIST Dataset.下載鏈接[3] 周志華. 《機器學習》[M]. 清華大學出版社, 2016.[4] 李航. 《統計學習方法》[M].清華大學出版社,2013.[5]機器學習之貝葉斯分類器[6]機器學習通俗入門-樸素貝葉斯分類器


PS: 如需數據和代碼請上faiculty留言


推薦閱讀:

複習:NN和BP
面壁者系列:線性回歸
數據挖掘有哪些常見的應用模型?
關鍵詞提取Part1(A Quick Review)
[貝葉斯一]之貝葉斯定理

TAG:機器學習 |