0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 function [mu, sigma, state] = ToolGmm(V, k, numMaxIter, prevState)
0013
0014 if (nargin < 3)
0015 numMaxIter = 1000;
0016 end
0017 if (nargin == 4)
0018 state = prevState;
0019 else
0020
0021 state = initState_I(V, k);
0022 end
0023
0024 for j = 1:numMaxIter
0025 prevState = state;
0026
0027
0028 p = computeProb_I(V, state);
0029
0030
0031 state = updateGaussians_I(V, p, state);
0032
0033
0034 if (max(sum(abs(state.m-prevState.m))) <= 1e-20)
0035 break;
0036 end
0037 end
0038
0039 mu = state.m;
0040 sigma = state.sigma;
0041 end
0042
0043 function [state] = updateGaussians_I(FeatureMatrix,p,state)
0044
0045
0046 K = size(state.m, 2);
0047
0048
0049 state.prior = mean(p, 1)';
0050
0051 for k = 1:K
0052 s = 0;
0053
0054
0055 state.m(:, k) = FeatureMatrix * p(:, k) / sum(p(:, k));
0056
0057
0058 F = FeatureMatrix - repmat(state.m(:, k), 1, size(FeatureMatrix, 2));
0059
0060 for n = 1:size(FeatureMatrix, 2)
0061 s = s + p(n, k) * (F(:, n) * F(:, n)');
0062 end
0063 state.sigma(:, :, k) = s / sum(p(:, k));
0064 end
0065 end
0066
0067 function [p] = computeProb_I(FeatureMatrix, state)
0068
0069 K = size(state.m, 2);
0070 p = zeros(size(FeatureMatrix, 2), K);
0071
0072
0073 for k = 1:K
0074
0075 F = FeatureMatrix - repmat(state.m(:, k), 1, size(FeatureMatrix, 2));
0076
0077
0078 p(:, k) = 1 / sqrt((2*pi)^size(F, 1) * det(state.sigma(:, :, k))) *...
0079 exp(-1/2 * sum((F .* (inv(state.sigma(:, :, k)) * F)), 1)');
0080 p(:, k) = state.prior(k) * p(:, k);
0081 end
0082
0083
0084 p = p ./ repmat(sum(p,2),1,K);
0085 end
0086
0087 function [state] = initState_I(FeatureMatrix,K)
0088
0089
0090 m = zeros(size(FeatureMatrix,1), K);
0091 sigma = zeros(size(FeatureMatrix,1), size(FeatureMatrix,1), K);
0092 prior = zeros(1,K);
0093
0094
0095 mIdx = round(rand(1,K)*(size(FeatureMatrix,2)-1))+1;
0096
0097
0098 m = FeatureMatrix(:,mIdx);
0099 prior = ones(1,K)/K;
0100 sigma = repmat(cov(FeatureMatrix'),1,1,K);
0101
0102
0103 state = struct('m',m,'sigma',sigma,'prior',prior);
0104 end