什么是混合高斯模型

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

混合高斯模型

下面给出了matlab实现代码,并将数学表达式转化为矩阵运算

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.

% ============================================================

threshold = 1e-15;

[N, D] = size(X);

if isscalar(K_or_centroids)

K = K_or_centroids;

% randomly pick centroids

rndp = randperm(N);

centroids = X(rndp(1:K), :);

else

K = size(K_or_centroids, 1);

centroids = K_or_centroids;

end

% initial values

[pMiu pPi pSigma] = init_params(); %初始化

Lprev = -inf; %inf表示正无究大,-inf表示为负无究大

while true

Px = calc_prob();

% new value for pGamma

pGamma = Px .* repmat(pPi, N, 1);

pGamma = pGamma ./ repmat(sum(pGamma, 2), 1, K); %求每个样本由第K个聚类,也叫“component“生成的概率

% new value for parameters of each Component

Nk = sum(pGamma, 1);

pMiu = diag(1./Nk) * pGamma' * X; %重新计算每个component的均值

pPi = Nk/N; %更新混合高斯的加权系数

for kk = 1:K %重新计算每个component的协方差

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;

varargout = {Px};

else%否则,返回[Px model],其中model是结构体

model = [];

model.Miu = pMiu;

model.Sigma = pSigma;

model.Pi = pPi;

varargout = {Px, model};

end

function [pMiu pPi pSigma] = init_params()

pMiu = centroids;

pPi = zeros(1, K);

pSigma = zeros(D, D, K);

% hard assign x to each centroids

distmat = repmat(sum(X.*X, 2), 1, K) + ... %distmat第j行的第i个元素表示第j个数据与第i个聚类点的距离,如果数据有4个,聚类2个,那么distmat就是4*2矩阵

repmat(sum(pMiu.*pMiu, 2)', N, 1) - 2*X*pMiu'; %sum(A,2)结果为列向量,第i个元素是第i行的求和

[dummy labels] = min(distmat, [], 2); %返回列向量dummy和labels,dummy向量记录

相关文档
最新文档