高斯判別分析(Gaussian discriminative analysis )是一個較為直觀的模型,基本的假設是我們得到的數據是獨立同分布的(IID),雖然在實際中這種假設很難達到,但有時候擁有了好的假設可以得到較好的結果。在Andrew Ng大神的CS229 Lecture notes中有一個例子:假設我們要對大象和狗分類,回歸模型和感知機模型是在兩類數據之間找到一個decision boundary,通過這個decision boundary來區分大象和狗。高斯判別分析提供了另外一種思路:首先我們觀察大象,對大象建立一個模型來描述他的特點;在觀察狗,並建立相應的模型來描述狗。當一個新的狗或者象過來時,我們首先帶入象模型和狗模型,最后決定新來的的動物的類別。
這是一種軟分類的思路,所謂軟分類就是我們對一個樣本決定它的類別時有一個可信度的概念,比方說當數據位於decision boundary附近的時候,我們將數據硬分為0或者1類(在這里是象和狗類)有時是不合理的,因為這是類別的不確定性更大。軟分類的思路在高斯混合模型(GMM)中也有體現(Anil K. Jain在08年在TPAMI發了一篇文章是關於如何利用GMM來分類,小菜今年才想到這個思路,只能follow人家了)。我感覺這一點是高斯判別分析相對於其他模型的優越之處。
以下是干貨
我們處理的數據往往是多維的,因此高斯分布也應該是多維的。一維的正態分布為
那么,n維正態分布表示為
這里;后邊的表示參數,該式表示以μ為均值,Σ為協方差的n維正態分布。
將n為高斯模型應用到監督學習中,假設輸入數據為x,類別為y(0或者1),那么對應二類的分類問題有
這就是經典的高斯判別分析模型,更為直觀化的表述為
p(y)是滿足伯努利概型(就是獨立實驗),第二個式子指的是當類別為y=0是,x的分布為一個高斯分布,第三個式子與第二個式子。上式中有四個參數(兩個高斯分布用了同一個方差),實際上感覺5個的話更精確。
剩下的問題就是如何對這些參數進行估計了,用極大似然估計的觀點本人沒有做出來(才疏學淺),可以用下面直觀地思路求解:每個數據的類別已經知道了,並且每一組別的數據分布都是高斯的,我們可以直接用高斯分布的參數估計來求解4(或者5)個參數。我們知道高斯分布的均值的估計就是數據的均值,那么
如果兩個高斯分布用一個Σ,那么
否則,可以單獨求取每個類別的方差,還有一個參數Φ,直接統計點的個數得到
這就是GDA的思路和實現方式,看起來這個模型還是一個較為naive的模型,此模型只能應用於監督學習中,並且數據的分部必須大致是高斯分布的,對於一些奇怪的形狀,可能並沒有好的分類結果。
上面提到,高斯判別分析是一個軟分類器,這就直接體現在數據與類別的分布(或者中心)的“親近”程度上,至於怎么做,相信都有不同的見解。最主要的是這種基於數據density的方式的思路是很有創新性的。
以下是實現結果
下面給出用MATLAB實現的高判別分析的代碼
1 clc,clear 2 mu1 = [2 3]; 3 SIGMA1 = [1 0; 0 1]; 4 n1=2; 5 m1=50; 6 r1 = mvnrnd(mu1,SIGMA1,m1); 7
8 mu2 = [5 5]; 9 SIGMA2 = [1 0; 0 1]; 10 n2=2; 11 m2=100; 12 r2 = mvnrnd(mu2,SIGMA2,m2); 13
14 x=[r1;r2]; 15 y=[zeros(m1,1);ones(m2,1)]; 16
17 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
18 % plot the datas 19 figure 20 pos = find(y); 21 neg = find(y == 0); 22 plot(x(pos, 1), x(pos, 2), '+') 23 hold on 24 plot(x(neg, 1), x(neg, 2), 'o') 25 hold on 26 xlabel('axis X') 27 ylabel('axis Y') 28
29
30 %%%%%%%%%%%%%%%%%%%
31 sigma1 = cov(x(neg,:)); 32 sigma2 = cov(x(pos,:)); 33 mu1=mean(x(neg,:)); 34 mu2=mean(x(pos,:)); 35
36 [x1 y1]=meshgrid(linspace(0,10,100)',linspace(0,10,100)'); 37
38
39 X1=[x1(:) y1(:)]; 40 z1=mvnpdf(X1,mu1,sigma1); 41 contour(x1,y1,reshape(z1,100,100),8); 42 hold on; 43
44 z2=mvnpdf(X1,mu2,sigma2); 45 contour(x1,y1,reshape(z2,100,100),8); 46 hold off;
原創文章,轉載請注明出處,謝謝!