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 -by-K vector.
% ============================================================ threshold = 1e-;
[N, D] = size(X); if isscalar(K_or_centroids)
K = K_or_centroids;
% randomly pick centroids
rndp = randperm(N);
centroids = X(rndp(:K), :);
else
K = size(K_or_centroids, );
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, );
pGamma = pGamma ./ repmat(sum(pGamma, ), , K); % new value for parameters of each Component
Nk = sum(pGamma, );
pMiu = diag(./Nk) * pGamma' * X;
pPi = Nk/N;
for kk = :K
Xshift = X-repmat(pMiu(kk, :), N, );
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 ==
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(, K);
pSigma = zeros(D, D, K); % hard assign x to each centroids
distmat = repmat(sum(X.*X, ), , K) + ...
repmat(sum(pMiu.*pMiu, )', N, 1) - ...
*X*pMiu';
[dummy labels] = min(distmat, [], ); for k=:K
Xk = X(labels == k, :);
pPi(k) = size(Xk, )/N;
pSigma(:, :, k) = cov(Xk);
end
end function Px = calc_prob()
Px = zeros(N, K);
for k = :K
Xshift = X-repmat(pMiu(k, :), N, );
inv_pSigma = inv(pSigma(:, :, k));
tmp = sum((Xshift*inv_pSigma) .* Xshift, );
coef = (*pi)^(-D/) * sqrt(det(inv_pSigma));
Px(:, k) = coef * exp(-0.5*tmp);
end
end
end

(注:此段代码为GMM的EM算法实现)

1、isscalar

该函数用于判断输入参数是否是一个标量。在matlab中所谓标量,即1行1列的矩阵。
语法格式:
TF = isscalar(A)
如果矩阵A是一行一列的,则返回逻辑1(true),否则返回逻辑0(false)。
相关函数:isa、isvector
 
2、随机函数

a)rand函数

rand(n):生成0到1之间的n阶随机数方阵

rand(m,n):生成0到1之间的m×n的随机数矩阵

b)randint函数

randint(m,n,[1 N]):生成m×n的在1到N之间的随机整数矩阵,其效果与randint(m,n,N+1)相同。

>> randint(3,4,[1 10])

ans =

5     7     4    10
     5     1     2     7
     8     7     8     6
>> randint(3,4,11)

ans =

10     9     6     9
     5    10     8     9
    10     0     2     6

c)randperm函数

randperm(n):产生一个1到n的随机顺序。
>> randperm(10)

ans =

6     4     8     9     3     5     7   10     2     1

3、

xn是一个向量,也就是一维数组,xn(k:-1:k-M+1)的意义:假设k=10,M=5,则该式变为xn(10:-1:6),则x = xn(10:-1:6)的意思就算把xn(10)至xn(6)共五个数按从10到6的顺序赋给x(1)到x(5),即x(1)=xn(10),x(2)=xn(9)....,如果是正向的就不用加-1,例如xn(6:10),默认间隔为1.

4、inf、nan

Matlab中的Inf和-Inf分别代表正无穷和负无穷;

NaN表示非数值的值;

无穷一般是由于0 做了分母或者运算溢出,产生了超出双精度浮点数数值范围的结果;

非数值量则是因为0/0,或者Inf/Inf型的非正常运算。

5、zeros函数和ones函数

zeros函数——生成零矩阵

ones函数——生成全1阵

【zeros的使用方法】

B=zeros(n):生成n×n全零阵。

B=zeros(m,n):生成m×n全零阵。

B=zeros([m n]):生成m×n全零阵。

B=zeros(d1,d2,d3……):生成d1×d2×d3×……全零阵或数组。

B=zeros([d1 d2 d3……]):生成d1×d2×d3×……全零阵或数组。

B=zeros(size(A)):生成与矩阵A相同大小的全零阵。

【ones的使用方法】

ones的使用方法与zeros的使用方法类似。

6、repmat函数

repmat 即 Replicate Matrix ,复制和平铺矩阵

a)B = repmat(A,m,n)
将矩阵 A 复制 m×n 块,即把 A 作为 B 的元素,B 由 m×n 个 A 平铺而成。B 的维数是 [size(A,1)*m, size(A,2)*n] 。
>> A = [1,2;3,4]
A =
1 2
3 4
>> B = repmat(A,2,3)
B =
1 2 1 2 1 2
3 4 3 4 3 4
1 2 1 2 1 2
3 4 3 4 3 4
b)B = repmat(A,[m n])
与 B = repmat(A,m,n) 用法一致。
 
7、matlab代码中省略号代表改行没结束,进行续行。
 
8、max函数

a)MAX函数的几种形式 
(1)max(a)

(2)max(a,b)

(3)max(a,[],dim)

(4)[C,I]=max(a)

(5)[C,I]=max(a,[],dim) 
b)举例说明函数意思 
(1)max(a) 
如果a是一个矩阵,比如a=[1,2,3;4,5,6],max(a)的意思就是找出矩阵每列的最大值,

本例中:max(a)=[4,5,6] 
(2)max(a,b) 
如果a和b都是大于1维的矩阵,那么要求a和b的行列的维数都要相等,函数的结果是比较a和b中每个元素的大小,

比如: 
a=[1,2,3;4,5,6]      b=[4,5,6;7,8,3]

max(a,b)=[4,5,6;7,8,6]

另外,如果a和b中至少有一个是常数,也是可以的。

比如:a=[1,2,3;4,5,6]      b=3     c=5 
max(a,b)=[3,3,3;4,5,6]

max(b,c)=5 
(3)max(a,[],dim) 
这个函数的意思是针对于2维矩阵的,dim是英文字母dimension的缩写,意思是维数。

当dim=1时,比较的a矩阵的行,也就是和max(a)的效果是一样的;

当dim2时,比较的是a矩阵的列。

下面举个例子: 
a=[1,2,3;4,5,6]

max(a)=max(a,[],1)=[4,5,6]    比较的第一行和第二行的值

max(a,[],2)=[3,6]

(4)[C,I]=max(a) 
C表示的是矩阵a每列的最大值,I表示的是每个最大值对应的下标:

下面举例说明: 
还是刚才那个例子:a=[1,2,3;4,5,6]          [C,I]=max(a) 
结果显示的是C=[4,5,6]       I=[2,2,2]   返回的是最大值对应的行号。 
(5)[C,I]=max(a,[],dim) 
同理:如果dim=1时,其结果和[c,i]=max(a)是一样的。

当dim=2时,同样上面的矩阵a,我们运行一下: 
[c,i]=max(a,[],2)     结果是:c=[3,6]   i=[3,3]    i返回的是矩阵a的列号。

9、sum函数

sum(x,2)表示矩阵x的横向相加,求每行的和,结果是列向量。
而缺省的sum(x)就是竖向相加,求每列的和,结果是行向量。

A>0的结果是得到一个逻辑矩阵,大小跟原来的A一致,
A中大于零的元素的位置置为1,小于等于零的位置置为0。

所以横向求和以后,就是求A中每行大于零的元素个数。

例如
>> A=randn(5)

A =

-0.4326    1.1909   -0.1867    0.1139    0.2944
   -1.6656    1.1892    0.7258    1.0668   -1.3362
    0.1253   -0.0376   -0.5883    0.0593    0.7143
    0.2877    0.3273    2.1832   -0.0956    1.6236
   -1.1465    0.1746   -0.1364   -0.8323   -0.6918

>> sum(A)

ans =

-2.8316    2.8444    1.9976    0.3120    0.6043

>> sum(A>0)

ans =

2     4     2     3     3

>> sum(A<0)

ans =

3     1     3     2     2

>> sum(A,2)

ans =

0.9800
   -0.0200
    0.2730
    4.3261
   -2.6324

>> sum(A>0,2)

ans =

3
     3
     3
     4
     1

sum(A<0,2)

ans =

2
     2
     2
     1
     4

10、x.*x的含义:

它表示两个矩阵的相对应元素之间直接进行乘积运算。例如,A=[1 2 ;3 4 ],B=[5 6;7 8] .C=A.*B=[1*5 2*6;3*7 4*8]=[5 12;21 28].

11、size函数

size(A)函数是用来求矩阵的大小的,你必须首先弄清楚A到底是什么,大小是多少。

比如说一个A是一个3×4的二维矩阵:

a)、size(A) %直接显示出A大小

输出:ans=

3    4

b)、s=size(A)%返回一个行向量s,s的第一个元素是矩阵的行数,第二个元素是矩阵的列数

输出:s=

3    4

c)、[r,c]=size(A)%将矩阵A的行数返回到第一个输出变量r,将矩阵的列数返回到第二个输出变量c

输出:r=

3

c=

4

d)、[r,c,m]=size(A)

输出:r=

3

c=

4

m=

1

也就说它把二维矩阵当作第三维为1的三维矩阵,这也如同我们把n维列向量当作n×1的矩阵一样

e)、当a是一个n维行向量时,size(A)把其当成一个1×n的矩阵,因此size(a)的结果是

ans

1   n

而不是a的元素个数n

f)、size(A,n)

如果在size函数的输入参数中再添加一项n,并用1或2为n赋值,则 size将返回矩阵的行数或列数。其中r=size(A,1)该语句返回的是矩阵A的行数, c=size(A,2) 该语句返回的是矩阵A的列数。

12、diag函数

diag函数功能:矩阵对角元素的提取和创建对角阵

设以下X为方阵,v为向量

a、X = diag(v,k)当v是一个含有n个元素的向量时,返回一个n+abs(k)阶方阵X,向量v在矩阵X中的第k个对角线上,k=0表示主对角线,k>0表示在主对角线上方,k<0表示在主对角线下方。例1:

v=[1 2 3];
diag(v, 3)

ans =

0     0     0     1     0     0
     0     0     0     0     2     0
     0     0     0     0     0     3
     0     0     0     0     0     0
     0     0     0     0     0     0
     0     0     0     0     0     0

注:从主对角矩阵上方的第三个位置开始按对角线方向产生数据的

例2:

v=[1 2 3];
diag(v, -1)
ans =
      0 0 0 0
      1 0 0 0
      0 2 0 0
      0 0 3 0

注:从主对角矩阵下方的第一个位置开始按对角线方向产生数据的

b、X = diag(v)

向量v在方阵X的主对角线上,类似于diag(v,k),k=0的情况。

例3:

v=[1 2 3];
diag(v)

ans =

1 0 0
0 2 0
0 0 3

注:写成了对角矩阵的形式

cv = diag(X,k)

返回列向量v,v由矩阵X的第k个对角线上的元素形成

例4:

v=[1 0 3;2 3 1;4 5 3];
diag(v,1)

ans =

0
     1

注:把主对角线上方的第一个数据作为起始数据,按对角线顺序取出写成列向量形式

d、v = diag(X)返回矩阵X的主对角线上的元素,类似于diag(X,k),k=0的情况例5:

v=[1 0 0;0 3 0;0 0 3];
diag(v)

ans =

1
3
3

或改为:

v=[1 0 3;2 3 1;4 5 3];
diag(v)

ans =

1
3
3

注:把主对角线的数据取出写成列向量形式

e、diag(diag(X))

取出X矩阵的对角元,然后构建一个以X对角元为对角的对角矩阵。
例6:

X=[1 2;3 4]       
 diag(diag(X))

X =

1     2
     3     4

ans =

1     0
     0     4

matlab-2的更多相关文章

  1. Matlab 绘制三维立体图(以地质异常体为例)

    前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...

  2. Matlab slice方法和包络法绘制三维立体图

    前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...

  3. Matlab 高斯_拉普拉斯滤波器处理医学图像

    前言:本程序是我去年实现论文算法时所做.主要功能为标记切割肝脏区域.时间有点久,很多细节已经模糊加上代码做了很多注释,因此在博客中不再详述. NOTE: 程序分几大段功能模块,仔细阅读,对解决医学图像 ...

  4. MATLAB中绘制质点轨迹动图并保存成GIF

    工作需要在MATLAB中绘制质点轨迹并保存成GIF以便展示. 绘制质点轨迹动图可用comet和comet3命令,使用例子如下: t = 0:.01:2*pi;x = cos(2*t).*(cos(t) ...

  5. linux下配置matlab运行环境(MCR)

    在安装好的matlab下有MCR(MatlabCompilerRuntime)在matlab2011/toolbox/compiler/deploy/glnxa64下找到MCRInstaller.zi ...

  6. EMD分析 Matlab 精华总结 附开源工具箱(全)

    前言: 本贴写于2016年12与15日,UK.最近在学习EMD(Empirical Mode Decomposition)和HHT(Hilbert-Huang Transform)多分辨信号处理,FQ ...

  7. Atitit MATLAB 图像处理 经典书籍attilax总结

    Atitit MATLAB 图像处理 经典书籍attilax总结 1.1. MATLAB数字图像处理1 1.2. <MATLAB实用教程(第二版)>((美)穆尔 著)[简介_书评_在线阅读 ...

  8. Atitit MATLAB 图像处理attilax总结

    Atitit MATLAB 图像处理attilax总结 1.1. 下载 Matlab7.0官方下载_Matlab2012 v7.0 官方简体中文版-办公软件-系统大全.html1 1.2. Matla ...

  9. Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结

    Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...

  10. 使用MATLAB对图像处理的几种方法(下)

     试验报告 一.试验原理: 图像点处理是图像处理系列的基础,主要用于让我们熟悉Matlab图像处理的编程环境.灰度线性变换和灰度拉伸是对像素灰度值的变换操作,直方图是对像素灰度值的统计,直方图均衡是对 ...

随机推荐

  1. CentOS7重新生成 /boot/grub2/grub.cfg

    CentOS7重新生成 /boot/grub2/grub.cfg CentOS7 is using grub2 and the generated /boot/grub2/grub.cfg rathe ...

  2. The following signatures couldn't be verified because the public key is not available 解决方法

    今天试图把 deepin 的软件源加到我到 Ubuntu 16.04 中去. 在 deepin wiki 上看到一个教程. 在 /etc/apt/sources.list 中加上 deepin 的软件 ...

  3. 地理课(geography)

    地理课(geography) 题目描述 地理课上,老师给出了一个巨大的地图,由于世界日新月异,会有一些道路在某一时刻被删除,也会有一些道路在某一时刻被修建.这里的道路均为双向的. 老师认为,有一些城市 ...

  4. bzoj3609【HEOI2014】人人尽说江南好

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=3609 sol :博弈论  通过打表找规律,发现答案是%m循环的,且当m为偶数时取反  因为我太 ...

  5. JavaScript简明教程之Node.js

    Node.js是目前非常火热的技术,但是它的诞生经历却很奇特. 众所周知,在Netscape设计出JavaScript后的短短几个月,JavaScript事实上已经是前端开发的唯一标准. 后来,微软通 ...

  6. 【01】react 之 hello world

    React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.做出来以后,发现这套东西 ...

  7. pat 甲级 1049. Counting Ones (30)

    1049. Counting Ones (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The tas ...

  8. 【BZOJ1299】巧克力棒(Nim游戏,SG函数)

    题意:TBL和X用巧克力棒玩游戏.每次一人可以从盒子里取出若干条巧克力棒,或是将一根取出的巧克力棒吃掉正整数长度. TBL先手两人轮流,无法操作的人输. 他们以最佳策略一共进行了10轮(每次一盒).你 ...

  9. Sql Server 2005 中的row_number() 分页技术

    原文发布时间为:2009-05-08 -- 来源于本人的百度文章 [由搬家工具导入] 在Sql Server 2005中,我们可以利用新增函数row_number()来更高效的实现分页存储   CRE ...

  10. VIM 的 modeline 和 autocmd

    modeline vim的modeline可以让你针对每个文件进行文件级别的设置,这些设置是覆盖当前用户的vimrc中的设置的.当vim打开一个包含了vim modeline注释行的文件时,会自动读取 ...