- 阅读权限
- 255
- 威望
- 0 级
- 论坛币
- 17199 个
- 通用积分
- 1.5205
- 学术水平
- 8 点
- 热心指数
- 8 点
- 信用等级
- 8 点
- 经验
- 727 点
- 帖子
- 14
- 精华
- 0
- 在线时间
- 262 小时
- 注册时间
- 2014-5-6
- 最后登录
- 2024-4-8
硕士生
还不是VIP/贵宾
- 威望
- 0 级
- 论坛币
- 17199 个
- 通用积分
- 1.5205
- 学术水平
- 8 点
- 热心指数
- 8 点
- 信用等级
- 8 点
- 经验
- 727 点
- 帖子
- 14
- 精华
- 0
- 在线时间
- 262 小时
- 注册时间
- 2014-5-6
- 最后登录
- 2024-4-8
| 开心 2019-3-13 15:48:06 |
---|
签到天数: 7 天 连续签到: 1 天 [LV.3]偶尔看看II
|
200论坛币
- 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;
- while true
- Px = calc_prob();
-
- % new value for pGamma
- pGamma = Px .* repmat(pPi, N, 1);
- pGamma = pGamma ./ repmat(sum(pGamma, 2), 1, K);
-
- % new value for parameters of each Component
- Nk = sum(pGamma, 1);
- pMiu = diag(1./Nk) * pGamma' * X;
- pPi = Nk/N;
- 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 [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) + ...
- repmat(sum(pMiu.*pMiu, 2)', N, 1) - ...
- 2*X*pMiu';
- [dummy labels] = min(distmat, [], 2);
-
- for k=1:K
- Xk = X(labels == k, :);
- pPi(k) = size(Xk, 1)/N;
- pSigma(:, :, k) = cov(Xk);
- end
- end
-
- function Px = calc_prob()
- Px = zeros(N, K);
- for k = 1:K
- Xshift = X-repmat(pMiu(k, :), N, 1);
- inv_pSigma = inv(pSigma(:, :, k)+eye(D));
- tmp = sum((Xshift*inv_pSigma) .* Xshift, 2);
- coef = (2*pi)^(-D/2) * sqrt(det(inv_pSigma));
- Px(:, k) = coef * exp(-0.5*tmp);
- end
- end
- end
复制代码
MATLAB代码如上,第96行在执行时会出现
警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确。RCOND = 1.718855e-21。
> In gmm>calc_prob at 96
In gmm at 40
In gmm_accuracy at 4
代码是从这个网页获取的:http://blog.pluskid.org/?p=39&cpage=1#comments
关于这个问题也有相关的分析和解释:http://freemind.pluskid.org/mach ... ariance-estimation/
我不要求搞懂原理,只需要代码能够运行就好!
200个论坛币悬赏
|
最佳答案
Yafey 查看完整内容
楼主你好~我目前也遇到了这个问题。经过改错后已经可以运行:
问题原因:代码中没有处理singular问题
改正: 加几句代码,处理singular问题
把你第96行的function换成这个就好
function Px = calc_prob()
Px = zeros(N, K);
for k = 1:K
Xshift = X-repmat(pMiu(k, : ), N, 1);%x-u
lemda=1e-5;
conv=pSigma(:, :, k)+lemda*diag(diag(ones(D)));%这里处理singular问 ...
|