高斯判別分析(附Matlab實現)
生成學習算法
高斯判別分析(Gaussian Discriminant analysis,GDA),與之前的線性迴歸和Logistic迴歸從方法上講有很大的不同,GDA是一種生成學習算法(Generative Learning Algorithms),而之前的屬於判別學習算法(Discriminative Learning Algorithms)。
它們的主要區別是:
判別學習算法是直接訓練出p(y|x);
生成學習算法是分別訓練出各個類別的概率模型,之後再用Bayes公式算法出p(y|x);
通俗的說,判別模型是通過訓練樣本訓練出一個模型,再用測試點x帶入這個模型,最後算出x的可能類別;而生成學習模型是通過訓練樣本訓練出各個類別的多個模型,再將預測點x分別代入不同類別的模型中,進而判斷x到底屬於哪個類別(一般就看代入後那個模型的概率大就認爲x是哪一類,當然也有例外)。
高斯判別分析
GDA就是一種生成學習算法,通過生成不同類別的模型,再進一步估計出預測樣本的具體類別,爲了簡化問題,這裏只講二分類情況下的問題。
前提:
條件概率p(x|y)服從多維正態分佈,且輸入特徵x是連續且隨機的。
其分佈函數爲:
其中p(y)爲類別i的先驗概率,φ爲y=1的先驗概率值,μ0和μ1分別爲y=0和y=1的期望,Σ爲樣本的協方差,由此可以看出y是服從Bernoulli(φ)的分佈,x|y=0和x|y=1分別服從N(μ0,Σ)和N(μ1,Σ)。
Ps:這裏y=0和y=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=0和x|y=1都服從Poisson分佈(指數分佈族),則y|x也遵守Logistic迴歸