zoukankan      html  css  js  c++  java
  • 高斯(正态)分布、GDA、Mixtures of Gaussian

    (原创文章,转载请注明出处!)

    高斯分布的密度函数

    一元高斯分布:

    p(x;μ,σ2)=(1/{sqrt(2π)*σ}) * exp{-(x-μ)2/(2σ2)}

    期望:E(X) = μ;方差:D(X) = σ2

    二元高斯分布:

    p(x1,x2121222)={ 1 / [2π*σ1σ2*sqrt(1-ρ2)] }   *   exp{    [(-1)/(2*(1-ρ2))]  *   [ (x-μ1)212 - 2ρ(x-μ1)(x-μ2)/(σ1σ2) + (x-μ2)222]   }

    ρ为x1,x2的相关系数: ρ = E[X1-E(X1)] * E[X2-E(X2)]   /  (σ1σ2)

    x1,x2的协方差:Cov(X1,X2) = ρσ1σ2

    对二元高斯分布来说,两个维度的随机变量不相关与独立等价。

    多元高斯分布:(n维正态随机分布分每一个分量都是正态随机变量)

    f(x1,x2,...,xn) = 1 / ( (2π)n/2|C|1/2 ) *  exp{ (-1/2) * (X-μ)TC-1(X-μ)}

    X = (x1  x2 ... xn)T,   μ = (μ1  μ2 ... μn )T

    C是协方差矩阵,C-1是C的逆矩阵

    GDA (Gaussian Discriminant analysis),高斯判别分析

    GDA模型的基本思想是分别用两个多元高斯分布(对二分类问题)来描述两个不同的类别的概率分布,即:在已知类别的情况下,来寻找样本的多元高斯分布。(GDA模型假设两个类别的样本服从多元高斯分布, 如果样本数据确实服从高斯分布,则能取得较好的分类效果。)

    得到两个类别的概率分布后,对新的样本,分别计算在两个概率分布下的概率,概率大的分布所对应的类别即为新样本的类别。

    类别y的概率用0-1分布描述:p(y) = py(1-p)1-y

    类别0的概率分布,p(x|y=0) = 1 / ( (2π)n/2|C|1/2 ) *  exp{ (-1/2) * (X-μ0)TC-1(X-μ0)},  n为样本特征的个数

    类别1的概率分布,p(x|y=1) = 1 / ( (2π)n/2|C|1/2 ) *  exp{ (-1/2) * (X-μ1)TC-1(X-μ1)}

    对一个新样本x’,分别计算:p(y=0|x') = p(x'|y=0) * (1-p(y=1))

                                         p(y=1|x') = p(x'|y=1) * p(y=1)

                           然后比较这两个概率值大小,来判别新样本x’所属类别。

    注:在模型中,两类不同样本的期望不同,但协方差矩阵一样,即:两类的中心点不一样,但围绕中心点,样本的分散度一样;输入X的值是连续型。

    通过极大似然估计,求得模型中的参数:

    p = (1/m) * num_of_sample(y=1)

    μ0 = sum(x_of_sample(y=0)) / num_of_sample(y=0)

    μ1 = sum(x_of_sample(y=1)) / num_of_sample(y=1)

    C = (1/m) * ∑i=1m(xiy(i))(xiy(i))T

    (算法的实现与应用高斯分布来解决异常检测问题(二)多元高斯分布模型的实现基本一样,只是对两个不同类别的均值要分别计算。)

    Mixtures of Gaussian,混合高斯模型

    对无label的样本数据,有p(xi, zi) = p(xi|zi)p(zi), xi与zi的联合分布,xi是样本集中的第i个样本,zi观测不到,

    但混合高斯模型认为xi的值与某个观测不到的东西,zi,有关。

    假设p(zi)服从多项分布, p(xi|zi)服从多元高斯分布。zi的取值有k个{1,2,...,k}, p(zi=j) = Φj, ∑j=1kΦj = 1。

    (即:认为样本中有k类数据,目的就是通过训练找出描述这k类数据的k个高斯分布函数,由于数据没有label,所以每个样本可能由k个高斯分布函数任一个生成。

    相当于把样本聚成k个类,每个类不是由聚类中心确定,而是由一个高斯分布描述。)

    zi的每一个取值代表了一个不同的多元高斯分布,所以在高斯混合模型中有k个不同的多元高斯分布,p(xi|zi=j)表示样本xi来自第j个多元高斯分布。

    由于zi观测不到, 所以p(zi=j) = Φj是未知的。在这种情况下,使用极大似然估计就无法计算出模型中的参数。可以使用EM算法进行训练,计算出参数。

    EM算法, Expectation Maximization :

    EM算法的基本思路与k-均值算法类似,

    (1)首先对未知的p(zi=j) = Φj进行初始化

    (2)用其计算出模型中的参数;

    (3)用计算得到的参数再调整p(zi=j) = Φj

    (4)重复(2)、(3)直到收敛。

    (使用EM算法来训练含有隐含变量的模型p(x,z)时保证是收敛的,但与k-means类似,可能收敛到局部最优解,所以需要多尝试不同的初始化值来训练)

    模型中的参数:模型训练的目的是要得到k个多元高斯分布,用这k个多元高斯分布来描述样本数据,所以模型的参数就是这个k个多元高斯分布的μ和C,即:(μ1,C1), (μ2,C2),...,(μj,Cj),...,(μk,Ck)

                       k个多元高斯分布是p(xi|zi),是条件分布,混合高斯模型需要(xi, zi),即xi, z的联合分布,所以模型的参数还包括k个Φ,p(zi=j) = Φj,即:Φ12,...,Φj,...,Φk

    计算过程如下:

    ----初始化: 对每个样本初始化其p(zi|xi),由于不确定xi是由哪一个高斯分布生成的,所以,zi可能取k个值,记:wji = p(zi=j|xi;Φ,μ,C)

        x1 x2 ... xi ... xm
    z=1 Φ1 w11 w12 ... w1i ... w1m
    z=2 Φ2 w21 w22 ... w2i ... w2m
    ... ... ... ... ... ... ... ...
    z=j Φj wj1 wj2 ... wji ... wjm
    ... ... ... ... ... ... ... ...
    z=k Φk wk1 wk2 ... wki ... wkm

                     需要随机的初始化 m*k 个 wji ,保证∑j=1k(wji)=1 。     

    ----do

    --------对每一个j,通过如下公式计算参数,以下公式是在假设wji已知的情况下,由极大似然法计算出来:

                    Φj= (1/m)∑i=1m(wji)     //上面表格中的一行求平均,即每个样本由第j个多元高斯分布生成的概率求平均,来作为p(zi=j)的估计

                    μj = ∑i=1m(wjixi)  /  ∑i=1m(wji)  //wji为第i个样本由第j个多元高斯分布生成的概率

                                                                //公式在形式可理解为样本均值作为期望的估计

                                                                //对第j个分布,每个样本xi由其生成的概率是wji,∑i=1m(wjixi)就可以看做第j个分布的样本值之和

                                                                //然后除以总份数 ∑i=1m(wji),即为第j个分布的样本平均值

                    Cj = ∑i=1m[wji(xij)(xij)T] / ∑i=1m(wji)   //对此公式的理解与计算μj的公式类似

                                                                               //分子可以看做第j个高斯分布的样本的协方差矩阵之和,

                                                                              //然后除以份数后,以作为第j个高斯分布的协方差矩阵的估计

    --------对j的循环结束

    --------判断是否收敛,如果收敛,就跳出循环,结束训练

    --------使用如下公式,更新每个wji, 共有m*k个:

                   wji = p(zi=j | xi;Φ,μ,C) = p(xi|zi=j;μ,C)p(zi=j;Φ)  /  ∑l=1k[p(xi|zi=l;μ,C)p(zi=l;Φ)]   

                           //Bayes公式,计算后验概率

                          //p(xi|zi=j;μ,C)是一个高斯多元分布,期望μ与协方差矩阵C已经由上面公式计算得到

                          //p(zi=j;Φ) = Φj , 已经由上面的公式计算得到

    ----while(true)

     对是否已经收敛的判断:检查当前训练得到的k个高斯分布的参数(μ,C)与前一次训练的是否一样,如果一样表示已经收敛(类似于聚类中心不再移动)

    本文章更关注算法的实现,关于混合高斯模型和EM算法更详细的描述,可以参考如下链接:

    http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006924.html

    http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006936.html

    关于GDA算法的描述,可以参考如下链接:

    http://www.cnblogs.com/dyllove98/archive/2013/07/10/3181896.html

  • 相关阅读:
    GIT非常见命令使用笔记
    视频封转类
    IOS ASIFormDataRequest使用简介(2/25)
    开发中常用的宏
    数据库使用fmdb
    毕业五年决定你的命运-----值得所有不甘平庸的人看看
    关于路径的使用,assi下载和
    关于图片处理的方法整理
    iOS开发之Objective-C与JavaScript的交互(转载)
    IOS UIWebView引用外部CSS样式(转载)
  • 原文地址:https://www.cnblogs.com/activeshj/p/3939404.html
Copyright © 2011-2022 走看看