日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

混合高斯模型算法

發(fā)布時(shí)間:2024/4/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 混合高斯模型算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

下面介紹一下幾種典型的機(jī)器算法

首先第一種是高斯混合模型算法:

高斯模型有單高斯模型(SGM)和混合高斯模型(GMM)兩種。

(1)單高斯模型:

為簡(jiǎn)單起見,閾值t的選取一般靠經(jīng)驗(yàn)值來設(shè)定。通常意義下,我們一般取t=0.7-0.75之間。

二維情況如下所示:

(2)混合高斯模型:

?

??? ? 對(duì)于(b)圖所示的情況,很明顯,單高斯模型是無法解決的。為了解決這個(gè)問題,人們提出了高斯混合模型(GMM),顧名思義,就是數(shù)據(jù)可以看作是從數(shù)個(gè)高斯分布中生成出來的。雖然我們可以用不同的分布來隨意地構(gòu)造 XX Mixture Model ,但是 GMM是 最為流行。另外,Mixture Model 本身其實(shí)也是可以變得任意復(fù)雜的,通過增加 Model 的個(gè)數(shù),我們可以任意地逼近任何連續(xù)的概率密分布。

??? 每個(gè) GMM 由 K 個(gè) Gaussian 分布組成,每個(gè) Gaussian 稱為一個(gè)“Component”,這些 Component 線性加成在一起就組成了 GMM 的概率密度函數(shù):

?

? ? ? ? ? ? ? ? (1)

其中,πk表示選中這個(gè)component部分的概率,我們也稱其為加權(quán)系數(shù)。

根據(jù)上面的式子,如果我們要從 GMM 的分布中隨機(jī)地取一個(gè)點(diǎn)的話,實(shí)際上可以分為兩步:

(1)首先隨機(jī)地在這?K?個(gè) Component 之中選一個(gè),每個(gè) Component 被選中的概率實(shí)際上就是它的系數(shù)?πk,選中了 Component 之后,再單獨(dú)地考慮從這個(gè) Component 的分布中選取一個(gè)點(diǎn)就可以了──這里已經(jīng)回到了普通的 Gaussian 分布,轉(zhuǎn)化為了已知的問題。假設(shè)現(xiàn)在有?N?個(gè)數(shù)據(jù)點(diǎn),我們認(rèn)為這些數(shù)據(jù)點(diǎn)由某個(gè)GMM模型產(chǎn)生,現(xiàn)在我們要需要確定?πk,μk,σk?這些參數(shù)。很自然的,我們想到利用最大似然估計(jì)來確定這些參數(shù),GMM的似然函數(shù)如下:

? ? ? ? (2)

?

在最大似然估計(jì)里面,由于我們的目的是把乘積的形式分解為求和的形式,即在等式的左右兩邊加上一個(gè)log函數(shù),但是由上文博客里的(2)式可以看出,轉(zhuǎn)化為log后,還有l(wèi)og(a+b)的形式,因此,要進(jìn)一步求解。

我們采用EM算法,分布迭代求解最大值:

EM算法的步驟這里不作詳細(xì)的介紹,可以參見博客:

http://blog.pluskid.org/?p=39

貼出代碼:

1 function varargout = gmm(X, K_or_centroids)
2 % ============================================================
3 % Expectation-Maximization iteration implementation of
4 % Gaussian Mixture Model.
5 %
6 % PX = GMM(X, K_OR_CENTROIDS)
7 % [PX MODEL] = GMM(X, K_OR_CENTROIDS)
8 %
9 % - X: N-by-D data matrix.
10 % - K_OR_CENTROIDS: either K indicating the number of
11 % components or a K-by-D matrix indicating the
12 % choosing of the initial K centroids.
13 %
14 % - PX: N-by-K matrix indicating the probability of each
15 % component generating each point.
16 % - MODEL: a structure containing the parameters for a GMM:
17 % MODEL.Miu: a K-by-D matrix.
18 % MODEL.Sigma: a D-by-D-by-K matrix.
19 % MODEL.Pi: a 1-by-K vector.
20 % ============================================================
21
22 threshold = 1e-15;
23 [N, D] = size(X);
24
25 if isscalar(K_or_centroids)
26 K = K_or_centroids;
27 % randomly pick centroids
28 rndp = randperm(N);
29 centroids = X(rndp(1:K), :);
30 else
31 K = size(K_or_centroids, 1);
32 centroids = K_or_centroids;
33 end
34
35 % initial values
36 [pMiu pPi pSigma] = init_params();
37
38 Lprev = -inf;
39 while true
40 Px = calc_prob();
41
42 % new value for pGamma
43 pGamma = Px .* repmat(pPi, N, 1);
44 pGamma = pGamma ./ repmat(sum(pGamma, 2), 1, K);
45
46 % new value for parameters of each Component
47 Nk = sum(pGamma, 1);
48 pMiu = diag(1./Nk) * pGamma' * X;
49 pPi = Nk/N;
50 for kk = 1:K
51 Xshift = X-repmat(pMiu(kk, :), N, 1);
52 pSigma(:, :, kk) = (Xshift' * ...
53 (diag(pGamma(:, kk)) * Xshift)) / Nk(kk);
54 end
55
56 % check for convergence
57 L = sum(log(Px*pPi'));
58 if L-Lprev < threshold
59 break;
60 end
61 Lprev = L;
62 end
63
64 if nargout == 1
65 varargout = {Px};
66 else
67 model = [];
68 model.Miu = pMiu;
69 model.Sigma = pSigma;
70 model.Pi = pPi;
71 varargout = {Px, model};
72 end
73
74 function [pMiu pPi pSigma] = init_params()
75 pMiu = centroids;
76 pPi = zeros(1, K);
77 pSigma = zeros(D, D, K);
78
79 % hard assign x to each centroids
80 distmat = repmat(sum(X.*X, 2), 1, K) + ...
81 repmat(sum(pMiu.*pMiu, 2)', N, 1) - ...
82 2*X*pMiu';
83 [dummy labels] = min(distmat, [], 2);
84
85 for k=1:K
86 Xk = X(labels == k, :);
87 pPi(k) = size(Xk, 1)/N;
88 pSigma(:, :, k) = cov(Xk);
89 end
90 end
91
92 function Px = calc_prob()
93 Px = zeros(N, K);
94 for k = 1:K
95 Xshift = X-repmat(pMiu(k, :), N, 1);
96 inv_pSigma = inv(pSigma(:, :, k));
97 tmp = sum((Xshift*inv_pSigma) .* Xshift, 2);
98 coef = (2*pi)^(-D/2) * sqrt(det(inv_pSigma));
99 Px(:, k) = coef * exp(-0.5*tmp);
100 end
101 end
102 end


? ? 函數(shù)返回的?Px?是一個(gè)??的矩陣,對(duì)于每一個(gè)??,我們只要取該矩陣第??行中最大的那個(gè)概率值所對(duì)應(yīng)的那個(gè) Component 為??所屬的 cluster 就可以實(shí)現(xiàn)一個(gè)完整的聚類方法了。

?

參考資料:

【C++代碼】

http://www.cppblog.com/Terrile/archive/2011/01/19/120051.html

http://www.autonlab.org/tutorials/gmm.html

http://bubblexc.com/y2011/8/

http://blog.pluskid.org/?p=39&cpage=1#comments

?

總結(jié)

以上是生活随笔為你收集整理的混合高斯模型算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。