GMM与EM算法(二)
2013-12-05 00:10
316 查看
Model-based——GMM(Gaussian Mixture Model)
1.GMM概念:
-将k个高斯模型混合在一起,没给但出现的概率是几个高斯混合的结果。
![](http://img.my.csdn.net/uploads/201211/11/1352610465_5206.png)
![](http://img.my.csdn.net/uploads/201211/11/1352610432_4755.jpg)
-假设有K个高斯分布,每个高斯对data points的影响因子为πk,数据点为x,高斯参数为theta,则
![](http://img.my.csdn.net/uploads/201211/11/1352610561_2090.jpg)
-要估计的模型参数为每个类的影响因子πk,每个类的均值(μk)及协方差矩阵(Σk)
2. GMM的似然函数:
log-likelihood function:
假设N个点的分布符合i.i.d,则有似然函数
![](http://img.my.csdn.net/uploads/201211/11/1352610841_4116.jpg)
问题是,对于这样的一个似然函数,用gradient descent的方法很难进行参数估计(可证明)
所以用前面我们讲过的EM(expectation maximization)算法进行估计:
![](http://img.my.csdn.net/uploads/201211/11/1352611097_6262.jpg)
引入中间latent项z(i),其分布为Q,用EM算法,就有上面的恒等,那么为什么是恒等呢?来看看讲EM的这篇文章,第三张的开头写的,
![](http://img.my.csdn.net/uploads/201211/12/1352709539_4954.jpg)
=constant,也就是说与z(i)无关了,而等于p(x(i);theta),这也就是说可以用混合高斯模型的概率表示了。
3. EM具体应用到GMM参数求解问题:
E-step: 根据已有observed data和现有模型估计missing data:Qi(zk)
M-step: 已经得到了Q
4000
,在M-step中进行最大似然函数估计(可以直接用log-likelihood似然函数对参数求偏导)
![](http://img.my.csdn.net/uploads/201211/11/1352612203_1546.jpg)
4. GMM的实现
5. K-Means与GMM的比较:
-KMeans:
1. Objective function:§Minimize the TSD
2. Can be optimized by an EM algorithm.
§E-step: assign points to clusters.
§M-step: optimize clusters.
§Performs hard assignment during E-step.
3. Assumes spherical clusters with equal probability of a cluster.
-GMM:
1. Objective function:§Maximize the log-likelihood.
2. EM algorithm:
§E-step: Compute posterior probability of membership.
§M-step: Optimize parameters.
§Perform soft assignment during E-step.
3. Can be used for non-sphericalclusters. Can generate clusterswith different probabilities.
本文主要针对如何用EM算法在混合高斯模型下进行聚类进行代码上的分析说明。
1. GMM模型:
每个 GMM 由 K 个 Gaussian 分布组成,每个 Gaussian 称为一个“Component”,这些 Component 线性加成在一起就组成了 GMM 的概率密度函数:
![](http://img.my.csdn.net/uploads/201211/19/1353293108_2454.png)
根据上面的式子,如果我们要从 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) 这些参数。 我们的想法是,找到这样一组参数,它所确定的概率分布生成这些给定的数据点的概率最大,而这个概率实际上就等于
![](http://img.my.csdn.net/uploads/201211/19/1353293302_7978.png)
,我们把这个乘积称作似然函数
(Likelihood Function)。通常单个点的概率都很小,许多很小的数字相乘起来在计算机里很容易造成浮点数下溢,因此我们通常会对其取对数,把乘积变成加和
![](http://img.my.csdn.net/uploads/201211/19/1353293325_8992.png)
,得到
log-likelihood function 。接下来我们只要将这个函数最大化(通常的做法是求导并令导数等于零,然后解方程),亦即找到这样一组参数值,它让似然函数取得最大值,我们就认为这是最合适的参数,这样就完成了参数估计的过程。
下面让我们来看一看 GMM 的 log-likelihood function :
![](http://img.my.csdn.net/uploads/201211/19/1353293351_6835.png)
由于在对数函数里面又有加和,我们没法直接用求导解方程的办法直接求得最大值。为了解决这个问题,我们采取之前从 GMM 中随机选点的办法:分成两步,实际上也就类似于K-means 的两步。
3. 算法流程:
1. 估计数据由每个 Component 生成的概率(并不是每个 Component 被选中的概率):对于每个数据
![](http://blog.pluskid.org/latexrender/pictures/1ba8aaab47179b3d3e24b0ccea9f4e30.png)
来说,它由第
![](http://blog.pluskid.org/latexrender/pictures/8ce4b16b22b58894aa86c421e8759df3.png)
个
Component 生成的概率为
![](http://img.my.csdn.net/uploads/201211/19/1353293606_4893.png)
其中N(xi | μk,Σk)就是后验概率
![](http://img.my.csdn.net/uploads/201211/19/1353294259_8709.jpg)
。
2. 通过极大似然估计可以通过求到令参数=0得到参数pMiu,pSigma的值。具体请见这篇文章第三部分。
![](http://img.my.csdn.net/uploads/201211/19/1353293943_5189.png)
其中
![](http://blog.pluskid.org/latexrender/pictures/c5fe9d4e6d474cc30475519bcdb6e38c.png)
,并且
![](http://blog.pluskid.org/latexrender/pictures/18db600e9b6993dd9ec8642eb24695dd.png)
也顺理成章地可以估计为
![](http://blog.pluskid.org/latexrender/pictures/3f7d6c033eb91dbc9164fc35d2bf4688.png)
。
3. 重复迭代前面两步,直到似然函数的值收敛为止。
4. matlab实现GMM聚类代码与解释:
说明:fea为训练样本数据,gnd为样本标号。算法中的思想和上面写的一模一样,在最后的判断accuracy方面,由于聚类和分类不同,只是得到一些 cluster ,而并不知道这些 cluster 应该被打上什么标签,或者说。由于我们的目的是衡量聚类算法的 performance ,因此直接假定这一步能实现最优的对应关系,将每个
cluster 对应到一类上去。一种办法是枚举所有可能的情况并选出最优解,另外,对于这样的问题,我们还可以用 Hungarian algorithm 来求解。具体的Hungarian代码我放在了资源里,调用方法已经写在下面函数中了。
注意:资源里我放的是Kmeans的代码,大家下载的时候只要用bestMap.m等几个文件就好~
1. gmm.m,最核心的函数,进行模型与参数确定。
[cpp] view
plaincopy
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
end
end
2. gmm_accuracy.m调用gmm.m,计算准确率:
[cpp] view
plaincopy
function [ Accuracy ] = gmm_accuracy( Data_fea, gnd_label, K )
%Calculate the accuracy Clustered by GMM model
px = 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);
end
end
3. 主函数调用
gmm_acc = gmm_accuracy(fea,gnd,N_classes);
写了本文进行总结后自己很受益,也希望大家可以好好YM下上面pluskid的gmm.m,不光是算法,其中的矩阵处理代码也写的很简洁,很值得学习。
另外看了两份东西非常受益,一个是pluskid大牛的《漫谈
Clustering (3): Gaussian Mixture Model》,一个是JerryLead的EM算法详解,大家有兴趣也可以看一下,写的很好。
src:http://blog.csdn.net/abcjennifer/article/details/8198352
1.GMM概念:
-将k个高斯模型混合在一起,没给但出现的概率是几个高斯混合的结果。
![](http://img.my.csdn.net/uploads/201211/11/1352610465_5206.png)
![](http://img.my.csdn.net/uploads/201211/11/1352610432_4755.jpg)
-假设有K个高斯分布,每个高斯对data points的影响因子为πk,数据点为x,高斯参数为theta,则
![](http://img.my.csdn.net/uploads/201211/11/1352610561_2090.jpg)
-要估计的模型参数为每个类的影响因子πk,每个类的均值(μk)及协方差矩阵(Σk)
2. GMM的似然函数:
log-likelihood function:
假设N个点的分布符合i.i.d,则有似然函数
![](http://img.my.csdn.net/uploads/201211/11/1352610841_4116.jpg)
问题是,对于这样的一个似然函数,用gradient descent的方法很难进行参数估计(可证明)
所以用前面我们讲过的EM(expectation maximization)算法进行估计:
![](http://img.my.csdn.net/uploads/201211/11/1352611097_6262.jpg)
引入中间latent项z(i),其分布为Q,用EM算法,就有上面的恒等,那么为什么是恒等呢?来看看讲EM的这篇文章,第三张的开头写的,
![](http://img.my.csdn.net/uploads/201211/12/1352709539_4954.jpg)
=constant,也就是说与z(i)无关了,而等于p(x(i);theta),这也就是说可以用混合高斯模型的概率表示了。
3. EM具体应用到GMM参数求解问题:
E-step: 根据已有observed data和现有模型估计missing data:Qi(zk)
M-step: 已经得到了Q
4000
,在M-step中进行最大似然函数估计(可以直接用log-likelihood似然函数对参数求偏导)
![](http://img.my.csdn.net/uploads/201211/11/1352612203_1546.jpg)
4. GMM的实现
5. K-Means与GMM的比较:
-KMeans:
1. Objective function:§Minimize the TSD
2. Can be optimized by an EM algorithm.
§E-step: assign points to clusters.
§M-step: optimize clusters.
§Performs hard assignment during E-step.
3. Assumes spherical clusters with equal probability of a cluster.
-GMM:
1. Objective function:§Maximize the log-likelihood.
2. EM algorithm:
§E-step: Compute posterior probability of membership.
§M-step: Optimize parameters.
§Perform soft assignment during E-step.
3. Can be used for non-sphericalclusters. Can generate clusterswith different probabilities.
本文主要针对如何用EM算法在混合高斯模型下进行聚类进行代码上的分析说明。
1. GMM模型:
每个 GMM 由 K 个 Gaussian 分布组成,每个 Gaussian 称为一个“Component”,这些 Component 线性加成在一起就组成了 GMM 的概率密度函数:
![](http://img.my.csdn.net/uploads/201211/19/1353293108_2454.png)
根据上面的式子,如果我们要从 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) 这些参数。 我们的想法是,找到这样一组参数,它所确定的概率分布生成这些给定的数据点的概率最大,而这个概率实际上就等于
![](http://img.my.csdn.net/uploads/201211/19/1353293302_7978.png)
,我们把这个乘积称作似然函数
(Likelihood Function)。通常单个点的概率都很小,许多很小的数字相乘起来在计算机里很容易造成浮点数下溢,因此我们通常会对其取对数,把乘积变成加和
![](http://img.my.csdn.net/uploads/201211/19/1353293325_8992.png)
,得到
log-likelihood function 。接下来我们只要将这个函数最大化(通常的做法是求导并令导数等于零,然后解方程),亦即找到这样一组参数值,它让似然函数取得最大值,我们就认为这是最合适的参数,这样就完成了参数估计的过程。
下面让我们来看一看 GMM 的 log-likelihood function :
![](http://img.my.csdn.net/uploads/201211/19/1353293351_6835.png)
由于在对数函数里面又有加和,我们没法直接用求导解方程的办法直接求得最大值。为了解决这个问题,我们采取之前从 GMM 中随机选点的办法:分成两步,实际上也就类似于K-means 的两步。
3. 算法流程:
1. 估计数据由每个 Component 生成的概率(并不是每个 Component 被选中的概率):对于每个数据
![](http://blog.pluskid.org/latexrender/pictures/1ba8aaab47179b3d3e24b0ccea9f4e30.png)
来说,它由第
![](http://blog.pluskid.org/latexrender/pictures/8ce4b16b22b58894aa86c421e8759df3.png)
个
Component 生成的概率为
![](http://img.my.csdn.net/uploads/201211/19/1353293606_4893.png)
其中N(xi | μk,Σk)就是后验概率
![](http://img.my.csdn.net/uploads/201211/19/1353294259_8709.jpg)
。
2. 通过极大似然估计可以通过求到令参数=0得到参数pMiu,pSigma的值。具体请见这篇文章第三部分。
![](http://img.my.csdn.net/uploads/201211/19/1353293943_5189.png)
其中
![](http://blog.pluskid.org/latexrender/pictures/c5fe9d4e6d474cc30475519bcdb6e38c.png)
,并且
![](http://blog.pluskid.org/latexrender/pictures/18db600e9b6993dd9ec8642eb24695dd.png)
也顺理成章地可以估计为
![](http://blog.pluskid.org/latexrender/pictures/3f7d6c033eb91dbc9164fc35d2bf4688.png)
。
3. 重复迭代前面两步,直到似然函数的值收敛为止。
4. matlab实现GMM聚类代码与解释:
说明:fea为训练样本数据,gnd为样本标号。算法中的思想和上面写的一模一样,在最后的判断accuracy方面,由于聚类和分类不同,只是得到一些 cluster ,而并不知道这些 cluster 应该被打上什么标签,或者说。由于我们的目的是衡量聚类算法的 performance ,因此直接假定这一步能实现最优的对应关系,将每个
cluster 对应到一类上去。一种办法是枚举所有可能的情况并选出最优解,另外,对于这样的问题,我们还可以用 Hungarian algorithm 来求解。具体的Hungarian代码我放在了资源里,调用方法已经写在下面函数中了。
注意:资源里我放的是Kmeans的代码,大家下载的时候只要用bestMap.m等几个文件就好~
1. gmm.m,最核心的函数,进行模型与参数确定。
[cpp] view
plaincopy
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
end
end
2. gmm_accuracy.m调用gmm.m,计算准确率:
[cpp] view
plaincopy
function [ Accuracy ] = gmm_accuracy( Data_fea, gnd_label, K )
%Calculate the accuracy Clustered by GMM model
px = 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);
end
end
3. 主函数调用
gmm_acc = gmm_accuracy(fea,gnd,N_classes);
写了本文进行总结后自己很受益,也希望大家可以好好YM下上面pluskid的gmm.m,不光是算法,其中的矩阵处理代码也写的很简洁,很值得学习。
另外看了两份东西非常受益,一个是pluskid大牛的《漫谈
Clustering (3): Gaussian Mixture Model》,一个是JerryLead的EM算法详解,大家有兴趣也可以看一下,写的很好。
src:http://blog.csdn.net/abcjennifer/article/details/8198352
相关文章推荐
- EM算法结合GMM混合高斯模型
- EM算法小结(对于GMM和pLSA)
- GMM的EM算法实现
- GMM的EM算法实现
- GMM的EM算法
- 机器学习笔记(十)EM算法及实践(以混合高斯模型(GMM)为例来次完整的EM)
- 学习笔记———《GMM模型以及基于EM算法的参数估计》
- GMM的EM算法实现
- GMM的EM算法
- EM算法解决GMM问题
- 使用EM算法估计GMM参数的原理及matlab实现
- GMM与EM算法
- [转载]GMM的EM算法实现
- GMM的EM算法实现
- EM算法与GMM的训练应用
- GMM混合高斯模型理论基础(基于EM算法)
- GMM的EM算法实现
- GMM与EM算法(一)
- GMM的EM算法实现
- GMM的EM算法实现