EM and GMM(Code)

In EM and GMM(Theory), I have introduced the theory of em algorithm for gmm. Now lets practice it in matlab!

1. Generate 1000 pieces of  random 2-dimention data which obey 5 gaussian distribution.

function X = GenerateData
    Sigma = [1, 0; 0, 1];
    mu1 = [1, -1];
    x1 = mvnrnd(mu1, Sigma, 200);
    mu2 = [5.5, -4.5];
    x2 = mvnrnd(mu2, Sigma, 200);
    mu3 = [1, 4];
    x3 = mvnrnd(mu3, Sigma, 200);
    mu4 = [6, 4.5];
    x4 = mvnrnd(mu4, Sigma, 200);
    mu5 = [9, 0.0];
    x5 = mvnrnd(mu5, Sigma, 200);
    % obtain the 1000 data points to be clustered
    X = [x1; x2; x3; x4; x5];
end

2. Complete em algorithm.

function [Mu, Sigma, Pi, r_nk] = EmForGmm(Data, classNum, initVal)
    % Data : Matrix(n * d), n is the quantity of the data and d is the data
    %        dimention
    % classNum : Scale
    % initVal : Cell(3 * 1), initial value for Mu, Sigma and Pi
    %           cell 1: Mu
    %           cell 2: Sigma
    %           cell 3: Pi
    [sampleNum, sampleDim] = size(Data);
    indexPoint = zeros(sampleNum, 1);
    while(1)
        for n = 1 : sampleNum
            x = Data(n, :);
            px_nk_sumk = 0;
            for k = 1 : classNum
                Sigma_k = initVal{2}(:,:,k);
                Mu_k = initVal{1}(k,:);
                Pi_k = initVal{3}(k);
                px(n,k) = (1/(2*pi^(sampleDim/2)*det(Sigma_k)^(0.5))) ...
                    * exp(-0.5 * (x - Mu_k)*inv(Sigma_k)*(x - Mu_k)‘);
                px_nk_sumk = px_nk_sumk + Pi_k * px(n, k);
            end
            for k = 1 : classNum
                Sigma_k = initVal{2}(:,:,k);
                Mu_k = initVal{1}(k,:);
                Pi_k = initVal{3}(k);
                r(n, k) = Pi_k * px(n, k) / px_nk_sumk;
            end
        end
        Nk = sum(r)‘;
        newMuK = r‘ * Data;
        Nkk = repmat(Nk,1,2);
        newMuK = newMuK ./ Nkk;
        for i = 1 : classNum
            nk = Nk(i);
            MuT = repmat(newMuK(i,:),sampleNum,1);
            xT = Data - MuT;
            rT = r(:,i);
            rT = repmat(rT,1,2);
            newSigma(:,:,i) = xT‘ * (xT .* rT) / nk;
        end
        newPiK = Nk / sampleNum;
        indexPointT = indexPoint;
        [aa,indexPoint] = max(r,[],2);
        j1 = sum(sum(abs(newMuK - initVal{1}))) < 1e-6;
        j2 = sum(sum(sum(abs(newSigma - initVal{2})))) < 1e-6;
        j3 = sum(abs(newPiK - initVal{3})) < 1e-6;
        clf;
        if (j1 && j2 && j3)
            for i = 1:sampleNum
                if (indexPoint(i)==1)
                    plot(Data(i,1), Data(i,2), ‘r.‘)
                end
                if (indexPoint(i)==2)
                    plot(Data(i,1), Data(i,2), ‘b.‘)
                end
                if (indexPoint(i)==3)
                    plot(Data(i,1), Data(i,2), ‘k.‘)
                end
                if (indexPoint(i)==4)
                    plot(Data(i,1), Data(i,2), ‘g.‘)
                end
                if (indexPoint(i)==5)
                    plot(Data(i,1), Data(i,2), ‘m.‘)
                end
                hold on;
            end
            break;
        else
            initVal{1} = newMuK;
            initVal{2} = newSigma;
            initVal{3} = newPiK;
        end
    end
    Mu = newMuK;
    Sigma = newSigma;
    Pi = newPiK;
    r_nk = r;
end

 3. Complete main function.

clear,clc,clf
Data = GenerateData;
classNum = 5;
[sampleNum, sampleDia] = size(Data);

%% Initial value
% indexNum = floor(1 + (sampleNum - 1) * rand(1,classNum));
indexNum = [50,300,500,700,900];
initMu = Data(indexNum,:);

initSigmaT = [1 0.2;0.2 1];
initSigma = zeros(2,2,classNum);
for i = 1 : classNum
    initSigma(:,:,i) = initSigmaT;
    initPi(i,1) = 1 / classNum;
end
initVal = cell(3,1);
initVal{1} = initMu;
initVal{2} = initSigma;
initVal{3} = initPi;

%% EM algorithm
[Mu, Sigma, Pi, r_nk] = EmForGmm(Data, classNum, initVal);

4. Result.

The cluster result can be show as figure 3.

Figure 3

  The probality distribution function can be writen as:

\[  p(\mathbf{x}) = \sum_{k=1}^{K}\pi_kp(\mathbf{x}|\mu_k\Sigma_k)  \]

where,

  $\mu_1  =  (1.028, -1.158) $, $\mu_2  =  (5.423, -4.538) $, $\mu_3  =  (1.036, 3.975) $,  $\mu_4  =  (5.835, 4.474) $,  $\mu_5  =  (9.074, -0.063) $

Notice that, when generate the data:

$\mu_1  =  (1, -1) $, $\mu_2  =  (5.5, -4.5) $, $\mu_3  =  (1, 4) $, $\mu_4  =  (6, 4.5) $, $\mu_5  =  (9, 0) $)



\[
\Sigma_1 = \left(
\begin{array}{cc}
1.0873& 0.0376\\
0.0376& 0.8850
\end{array}
\right),
\Sigma_2 = \left(
\begin{array}{cc}
1.1426& 0.0509\\
0.0509& 0.9192
\end{array}
\right),
\Sigma_3 = \left(
\begin{array}{cc}
0.9752& -0.0712\\
-0.0712& 0.9871
\end{array}
\right),
\Sigma_4 = \left(
\begin{array}{cc}
1.0111& -0.0782\\
-0.0782& 1.2034
\end{array}
\right),
\Sigma_5 = \left(
\begin{array}{cc}
0.8665& -0.1527\\
-0.1527& 0.9352
\end{array}
\right)
\]

Notice that, when generate the data:

\[\Sigma = \left(
\begin{array}{cc}
1& 0\\
0& 1
\end{array}
\right)
\]



$\pi_1  =  0.1986$, $\pi_2  =  0.2004 $, $\pi_3  =  0.1992$,  $\pi_4  =  0.2015 $,  $\pi_5  =  0.2002$

Notice that, when generate the data:  each guassian components occupy 20% of all data. (1000 data point, 200 for each guassian components)

时间: 2024-10-09 12:27:28

EM and GMM(Code)的相关文章

css里px em rem特点(转)

1.px特点: 1.IE无法调整px作为单位的字体大小: 2.Firefox能够调整px.em和rem. px是像素,是相对长度单位,是相对于显示器屏幕分辨率而言的. 2.em特点: 1.em的值并不是固定的: 2.em会继承父级元素的字体大小. em也是相对长度单位,相对于当前对象内文本的字体尺寸.如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸. 任意浏览器的默认字体高都是16px.所有未经调整的浏览器都符合:1em=16px.那么12px=0.75em,10px=0.6

自动布局之autoresizingMask使用详解(Storyboard&amp;Code)

现在已经不像以前那样只有一个尺寸,现在最少的iPhone开发需要最少需要适配三个尺寸.因此以前我们可以使用硬坐标去设定各个控件的位置,但是现在的话已经不可以了,我们需要去做适配,也许你说可以使用两套UI或两套以上的UI,但那样不高效也不符合设计.iOS有两大自动布局利器:autoresizing 和 autolayout(autolayout是IOS6以后新增).autoresizing是UIView的属性,一直存在,使用也比较简单,但是没有autolayout那样强大.如果你的界面比较简单,要

HTML5周记(一)

各位开发者朋友和技术大神大家好!博主刚开始学习html5 ,自本周开始会每周更新技术博客,与大家分享每周所学.鉴于博主水品有限,如发现有问题的地方欢迎大家指正,有更好的意见和建议可在评论下方发表,我会第一时间回复.好了,话不多说,下面开始我的分享! 第一章 HTML的初识 一.HTML的基本结构 <!DOCTYPE html><!--声明文档类型为HTML文件. 文档声明.注意:文档声明在HTML文档中必不可少!且必须放在文档第一行.--><html> <head

HTML笔记(二) HTML标签元素

一 常用的头部元素标签 <head>元素包含了所有的头部标签元素. 1.<title> <title>标签定义了HTML文档的标题,在HTML/XHTML文档中是必须的. 主要功能: 定义了浏览器工具栏的标题: 当网页添加到收藏夹时,显示在收藏夹中的标题: 显示在搜索引擎结果页面的标题: 2.<base> <base>标签描述了基本的链接地址或链接目标. 该标签作为HTML文档中所有的链接标签的默认链接,即如果HTML文档中的超链接标签没有添加链

sass学习笔记(五):sass的运算

(一).加法 加法运算是 Sass 中运算中的一种,在变量或属性中都可以做加法运算.如: .box {   width: 20px + 8in; } 编译出来的 CSS: .box {   width: 788px; } 但对于携带不同类型的单位时,在 Sass 中计算会报错,如下例所示: .box {   width: 20px + 1em; } 编译的时候,编译器会报错:"Incompatible units: 'em' and 'px'." (二).减法 Sass 的减法运算和加

JVM中class文件探索与解析(一)

一直想成为一名优秀的架构师的我,转眼已经工作快两年了,对于java内核了解甚少,闲来时间,看看JVM,吧自己的一些研究写下来供大家参考,有不对的地方请指正. 废话不多说,一起来看看JVM中类文件是如何加载和运行的. (1)首先,编写简单代码,对其编译生成的class文件进行研究,其java代码如下: 1 public class test { 2 private static int count = 0; 3 public static void recursion(){ 4 count++;

ARM编译空间属性(转)

原文地址:http://www.cnblogs.com/hongzg1982/articles/2205093.html 1. 程序的空间属性 一般情况下,一个程序本质上都是由 bss段.data段.text段三个组成的——本概念是当前的计算机程序设计中是很重要的一个基本概念.而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题. BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Blo

新浪微博SDK开发(1):总述

花了几天时间,消耗了九牛六虎之力,新浪微博大部分API已经封装,但有部分API实在太难封装. 说起这封装,我必须严重地.从人品和技术层面鄙视一下新浪的程序员,实在太菜了.估计菜鸟都被大企业吸收了,菜到连面向对象都不懂. 同样的内容,返回的JSON对象居然会出现不同结构,更可恶的,像公共API中获取城市列表,国家区域代码列表的返回结果,实在让人不得不发笑.那些JSON用JS读起来都困难,更何况要进行封装呢.根本没法封装,因此在论坛上抱怨的人不少,可是新浪官方呢,置之不管,就当没看见一样,看来,大企

微信公众平台开发(31)微信第三方登录接口

原文: http://www.cnblogs.com/imaker/p/5491433.html 第一步:获取AppID AppSecret(不做解释,自己去微信公众平台申请) 第二步:生成扫描二维码,获取code https://open.weixin.qq.com/connect/qrconnect?appid=AppID&redirect_uri=http://www.baidu.com&response_type=code&scope=snsapi_login&st