GMM的EM演算法實現

來源:互聯網
上載者:User

標籤:style   blog   http   color   strong   檔案   

在 聚類演算法K-Means, K-Medoids, GMM, Spectral clustering,Ncut一文中我們給出了GMM演算法的基本模型與似然函數,在EM演算法原理中對EM演算法的實現與收斂性證明進行了具體說明。本文主要針對怎樣用EM演算法在混合高斯模型下進行聚類進行代碼上的分析說明。


1. GMM模型:

每一個 GMM 由 K 個 Gaussian 分布組成,每一個 Gaussian 稱為一個“Component”,這些 Component 線性加成在一起就組成了 GMM 的機率密度函數:


依據上面的式子,如果我們要從 GMM 的分布中隨機地取一個點的話,實際上能夠分為兩步:首先隨機地在這 K個Gaussian Component 之中選一個,每一個 Component 被選中的機率實際上就是它的係數 pi(k) ,選中了 Component 之後,再單獨地考慮從這個 Component 的分布中選取一個點就能夠了──這裡已經回到了普通的 Gaussian 分布,轉化為了已知的問題。

那麼怎樣用 GMM 來做 clustering 呢?事實上非常簡單,如今我們有了資料,假定它們是由 GMM 產生出來的,那麼我們僅僅要依據資料推出 GMM 的機率分布來就能夠了,然後 GMM 的 K 個 Component 實際上就相應了 K 個 cluster 了。依據資料來推算機率密度通常被稱作 density estimation ,特別地,當我們在已知(或假定)了機率密度函數的形式,而要預計當中的參數的過程被稱作“參數預計”。


2. 參數與似然函數:

如今如果我們有 N 個資料點,並如果它們服從某個分布(記作 p(x) ),如今要確定裡面的一些參數的值,比如,在 GMM 中,我們就須要確定 影響因子pi(k)、各類均值pMiu(k) 和 各類共變數pSigma(k) 這些參數。 我們的想法是,找到這樣一組參數,它所確定的機率分布產生這些給定的資料點的機率最大,而這個機率實際上就等於  ,我們把這個乘積稱作似然函數 (Likelihood Function)。通常單個點的機率都非常小,很多非常小的數字相乘起來在電腦裡非常easy造成浮點數下溢,因此我們一般會對其取對數,把乘積變成加和 ,得到 log-likelihood function 。接下來我們僅僅要將這個函數最大化(通常的做法是求導並令導數等於零,然後解方程),亦即找到這樣一組參數值,它讓似然函數取得最大值,我們就覺得這是最合適的參數,這樣就完畢了參數預計的過程。

以下讓我們來看一看 GMM 的 log-likelihood function :


因為在對數函數裡面又有加和,我們沒法直接用求導解方程的辦法直接求得最大值。為瞭解決問題,我們採取之前從 GMM 中隨機選點的辦法:分成兩步,實際上也就相似於K-means 的兩步。



3. 演算法流程:

1.  預計資料由每一個 Component 產生的機率(並非每一個 Component 被選中的機率):對於每一個資料  來說,它由第  個 Component 產生的機率為


當中N(xi | μk,Σk)就是後驗機率。


2. 通過極大似然預計能夠通過求到令參數=0得到參數pMiu,pSigma的值。具體請見這篇文章第三部分。


當中  ,而且  也順理成章地能夠預計為  。


3. 反覆迭代前面兩步,直到似然函數的值收斂為止。



4. matlab實現GMM聚類代碼與解釋:


說明:fea為訓練樣本資料,gnd為樣本標號。演算法中的思想和上面寫的一模一樣,在最後的推斷accuracy方面,因為聚類和分類不同,僅僅是得到一些 cluster ,而並不知道這些 cluster 應該被打上什麼標籤,或者說。因為我們的目的是衡量聚類演算法的 performance ,因此直接假定這一步能實現最優的相應關係,將每一個 cluster 相應到一類上去。一種辦法是枚舉全部可能的情況並選出最優解,另外,對於這種問題,我們還能夠用 Hungarian algorithm 來求解。具體的Hungarian代碼我放在了資源裡,調用方法已經寫在以下函數中了。


注意:資源裡我放的是Kmeans的代碼,大家下載的時候僅僅要用bestMap.m等幾個檔案就好~


1. gmm.m,最核心的函數,進行模型與參數確定。

function varargout = gmm(X, K_or_centroids)% ============================================================% Expectation-Maximization iteration implementation of% Gaussian Mixture Model.%% PX = GMM(X, K_OR_CENTROIDS)% [PX MODEL] = GMM(X, K_OR_CENTROIDS)%%  - X: N-by-D data matrix.%  - K_OR_CENTROIDS: either K indicating the number of%       components or a K-by-D matrix indicating the%       choosing of the initial K centroids.%%  - PX: N-by-K matrix indicating the probability of each%       component generating each point.%  - MODEL: a structure containing the parameters for a GMM:%       MODEL.Miu: a K-by-D matrix.%       MODEL.Sigma: a D-by-D-by-K matrix.%       MODEL.Pi: a 1-by-K vector.% ============================================================% @SourceCode Author: Pluskid (http://blog.pluskid.org)% @Appended by : Sophia_qing (http://blog.csdn.net/abcjennifer)    %% Generate Initial Centroids    threshold = 1e-15;    [N, D] = size(X);     if isscalar(K_or_centroids) %if K_or_centroid is a 1*1 number        K = K_or_centroids;        Rn_index = randperm(N); %random index N samples        centroids = X(Rn_index(1:K), :); %generate K random centroid    else % K_or_centroid is a initial K centroid        K = size(K_or_centroids, 1);         centroids = K_or_centroids;    end     %% initial values    [pMiu pPi pSigma] = init_params();     Lprev = -inf; %上一次聚類的誤差        %% EM Algorithm    while true        %% Estimation Step        Px = calc_prob();         % new value for pGamma(N*k), pGamma(i,k) = Xi由第k個Gaussian產生的機率        % 或者說xi中有pGamma(i,k)是由第k個Gaussian產生的        pGamma = Px .* repmat(pPi, N, 1); %分子 = pi(k) * N(xi | pMiu(k), pSigma(k))        pGamma = pGamma ./ repmat(sum(pGamma, 2), 1, K); %分母 = pi(j) * N(xi | pMiu(j), pSigma(j))對全部j求和         %% Maximization Step - through Maximize likelihood Estimation                Nk = sum(pGamma, 1); %Nk(1*k) = 第k個高斯產生每一個樣本的機率的和,全部Nk的總和為N。                % update pMiu        pMiu = diag(1./Nk) * pGamma‘ * X; %update pMiu through MLE(通過令導數 = 0得到)        pPi = Nk/N;                % update k個 pSigma        for kk = 1:K             Xshift = X-repmat(pMiu(kk, :), N, 1);            pSigma(:, :, kk) = (Xshift‘ * ...                (diag(pGamma(:, kk)) * Xshift)) / Nk(kk);        end         % check for convergence        L = sum(log(Px*pPi‘));        if L-Lprev < threshold            break;        end        Lprev = L;    end     if nargout == 1        varargout = {Px};    else        model = [];        model.Miu = pMiu;        model.Sigma = pSigma;        model.Pi = pPi;        varargout = {Px, model};    end     %% Function Definition        function [pMiu pPi pSigma] = init_params()        pMiu = centroids; %k*D, 即k類的中心點        pPi = zeros(1, K); %k類GMM所佔權重(influence factor)        pSigma = zeros(D, D, K); %k類GMM的共變數矩陣,每一個是D*D的         % 距離矩陣,計算N*K的矩陣(x-pMiu)^2 = x^2+pMiu^2-2*x*Miu        distmat = repmat(sum(X.*X, 2), 1, K) + ... %x^2, N*1的矩陣replicateK列            repmat(sum(pMiu.*pMiu, 2)‘, N, 1) - ...%pMiu^2,1*K的矩陣replicateN行            2*X*pMiu‘;        [~, labels] = min(distmat, [], 2);%Return the minimum from each row         for k=1:K            Xk = X(labels == k, :);            pPi(k) = size(Xk, 1)/N;            pSigma(:, :, k) = cov(Xk);        end    end     function Px = calc_prob()         %Gaussian posterior probability         %N(x|pMiu,pSigma) = 1/((2pi)^(D/2))*(1/(abs(sigma))^0.5)*exp(-1/2*(x-pMiu)‘pSigma^(-1)*(x-pMiu))        Px = zeros(N, K);        for k = 1:K            Xshift = X-repmat(pMiu(k, :), N, 1); %X-pMiu            inv_pSigma = inv(pSigma(:, :, k));            tmp = sum((Xshift*inv_pSigma) .* Xshift, 2);            coef = (2*pi)^(-D/2) * sqrt(det(inv_pSigma));            Px(:, k) = coef * exp(-0.5*tmp);        end    endend


2. gmm_accuracy.m調用gmm.m,計算準確率:

function [ Accuracy ] = gmm_accuracy( Data_fea, gnd_label, K )%Calculate the accuracy Clustered by GMM modelpx = gmm(Data_fea,K);[~, cls_ind] = max(px,[],1); %cls_ind = cluster label Accuracy = cal_accuracy(cls_ind, gnd_label);    function [acc] = cal_accuracy(gnd,estimate_label)        res = bestMap(gnd,estimate_label);        acc = length(find(gnd == res))/length(gnd);    endend


3. 主函數調用

gmm_acc = gmm_accuracy(fea,gnd,N_classes);








寫了本文進行總結後自己非常受益,也希望大家能夠好好YM下上面pluskid的gmm.m,不光是演算法,當中的矩陣處理代碼也寫的非常簡潔,非常值得學習。

另外看了兩份東西非常受益,一個是pluskid大牛的《漫談 Clustering (3): Gaussian Mixture Model》,一個是JerryLead的EM演算法具體解釋,大家有興趣也能夠看一下,寫的非常好。



關於Machine Learning很多其它的學習資料與相關討論將繼續更新,敬請關注本部落格和新浪微博Sophia_qing。




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.