實驗名稱:貝葉斯分類器
一、實驗目的和要求
目的:
掌握利用貝葉斯公式進行設計分類器的方法。
要求:
分別做出協方差相同和不同兩種情況下的判別分類邊界。
二、實驗環境、內容和方法
環境:windows 7,matlab R2010a
內容:根據貝葉斯公式,給出在類條件概率密度為正態分布時具體的判別函數表達式,用此判別函數設計分類器。數據隨機生成,比如生成兩類樣本,每個樣本有兩個特征,每類有若干個(比如20個)樣本點,假設每類樣本點服從二維正態分布,隨機生成具體數據,然后估計每類的均值與協方差,在兩類協方差相同的情況下求出分類邊界。先驗概率自己給定,比如都為0.5。如果可能,畫出在兩類協方差不相同的情況下的分類邊界。畫出圖形。
三、實驗基本原理
條件概率:
表示事件B已經發生的前提下,事件A發生的概率,叫做事件B發生下事件A的條件概率。其基本求解公式為:
。
貝葉斯定理之所以有用,是因為我們在生活中經常遇到這種情況:我們可以很容易直接得出P(A|B),P(B|A)則很難直接得出,但我們更關心P(B|A),貝葉斯定理就為我們打通從P(A|B)獲得P(B|A)的道路。
下面不加證明地直接給出貝葉斯定理:
朴素貝葉斯分類是一種十分簡單的分類算法,叫它朴素貝葉斯分類是因為這種方法的思想真的很朴素,朴素貝葉斯的思想基礎是這樣的:對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別。朴素貝葉斯分類的正式定義如下:
1、設為一個待分類項,而每個a為x的一個特征屬性。
2、有類別集合。
3、計算。
4、如果,則
。
那么現在的關鍵就是如何計算第3步中的各個條件概率。我們可以這么做:
1、找到一個已知分類的待分類項集合,這個集合叫做訓練樣本集。
2、統計得到在各類別下各個特征屬性的條件概率估計。即。
3、如果各個特征屬性是條件獨立的,則根據貝葉斯定理有如下推導:
因為分母對於所有類別為常數,因為我們只要將分子最大化皆可。又因為各特征屬性是條件獨立的,所以有:
根據上述分析,朴素貝葉斯分類的流程可以由下圖表示(暫時不考慮驗證):
對於具有多個特征參數的樣本,其正態分布的概率密度函數可定義為
式中,是
維行向量,
是
維行向量,
是
維協方差矩陣,
是
的逆矩陣,
是
的行列式。
由其判決規則,如果使對一切
成立,則將
歸為
類。
我們根據假設:類別,i=1,2,……,N的類條件概率密度函數
,i=1,2,……,N服從正態分布,即有
~
,那么上式就可以寫為
對上式右端取對數,可得
上式中的第二項與樣本所屬類別無關,將其從判別函數中消去,不會改變分類結果。則判別函數可簡化為以下形式
四、實驗過程描述
1.產生第一類數據:
x1是第一類數據,x2 是第二類數據,每一列代表一個樣本(兩個特征)
x1(1,:) = normrnd(14,4,1,20); x1(2,:) = normrnd(20,4,1,20);
x2(1,:) = normrnd(16,4,1,20); x2(2,:) = normrnd(10,4,1,20);
2.均值的估計為
協方差的估計為。
兩類協方差相同的情況下的分類邊界為:
,
兩類協方差不相同的情況下的判別函數為:
五、實驗結果
協方差相同的情況下,判別分類邊界其實就是線性分類器產生的邊界。在協方差不同的情況下的二次線性分類邊界有時會出現奇怪的形狀。
六、附錄代碼
:
%main.m
clear;clc;
randseed;
x1(1,:) = normrnd(12,4,1,20);%生成高斯分布的隨機序列
x1(2,:) = normrnd(20,4,1,20);%均值,標准差,m×n隨機向量
plot(x1(1,:),x1(2,:),'ro',...
'LineWidth',1,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[1 0 0],...
'MarkerSize',7)
x2(1,:) = normrnd(18,4,1,20);
x2(2,:) = normrnd(10,4,1,20);
pw1=0.5;
pw2=0.5;
hold on; %新畫圖像之后不覆蓋原圖
plot(x2(1,:),x2(2,:),'bo',...
'LineWidth',1,...
'MarkerEdgeColor','k',...
'MarkerFaceColor',[0 0 0.5],...
'MarkerSize',7)
u1 = sum(x1,2)/20;
u2 = sum(x2,2)/20;
x1count = size(x1,2);
x1t = x1-kron(u1,ones(1,x1count));
S1t = x1t * x1t' / x1count;
x2count = size(x2,2);
x2t = x2-kron(u2,ones(1,x2count));
S2t = x2t * x2t' / x2count;
St = (S1t+S2t)/2;
w = St^(-1) * (u1-u2);
% Y= inv(X) returns the inverse of the square matrix X矩陣求逆
x0 = (u1+u2)/2 - log(pw1/pw2)/((u1-u2)'*inv(St)*(u1-u2)) *(u1-u2);
k=-w(1)/w(2);
b = x0(2)-k*x0(1);
x=[5,23];
plot(x,k*x+b,'g-.','LineWidth',3);
S1tinv = inv(S1t);
S2tinv = inv(S2t);
W1=-1/2 * S1tinv;
W2=-1/2 * S2tinv;
w1=S1tinv*u1;
w2=S2tinv*u2;
%d = det(X) returns the determinant of the square matrix X.矩陣行列式
w10=-1/2 * u1'*S1tinv*u1 - 1/2 *log(det(S1t)) + log(pw1);
w20=-1/2 * u2'*S2tinv*u2 - 1/2 *log(det(S2t)) + log(pw2);
t2=[]
for t1=1:23
%Solve system of nonlinear equations求解非線性方程組
tt2 = fsolve('bayesian_fun',5,[],t1,W1,W2,w1,w2,w10,w20);
t2=[t2,tt2];
end
plot(1:23,t2,'b','LineWidth',3);
% f=bayesian_fun.m
function f=bayesian_fun(t2,t1,W1,W2,w1,w2,w10,w20)
x=[t1,t2]';
f=x'*W1*x+w1'*x+w10 - (x'*W2*x+w2'*x+w20);