模式識別三--MATLAB實現貝葉斯分類器
貝葉斯分類器的分類原理是通過某物件的先驗概率,利用貝葉斯公式計算出其後驗概率,即該物件屬於某一類的概率,選擇具有最大後驗概率的類作為該物件所屬的類。也就是說,貝葉斯分類器是最小錯誤率意義上的優化,它遵循“多數佔優”這一基本原則。
一、分類器的基本概念
經過了一個階段的模式識別學習,對於模式和模式類的概念有一個基本的瞭解,並嘗試使用MATLAB實現一些模式類的生成。而接下來如何對這些模式進行分類成為了學習的第二個重點。這就需要用到分類器。
表述模式分類器的方式有很多種,其中用的最多的是一種判別函式的形式,如果對於所有的j≠i,有:
則此分類器將這個特徵向量x判為ωi類。因此,此分類器可視為計算c個判別函式並選取與最大判別值對應的類別的網路或機器。一種分類器的網路結構如下圖所示:
二、貝葉斯分類器
一個貝葉斯分類器可以簡單自然地表示成以上網路結構。貝葉斯分類器的分類原理是通過某物件的先驗概率,利用貝葉斯公式計算出其後驗概率,即該物件屬於某一類的概率,選擇具有最大後驗概率的類作為該物件所屬的類。在具有模式的完整統計知識條件下,按照貝葉斯決策理論進行設計的一種最優分類器。分類器是對每一個輸入模式賦予一個類別名稱的軟體或硬體裝置,而貝葉斯分類器是各種分類器中分類錯誤概率最小或者在預先給定代價的情況下平均風險最小的分類器。它的設計方法是一種最基本的統計分類方法。
對於貝葉斯分類器,其判別函式的選擇並不是唯一的,我們可以將所有的判別函式乘上相同的正常數或者加上一個相同的常量而不影響其判決結果;在更一般的情況下,如果將每一個gi (x)替換成f(gi (x)),其中f(∙)是一個單調遞增函式,其分類的效果不變。特別在對於最小誤差率分類,選擇下列任何一種函式都可以得到相同的分類結果,但是其中一些比另一些計算更為簡便:
一個典型的模式識別系統是由特徵提取和模式分類兩個階段組成的,而其中模式分類器(Classifier)的效能直接影響整個識別系統的效能。 因此有必要探討一下如何評價分類器的效能,這是一個長期探索的過程。分類器效能評價方法見:http://blog.csdn.net/liyuefeilong/article/details/44604001
三、基本的Bayes分類器實現
這裡將在MATLAB中實現一個可以對兩類模式樣本進行分類的貝葉斯分類器,假設兩個模式類的分佈均為高斯分佈。模式類1的均值向量m1 = (1, 3),協方差矩陣為S1 =(1.5, 0; 0, 1);模式類2的均值向量m2 = (3, 1),協方差矩陣為S2 =(1, 0.5; 0.5, 2),兩類的先驗概率p1 = p2 = 1/2。詳細的操作包含以下四個部分:
1.首先,編寫一個函式,其功能是為若干個模式類生成指定數目的隨機樣本,這裡為兩個模式類各生成100個隨機樣本,並在一幅圖中畫出這些樣本的二維散點圖;
2.由於每個隨機樣本均含有兩個特徵分量,這裡先僅僅使用模式集合的其中一個特徵分量作為分類特徵,對第一步中的200個樣本進行分類,統計正確分類的百分比,並在二維圖上用不同的顏色畫出正確分類和錯分的樣本;(注:綠色點代表生成第一類的散點,紅色代表第二類;綠色圓圈代表被分到第一類的散點,紅色代表被分到第二類的散點! 因此,裡外顏色不一樣的點即被錯分的樣本。)
3.僅用模式的第二個特徵分量作為分類特徵,重複第二步的操作;
4.同時用模式的兩個分量作為分類特徵,對200個樣本進行分類,統計正確分類百分比,並在二維圖上用不同的顏色畫出正確分類和錯分的樣本;
正確率:
可以看到,單單使用一個分類特徵進行分類時,錯誤率較高(多次試驗均無法得出較好的分類結果),而增加分類特徵的個數是提高正確率的有效手段,當然,這會給演算法帶來額外的時間代價。
四、進一步的Bayes分類器
假設分類資料均滿足高斯分佈的情況下,設計一個判別分類器,實驗目的是為了初步瞭解和設計一個分類器。
1.編寫一個高斯型的Bayes判別函式GuassianBayesModel( mu,sigma,p,X ),該函式輸入為:一給定正態分佈的均值mu、協方差矩陣sigma,先驗概率p以及模式樣本向量X,輸出判別函式的值,其程式碼如下:
2.以下表格給出了三類樣本各10個樣本點,假設每一類均為正態分佈,三個類別的先驗概率相等均為P(w1)=P(w2 )=P(w3 )=1/3。計算每一類樣本的均值向量和協方差矩陣,為這三個類別設計一個分類器。
3.用第二步中設計的分類器對以下測試點進行分類:(1,2,1),(5,3,2),(0,0,0),並且利用以下公式求出各個測試點與各個類別均值之間的Mahalanobis距離。以下是來自百度百科的關於馬氏距離的解釋:
馬氏距離計算公式:
4.如果P(w1)=0.8, P(w2 )=P(w3 )=0.1,再進行第二步和第三步實驗。實驗的結果如下:
首先是得出三類樣本點各自的均值和協方差矩陣:
在三個類別的先驗概率均為P(w1)=P(w2 )=P(w3 )=1/3時,使用函式進行分類並給出分類結果和各個測試點與各個類別均值之間的Mahalanobis距離。
驗證當三個類別的先驗概率不相等時,同樣使用函式進行分類並給出分類結果和各個測試點與各個類別均值之間的Mahalanobis距離。
可以看到,在Mahalanobis距離不變的情況下,不同的先驗概率對高斯型Bayes分類器的分類結果影響很大~ 事實上,最優判決將偏向於先驗概率較大的類別。
完整的程式碼如下由兩個函式和主要的執行流程組成:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 產生模式類函式
% N:生成散點個數 C:類別個數 d:散點的維數
% mu:各類散點的均值矩陣
% sigma:各類散點的協方差矩陣
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function result = MixGaussian(N, C, d, mu, sigma)
color = {'r.', 'g.', 'm.', 'b.', 'k.', 'y.'}; % 用於存放不同類資料的顏色
% if nargin <= 3 & N < 0 & C < 1 & d < 1
% error('引數太少或引數錯誤');
if d == 1
for i = 1 : C
for j = 1 : N/C
r(j,i) = sqrt(sigma(1,i)) * randn() + mu(1,i);
end
X = round(mu(1,i)-5);
Y = round(mu(1,i) + sqrt(sigma(1,i))+5);
b = hist(r(:,i), X:Y);
subplot(1,C,i),bar(X:Y, b,'b');
title('三類一維隨機點的分佈直方圖');
grid on
end
elseif d == 2
for i = 1:C
r(:,:,i) = mvnrnd(mu(:,:,i),sigma(:,:,i),round(N/C));
plot(r(:,1,i),r(:,2,i),char(color(i)));
hold on;
end
elseif d == 3
for i = 1:C
r(:,:,i) = mvnrnd(mu(:,:,i),sigma(:,:,i),round(N/C));
plot3(r(:,1,i),r(:,2,i),r(:,3,i),char(color(i)));
hold on;
end
else disp('維數只能設定為1,2或3');
end
result = r;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 高斯型Bayes判別函式
% mu:輸入正態分佈的均值
% sigma:輸入正態分佈的協方差矩陣
% p:輸入各類的先驗概率
% X:輸入樣本向量
% 輸出判別函式值、馬氏距離和判別結果
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function GuassianBayesModel( mu,sigma,p,X )
% 構建判別函式
% 計算點到每個類的Mahalanobis距離
for i = 1:3;
P(i) = mvnpdf(X, mu(:,:,i), sigma(:,:,i)) * p(i);
r(i) = sqrt((X - mu(:,:,i)) * inv(sigma(:,:,i)) * (X - mu(:,:,i))');
end
% 判斷樣本屬於哪個類的概率最高
% 並顯示點到每個類的Mahalanobis距離
maxP = max(P);
style = find(P == maxP);
disp(['點[',num2str(X),']關於第一類的判別函式值為:',num2str(P(1))]);
disp(['點[',num2str(X),']關於第二類的判別函式值為:',num2str(P(2))]);
disp(['點[',num2str(X),']關於第三類的判別函式值為:',num2str(P(3))]);
disp(['點[',num2str(X),']到第1類的Mahalanobis距離為:',num2str(r(1))]);
disp(['點[',num2str(X),']到第2類的Mahalanobis距離為:',num2str(r(2))]);
disp(['點[',num2str(X),']到第3類的Mahalanobis距離為:',num2str(r(3))]);
disp(['點[',num2str(X),']屬於第',num2str(style),'類']);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%貝葉斯分類器實驗主函式
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 生成兩類各100個散點樣本
mu(:,:,1) = [1 3];
sigma(:,:,1) = [1.5 0; 0 1];
p1 = 1/2;
mu(:,:,2) = [3 1];
sigma(:,:,2) = [1 0.5; 0.5 2];
p2 = 1/2;
% 生成200個二維散點,平分為兩類,每類100個
aa = MixGaussian(200, 2, 2, mu, sigma);
title('兩類共200個高斯分佈的散點');
% 只x分量作為分類特徵的分類情況
figure;
% 正確分類的散點個數
right1 = 0;
right2 = 0;
% 正確率
rightRate1 = 0;
rightRate2 = 0;
for i = 1:100
x = aa(i,1,1);
plot(aa(:,1,1),aa(:,2,1),'r.');
% 計算後驗概率
P1 = normpdf(x, 1, sqrt(1.5));
P2 = normpdf(x, 3, sqrt(1));
if P1 > P2
plot(aa(i,1,1),aa(i,2,1),'ks');
hold on;
right1 = right1 + 1;% 統計正確個數
elseif P1 < P2
plot(aa(i,1,1),aa(i,2,1),'go');
hold on;
end
end
rightRate1 = right1 / 100; % 正確率
for i = 1:100
x = aa(i,1,2);
plot(aa(:,1,2),aa(:,2,2),'g.');
% 計算後驗概率
P1 = normpdf(x, 1, sqrt(1.5));
P2 = normpdf(x, 3, sqrt(1));
if P1 > P2
plot(aa(i,1,2),aa(i,2,2),'ks');
hold on;
elseif P1 < P2
plot(aa(i,1,2),aa(i,2,2),'go');
hold on;
right2 = right2 + 1; % 統計正確個數
end
end
rightRate2 = right2 / 100;
title('使用第一個分類特徵的分類結果');
disp(['只用第一個特徵時,第一類分類的準確率為:',num2str(rightRate1*100),'%']);
disp(['只用第一個特徵時,第二類分類的準確率為:',num2str(rightRate2*100),'%']);
% 只使用y分量的分類特徵的分類情況
figure;
% 正確分類的散點個數
right1 = 0;
right2 = 0;
% 正確率
rightRate1 = 0;
rightRate2 = 0;
for i = 1:100
y = aa(i,2,1);
plot(aa(:,1,1),aa(:,2,1),'r.');
% 計算後驗概率
P1 = normpdf(y, 3, sqrt(1));
P2 = normpdf(y, 1, sqrt(2));
if P1 > P2
plot(aa(i,1,1),aa(i,2,1),'ks');
hold on;
right1 = right1 + 1; % 統計正確個數
elseif P1 < P2
plot(aa(i,1,1),aa(i,2,1),'go');
hold on;
end
end
rightRate1 = right1 / 100; % 正確率
for i = 1:100
y = aa(i,2,2);
plot(aa(:,1,2),aa(:,2,2),'g.');
% 計算後驗概率
P1 = normpdf(y, 3, sqrt(1));
P2 = normpdf(y, 1, sqrt(2));
if P1 > P2
plot(aa(i,1,2),aa(i,2,2),'ks');
hold on;
elseif P1 < P2
plot(aa(i,1,2),aa(i,2,2),'go');
hold on;
right2 = right2 + 1; % 統計正確個數
end
end
rightRate2 = right2 / 100; % 正確率
title('使用第二個分類特徵的分類結果');
disp(['只用第二個特徵時,第一類分類的準確率為:',num2str(rightRate1*100),'%']);
disp(['只用第二個特徵時,第二類分類的準確率為:',num2str(rightRate2*100),'%']);
% 同時使用兩個分類特徵的分類情況
figure;
% 正確分類的散點個數
right1 = 0;
right2 = 0;
% 正確率
rightRate1 = 0;
rightRate2 = 0;
for i = 1:100
x = aa(i,1,1);
y = aa(i,2,1);
plot(aa(:,1,1),aa(:,2,1),'r.');
% 計算後驗概率
P1 = mvnpdf([x,y], mu(:,:,1), sigma(:,:,1));
P2 = mvnpdf([x,y], mu(:,:,2), sigma(:,:,2));
if P1 > P2
plot(aa(i,1,1),aa(i,2,1),'ks');
hold on;
right1 = right1 + 1;
else if P1 < P2
plot(aa(i,1,1),aa(i,2,1),'go');
hold on;
end
end
end
rightRate1 = right1 / 100;
for i = 1:100
x = aa(i,1,2);
y = aa(i,2,2);
plot(aa(:,1,2),aa(:,2,2),'g.');
% 計算後驗概率
P1 = mvnpdf([x,y], mu(:,:,1), sigma(:,:,1));
P2 = mvnpdf([x,y], mu(:,:,2), sigma(:,:,2));
if P1 > P2
plot(aa(i,1,2),aa(i,2,2),'ks');
hold on;
else if P1 < P2
plot(aa(i,1,2),aa(i,2,2),'go');
hold on;
right2 = right2 + 1;
end
end
end
rightRate2 = right2 / 100;
title('使用兩個分類特徵的分類結果');
disp(['同時使用兩個特徵時,第一類分類的準確率為:',num2str(rightRate1*100),'%']);
disp(['同時使用兩個特徵時,第二類分類的準確率為:',num2str(rightRate2*100),'%']);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 進一步的Bayes分類器
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% w1,w2,w3三類散點
w = zeros(10,3,3);
w(:,:,1) = [-5.01 -8.12 -3.68;...
-5.43 -3.48 -3.54;...
1.08 -5.52 1.66;...
0.86 -3.78 -4.11;...
-2.67 0.63 7.39;...
4.94 3.29 2.08;...
-2.51 2.09 -2.59;...
-2.25 -2.13 -6.94;...
5.56 2.86 -2.26;...
1.03 -3.33 4.33];
w(:,:,2) = [-0.91 -0.18 -0.05;...
1.30 -.206 -3.53;...
-7.75 -4.54 -0.95;...
-5.47 0.50 3.92;...
6.14 5.72 -4.85;...
3.60 1.26 4.36;...
5.37 -4.63 -3.65;...
7.18 1.46 -6.66;...
-7.39 1.17 6.30;...
-7.50 -6.32 -0.31];
w(:,:,3) = [ 5.35 2.26 8.13;...
5.12 3.22 -2.66;...
-1.34 -5.31 -9.87;...
4.48 3.42 5.19;...
7.11 2.39 9.21;...
7.17 4.33 -0.98;...
5.75 3.97 6.65;...
0.77 0.27 2.41;...
0.90 -0.43 -8.71;...
3.52 -0.36 6.43];
% 均值
mu1(:,:,1) = sum(w(:,:,1)) ./ 10;
mu1(:,:,2) = sum(w(:,:,2)) ./ 10;
mu1(:,:,3) = sum(w(:,:,3)) ./ 10;
% 協方差矩陣
sigma1(:,:,1) = cov(w(:,:,1));
sigma1(:,:,2) = cov(w(:,:,2));
sigma1(:,:,3) = cov(w(:,:,3));
% 各類別的先驗概率
% p(1) = 1/3;
% p(2) = 1/3;
% p(3) = 1/3;
p(1) = 0.8;
p(2) = 0.1;
p(3) = 0.1;
% 樣本向量
X = [1 0 0];
% 呼叫高斯型Bayes判別函式,輸出判別函式值、馬氏距離和判別結果
GuassianBayesModel(mu1,sigma1,p,X);