• EM算法


      EM算法

      看到别人的博客写得那么好,自己也不动于衷,于是,根据自己的理解也写一下。虽然写这么多字的博客很费劲,但是,这是自己重新组织和思考的一个过程,受益匪浅。大多根据自己的理解,如有错误,望批评指正,来世做牛做马。废话少说,马上进入正题。

      这里,主要根据GMM模型来说明这个算法的。

    一、为什么提出这个模型

      在高中之前,对“确定数学”非常喜欢,而对“随机数学”这种不确定的东西非常厌恶。之所以厌恶,受到应试教育的影响——答案只有一个。随机数学之随机让人心有余悸。大学以来,通信专业的噪声不绝于耳,数学建模误差无处不在,让我知道随机数学的广泛应用,深深爱之。要知道,确定信号是随机信号中非常特殊的一种,随机才是“正道”。说得有些过分,目的是强调随机数学之强大。

      既然如此,谈到随机数学,首先提到密度函数。知道密度函数就可以提高正确分类的概率。概率密度函数分为离散密度函数,连续密度函数。离散的有:0-1分布,二项分布,泊松分布,几何分布(首次成功模型),超几何分布。连续的有:均匀分布,指数分布,正态分布。这些都是普通密度函数中的特例而已。密度函数千奇百怪,除了那些之外,还有很难用简单的式子表示出来。在描述一般的密度函数时,通常采用密度函数估计。总而言之,关于密度函数的分类如下:

    (1)参数估计

    (2)半参数估计:混合模型

    (3)非参数估计:直方图估计;质朴估计;核估计;k-最近邻估计

      这里讲第(2)种情况。在自然界中,正态分布是一种很美的数学形式,之所以说美,就是它能成功地解释和验证了许多实际问题,绝非诗人笔下之美。在分类问题中,如果只用单纯的一个正态分布来描述,直观地讲,就有点可笑。为了说明问题,举个极端的例子,要把人和狗分类,人的身高近似为正态分布,狗的身高也近似为正态分布,但如果把两者合在一起而只想用简单的一个正态分布来描述,那误差将会很大。

      我们知道,正态分布(高斯分布)是钟形的,显然人和狗独自的分布可以近似为正态分布,但是,两者叠加之后不再是钟形的分布,用单纯的正态分布不能再描述,此时只能使用GMM模型(高斯混合模型),它的数学表达式是:

      这里,就是叠加,而且是权值,更像是条件概率,如狗占0.2,人占0.8。

    二、求解模型参数

      建立了混合模型,似乎一切都已经轻松愉快,只需要用下最大似然估计就可以了?好吧,思路是对的,只不过列出似然函数之后,很难求导,囧!EM算法就是解决这个尴尬的问题而准备的。这里的推导很多博客都推导过了,这里不详细地讲,只是简单列出式子:

      这里做的事是,不断地找对数似然函数的的下界并不断逼近该函数。当然,如果你能够想到一种方法求解最大值,速度比EM算法快,使用内存大小合理,那EM算法可以去死了。从(1)式子看来,偏导什么的不给力啊!我觉得叫它“迭代的偏导”比较合适,为啥?因为它总是先保持一个变量不变,控制另一个变量不变而是似然函数最大,接着交换过来,保持另一个变量不变,而调整这个变量,如此循环,如图:

      好吧,总结一下,在循环之中,可以:(1)固定θ,调整Q(z)使下界J(z,Q)上升至与L(θ)在此点θ处相等(2)固定Q(z),调整θ是下界J(z,Q)最大值。

    三、算法分析

      将上述的说法重新描述一下:(1)不等式取等号(2)求最大值。这两个步骤就分别叫做E步,M步。下面分别详细说明:

    (1)E步:

      要詹森不等式取等号,当且仅当

      又因为

      根据合比定理,c=,再代入上上式,得

    (2)求二中的(3)式最大值。

    四、算法流程

      

    五、代码构思

     (1)E步骤:实际上在代码实现,会采用不化简那步

      这里,联合概率密度,实际上,右边第一项就是权值,第二项就是第i个正态分布.

    (2)M步骤:这里求解最大值时所得到的参数值,更新参数

    直接给出解析解:(表达式字母的就先不管了,粘贴一下)

      最终,根据这次的参数和上一次的参数相差大小设置一个阀值,小于这个阀值,算法终止。

    六、代码

    %EM
    M=3;          % M个高斯分布混合
    N=600;        % 样本数
    th=0.000001;  % 收敛阈值
    K=2;          % 样本维数
    % 待生成数据的参数
    a_real =[2/3;1/6;1/6];%混合模型中基模型高斯密度函数的权重
    mu_real=[3 4 6;
             5 3 7];%均值
    cov_real(:,:,1)=[5 0;0 0.2];%协方差
    cov_real(:,:,2)=[0.1 0;0 0.1];
    cov_real(:,:,3)=[0.1 0;0 0.1];                    
    %生成符合标准的样本数据(每一列为一个样本)
    x=[ mvnrnd( mu_real(:,1) , cov_real(:,:,1) , round(N*a_real(1)) )' ,...
        mvnrnd( mu_real(:,2) , cov_real(:,:,2) , round(N*a_real(2)) )' ,...
        mvnrnd( mu_real(:,3) , cov_real(:,:,3) , round(N*a_real(3)) )' ];
    %初始化参数
    a=[1/3;1/3;1/3];
    mu=[1 2 3;2 1 4];
    cov(:,:,1)=[1 0;0 1];
    cov(:,:,2)=[1 0;0 1];
    cov(:,:,3)=[1 0;0 1];
    t=inf;
    while t>=th
        a_old  = a;
        mu_old = mu;
        cov_old= cov;     
        rznk_temp=zeros(M,N);
        for k=1:M
            for n=1:N
                %计算P(x|mu_cm,cov_cm)
                rznk_temp(k,n)=exp(-1/2*(x(:,n)-mu(:,k))'*inv(cov(:,:,k))*(x(:,n)-mu(:,k)));
            end
            rznk_temp(k,:)=rznk_temp(k,:)/sqrt(det(cov(:,:,k)));
        end
        rznk_temp=rznk_temp*(2*pi)^(-K/2);
    %E step
        %求rznk
        rznk=zeros(M,N);
        for n=1:N
            for k=1:M
                rznk(k,n)=a(k)*rznk_temp(k,n);
            end
            rznk(:,n)=rznk(:,n)/sum(rznk(:,n));
        end
    % M step
        %求Nk
        nk=zeros(1,M);
        nk=sum(rznk');
       
        % 求a
        a=nk/N;
           
        % 求MU
        for k=1:M
            mu_k_sum=0;
            for n=1:N
                mu_k_sum=mu_k_sum+rznk(k,n)*x(:,n);
            end
            mu(:,k)=mu_k_sum/nk(k);
        end
       
        % 求COV  
        for k=1:M
            cov_k_sum=0;
            for n=1:N
                cov_k_sum=cov_k_sum+rznk(k,n)*(x(:,n)-mu(:,k))*(x(:,n)-mu(:,k))';
            end
            cov(:,:,k)=cov_k_sum/nk(k);
        end
        %终止条件,让权值的增量,均值的增量,协方差的增量三者的范数最大者小于th(阀值)  
        t=max([norm(a_old(:)-a(:))/norm(a_old(:));norm(mu_old(:)-mu(:))/norm(mu_old(:));norm(cov_old(:)-cov(:))/norm(cov_old(:))]); 
    end 
    %输出结果并比较
    a_real
    a
    mu_real
    mu
    cov_real
    cov

    参考文献:

    http://blog.csdn.net/zouxy09/article/details/8537620

    http://blog.sina.com.cn/s/blog_6c7b434d01013zwe.html

    http://wenku.baidu.com/view/60c583294b73f242336c5fbc.html

    http://baike.baidu.com/link?url=7xqVVBHCNcCy8H7FYlw_cW8hZe8ZACKsnhOVGfiO_0nz3UsJc2ermFXs5adW0w-FEoMrcFcU3C4qAh9mE9U3H_

  • 相关阅读:
    自定义开关ToggleButton
    随手画圆
    Listview多条目展示
    全选和反选
    Android中购物车的全选、反选、问题和计算价格
    PullToRefreshListView上拉加载、下拉刷新 eclipse项目
    PullToRefreshListView上拉加载、下拉刷新
    有价证券secuerity英语
    证券secuerity经济术语
    英语secuerity证券
  • 原文地址:https://www.cnblogs.com/Wanggcong/p/4665237.html
Copyright © 2020-2023  润新知