Gaussian discriminant analysis 高斯判別分析

高斯判別分析(附Matlab實現)


生成學習算法

 

高斯判別分析(Gaussian Discriminant analysisGDA),與之前的線性迴歸和Logistic迴歸從方法上講有很大的不同,GDA是一種生成學習算法(Generative Learning Algorithms),而之前的屬於判別學習算法(Discriminative Learning Algorithms)。

 

它們的主要區別是:

判別學習算法是直接訓練出py|x);

生成學習算法是分別訓練出各個類別的概率模型,之後再用Bayes公式算法出py|x);


通俗的說,判別模型是通過訓練樣本訓練出一個模型,再用測試點x帶入這個模型,最後算出x的可能類別;而生成學習模型是通過訓練樣本訓練出各個類別的多個模型,再將預測點x分別代入不同類別的模型中,進而判斷x到底屬於哪個類別(一般就看代入後那個模型的概率大就認爲x是哪一類,當然也有例外)。


高斯判別分析

 

GDA就是一種生成學習算法,通過生成不同類別的模型,再進一步估計出預測樣本的具體類別,爲了簡化問題,這裏只講二分類情況下的問題。

 

前提:

條件概率px|y)服從多維正態分佈,且輸入特徵x是連續且隨機的。

 

其分佈函數爲:

其中p(y)爲類別i的先驗概率,φ爲y=1的先驗概率值,μ0和μ1分別爲y=0y=1的期望,Σ爲樣本的協方差,由此可以看出y是服從Bernoulli(φ)的分佈,x|y=0x|y=1分別服從N(μ0,Σ)和N(μ1,Σ)。

Ps:這裏y=0y=1時用的是同一個協方差,至於爲什麼?我感覺很難說清

 

其似然函數如下

爲了使似然函數達到最大,可得和參數的估計值爲

有了這些估計值我們就能生成屬於各個類別的模型了。

 

In Matlab 


這代碼其實很簡單,分別算出各參數的值,再帶入matlab預有的生成函數就行

代碼如下:

clear all; close all; clc

% data 

x = [0.230000 0.394000;
0.238000 0.524000;
0.422000 0.494000;
0.364000 0.556000;
0.320000 0.448000;
0.532000 0.606000;
0.358000 0.660000;
0.144000 0.442000;
0.124000 0.674000;
0.520000 0.692000;
0.410000 0.086000;
0.344000 0.154000;
0.490000 0.228000;
0.622000 0.366000;
0.390000 0.270000;
0.514000 0.142000;
0.616000 0.180000;
0.576000 0.082000;
0.628000 0.286000;
0.780000 0.282000];

x1 = x(:,1);
x2 = x(:,2);

y = [0;
    0;
    0;
    0;
    0;
    0; 
    0;
    0;
    0;
    0;
    1;
    1;
    1;
    1;
    1;
    1;
    1;
    1;
    1;
    1];

[m, n] = size(x);

% plot the datas
figure
pos = find(y); neg = find(y == 0);      %find是找到的一個向量,其結果是find函數括號值爲真時的值的編號
plot(x(pos, 1), x(pos, 2), '+')
hold on
plot(x(neg, 1), x(neg, 2), 'o')
hold on
xlabel('axis X')
ylabel('axis Y')

m_ones = ones(m,1);  % 20 * 1的矩陣,元素全爲1

sum0 = (1-y)' * m_ones; % 標記爲0的樣本個數
sum1 = y' * m_ones;     % 標記爲1的樣本個數

mu0 = [(1-y)'*x1/sum0 (1-y)'*x2/sum0];  % 標記爲0的期望
mu1 = [y'*x1/sum1  y'*x2/sum1];         % 標記爲1的期望

sigma = cov(x1,x2);     % 協方差

[x y]=meshgrid(linspace(0,1,50)',linspace(0,1,50)'); 
X=[x(:) y(:)]; 
z1=mvnpdf(X,mu0,sigma);
contour(x,y,reshape(z1,50,50),4);
hold on;

[x y]=meshgrid(linspace(0,1,50)',linspace(0,1,50)'); 
X=[x(:) y(:)]; 
z2=mvnpdf(X,mu1,sigma);
contour(x,y,reshape(z2,50,50),4);
hold off


效果圖如下:


標準的結果應該是這樣的:


感覺好像一樣,又感覺好像不一樣,也不知道我這到底錯沒錯,也許是訓練集沒有服從高斯分佈吧,等有空再找個服從高斯分佈的樣本集試試。


拓展


當將p(y=1|x;φ,μ0,μ1,Σ)看成是一個x的函數時,可以發現p(y=1|x)將會近似成一個Logistic函數。如下圖(畫的難看,見諒)


分佈函數可以寫成

其中θ是φ,μ0,μ1,Σ的函數。其實這個函數也就是這個問題的判別學習算法形式了。

那問題自然就來了,到底選哪一個會更好呢?

當然通常的回答肯定不會出現絕對哪一個會更好,要不差的那個根本就沒有存在的價值了嘛,依然是具體問題具體分析,我相信機器學習中的很多問題都是這樣的,看你對數據的理解程度了。

這裏有幾個tips可以幫助我們做判斷,至於要講出個之所以然來,我想,任重而道遠啊。

1、當x|y服從多維高斯分佈時,則其後驗概率y|x服從Logistic迴歸;但反過來並不成立。

2、當已知x|y服從高斯分佈,則GDA是一個好的選擇,若不服從高斯分佈,卻使用了GDA,其表達效果往往沒有Logistic迴歸好。----GDA是一個更強條件的分類算法

3、若x|y=0x|y=1都服從Poisson分佈(指數分佈族),則y|x也遵守Logistic迴歸

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章