天天看點

[監督學習]GDA 高斯判别分析

  高斯判别分析(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;       

原創文章,轉載請注明出處,謝謝!