【谷速软件】matlab源码-GMM的EM算法实现_第1页
【谷速软件】matlab源码-GMM的EM算法实现_第2页
【谷速软件】matlab源码-GMM的EM算法实现_第3页
【谷速软件】matlab源码-GMM的EM算法实现_第4页
【谷速软件】matlab源码-GMM的EM算法实现_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

聚类算法K-Means,K-Medoids,GMM,Spectralclustering,Ncut一文中我们给出了GMM算法的根本模型与似然函数,在EM算法原理中对EM算法的实现与收敛性证明进行了详细说明。本文主要针对如何用EM算法在混合高斯模型下进行聚类进行代码上的分析说明。

1.GMM模型:每个GMM由K

个Gaussian分布组成,每个Gaussian称为一个“Component〞,这些Component线性加成在一起就组成了GMM的概率密度函数:

根据上面的式子,如果我们要从GMM的分布中随机地取一个点的话,实际上可以分为两步:首先随机地在这K个GaussianComponent之中选一个,每个Component被选中的概率实际上就是它的系数pi(k)

,选中了Component之后,再单独地考虑从这个Component的分布中选取一个点就可以了──这里已经回到了普通的Gaussian分布,转化为了的问题。那么如何用GMM来做clustering呢?其实很简单,现在我们有了数据,假定它们是由GMM生成出来的,那么我们只要根据数据推出GMM的概率分布来就可以了,然后GMM的K

个Component实际上就对应了K

个cluster了。根据数据来推算概率密度通常被称作densityestimation,特别地,当我们在〔或假定〕了概率密度函数的形式,而要估计其中的参数的过程被称作“参数估计〞。

2.参数与似然函数:现在假设我们有N

个数据点,并假设它们服从某个分布〔记作p(x)

〕,现在要确定里面的一些参数的值,例如,在GMM中,我们就需要确定影响因子pi(k)、各类均值pMiu(k)

和各类协方差pSigma(k)

这些参数。我们的想法是,找到这样一组参数,它所确定的概率分布生成这些给定的数据点的概率最大,而这个概率实际上就等于

,我们把这个乘积称作似然函数(LikelihoodFunction)。通常单个点的概率都很小,许多很小的数字相乘起来在计算机里很容易造成浮点数下溢,因此我们通常会对其取对数,把乘积变成加和

,得到log-likelihoodfunction。接下来我们只要将这个函数最大化〔通常的做法是求导并令导数等于零,然后解方程〕,亦即找到这样一组参数值,它让似然函数取得最大值,我们就认为这是最适宜的参数,这样就完成了参数估计的过程。下面让我们来看一看GMM的log-likelihoodfunction:

由于在对数函数里面又有加和,我们没法直接用求导解方程的方法直接求得最大值。为了解决这个问题,我们采取之前从GMM中随机选点的方法:分成两步,实际上也就类似于K-means

的两步。

3.算法流程:1.

估计数据由每个Component生成的概率〔并不是每个Component被选中的概率〕:对于每个数据

来说,它由第

个Component生成的概率为

其中N〔xi|μk,Σk〕就是后验概率。

2.通过极大似然估计可以通过求到令参数=0得到参数pMiu,pSigma的值。具体请见这篇文章第三局部。

其中

,并且

也顺理成章地可以估计为

3.

重复迭代前面两步,直到似然函数的值收敛为止。

4.matlab实现GMM聚类代码与解释:

说明:fea为训练样本数据,gnd为样本标号。算法中的思想和上面写的一模一样,在最后的判断accuracy方面,由于聚类和分类不同,只是得到一些cluster,而并不知道这些cluster应该被打上什么标签,或者说。由于我们的目的是衡量聚类算法的performance,因此直接假定这一步能实现最优的对应关系,将每个cluster对应到一类上去。一种方法是枚举所有可能的情况并选出最优解,另外,对于这样的问题,我们还可以用

Hungarianalgorithm

来求解。具体的Hungarian代码我放在了资源里,调用方法已经写在下面函数中了。

注意:资源里我放的是Kmeans的代码,大家下载的时候只要用bestMap.m等几个文件就好~

1.gmm.m,最核心的函数,进行模型与参数确定。[cpp]

\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?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

()

%

@Appended

by

:

Sophia_qing

(/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));

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论