zoukankan      html  css  js  c++  java
  • EM-高斯混合模型

    EM-高斯混合模型

    认识

    前面为了直观认识 EM 算法, 用的"扔硬币"的案例, 是为了简化和直观, 而稍微偏应用和深入一点是高斯模型分类,这样一个话题.

    就好比我们现在有一堆的数据点, 已经知道是来自于不同的 k 个类别, 每个类别又服从各自的高斯分布, 即k个不同的 ((mu, sigma))

    需求: 求解出这 k 个高斯模型的参数

    但现实是, 对于某一个点, 我们并不知道是来自于哪个类别, 因此只能认为任何一个点是这 k 个类别(模型) 的混合(Mixture) 结果.

    对某一个点 xi, 它可能有 0.3的概率来自A类, 0.2概率来自B类, 0.1概率来自C类.... 这也是一个概率分布

    Mixture of Gaussian 定义

    给定一个有 n 个训练数据的集合, (D={ x_1, x_2, x_3, ..x_n}) 使用联合概率分布来建模:

    (p(x_i, z_i) = p(z_i)p(x_i|z_i)), 其中, 假设有 k 个类别分布.

    • (z_i ightarrow 多元正态分布(phi)) 其中 (phi) 是一个向量

    • (phi _j = p(z_i =j) 且 p(z_i | x_i = j) ightarrow N(mu_j, Sigma_j))

    • (sum limits_{j=1}^k phi_j = 1)

    即在一共有 k 个高斯模型下, (phi_j) 为混合模型中的第 j 个高斯模型占的权重. 设 k 为 (z_i) 的可能取值上限即每个xi 的产生:

    • 随机从 {1,2,3,....k} 中选择一个 (z_i)

    • 然后从 (z_i) 对应的高斯分布中产生 (x_i)

    • (z_i) 为不能直接观测到的 隐含变量, (phi, mu, Sigma) 为需要预测的参数

    E步: 让 (mu, Sigma) 不变, 更新 (phi)

    M步: 让 (phi) 不变, 更新 (mu, Sigma)

    对应的对数似然函数如下:

    (l(phi, mu, Sigma) = sum limits _{i=1}^n p(x_i; phi, mu, Sigma))

    (= sum limits _{i=1}^n log sum limits _{z_i=1}^k p(x_i | z_i; mu, Sigma) p(z_i; phi))

    这是个全概率分布: (phi ightarrow z_i ightarrow x_i)

    给定 (phi) 下, (z_i) 的分布; 给定 (z_i) 下, (x_i)的分布

    参数估计

    核心还是似然函数和贝叶斯公式

    **E 步: ** 为第 i 个数据, 其所属 k 个类别中的 第 j 个类别的概率分布 (有点绕哈):

    (w_j^{(i)} = Q_i(z_i = j) = P(z_i = j | x_i; phi, Sigma, mu))

    即给定 (phi, mu, Sigma, x_i) 的条件下, (P(z_i = j)) 的概率有多大

    M 步: 最大化似然函数:

    (sum limits _{i=1}^n sum limits_{z_i =1}^k Q_i(z_i) log frac {p(x_i, z_i; phi, mu, Sigma)}{Q_i(z_i)})

    即已知 (x_i, z_i) 的条件下, 去更新 (mu, Sigma)

    (=sum limits _{i=1}^n sum limits_{j =1}^k Q_i(z_i =j) log frac {p(x_i | z_i=j; mu, Sigma)p(z_i =j; phi)}{Q_i(z_i=j)})

    (=sum limits _{i=1}^n sum limits_{j =1}^k w_j^{(i)} log frac {frac {1}{(2 pi)^{0.5n}|Sigma|^{0.5}}exp(-0.5(x_i - mu_j)^T Sigma_j^{-1}(x_i -mu_j))* phi_j}{w_j^{(i)}})

    (w_j^{(i)}) 是非常容易算的, 就是之前的扔硬币嘛

    但更新 (Sigma_j, mu_j) 就麻烦了

    只能分别对 (Sigma, mu) 来求偏导了呀, 于是, 对期望 (mu_l) 求偏导( (mu_l) 表示 (j = l) 的时候哦:

    ( abla_{mu_l}=sum limits _{i=1}^n sum limits_{ j=1}^k w_j^{(i)} log frac {frac {1}{(2 pi)^{0.5n}|Sigma|^{0.5}}exp(-0.5(x_i - mu_j)^T Sigma_j^{-1}(x_i -mu_j))* phi_j}{w_j^{(i)}})

    化繁为简单, 利用 log 性质

    上式相当于 (log(frac {abc}{d}) = loga + logb +logc - logd)

    即原式对 (mu_j) 求导, 只跟中间的那项有关, 跟 exp 前面的高斯项, 还是 (phi_j) 没有任何关系滴

    ( abla_{mu_l}=sum limits _{i=1}^n sum limits_{z_i =1}^k w_j^{(i)} log-0.5(x_i - mu_j)^T Sigma_j^{-1}(x_i -mu_j))

    只是对 (mu_l) 求导, 只有当 j = l 的时候呢, 才会考虑 这 (sum)求和, 即求和是没有真正起作用的, 可以直接去掉

    (=sum limits _{i=1}^n w_j^{(i)} abla_{mu_l} log-0.5(x_i - mu_j)^T Sigma_j^{-1}(x_i -mu_j))

    $=0.5 sum limits {i=1}^n w_l^{(i)} abla{mu_l}2mu_l^T Sigma_l ^{-1}x_i - mu_l^T Sigma_l^{-1}mu_l $

    (=sum limits _{i=1}^n w_l^{(i)} ( Sigma_l ^{-1}x_i -Sigma_l^{-1}mu_l))

    令其等于 0 即:

    (mu_l = frac {sum limits _{i=1}^n w_l^{(i)} x_i}{sum limits _{i=1}^n w_l^{(i)} })

    同理 再对 (Sigma) 偏导, 令其为零, 跟上面是一样的.

    (Sigma_j = frac {sum limits _{i=1}^n w_j^{(i)} (x_i -mu_j)(x_i-mu_j)^T}{sum limits _{i=1}^n w_j^{(i)}})

    同理(phi_j) 求偏导, 只保留包含 (phi_j) 的项, 即:

    (sum limits _{i=1}^n sum limits_{j =1}^k w_j^{(i)} log(phi_j))

    回顾上文, (phi_j = p(z_i = j; phi)) 是一个概率分布, (sum_{j=1}^k phi_j = 1) 即是一个求条件极值的经典问题, 那很自然要引入到拉格朗日函数啦.

    (l(phi) = sum limits _{i=1}^n sum limits_{j =1}^k w_j^{(i)} log(phi_j)- eta (sum limits _{j=1}^k phi_j -1))

    (phi_j) 求偏导, 令值为0:

    同样对于 j = 1,2..k 来说, 其实 求和只是对满足条件的一项, 并未对其他产生作用

    ( abla_{phi_j} l(phi) = sum limits_{i=1}^n frac {w_j^{(i)}}{phi_j} + eta) = 0

    这里的 求和 是对 i 哦, 跟 j 是没有关系滴

    (phi_j = frac {sum limits _{i=1}^n w_j^{(i)}}{-eta})

    又因为 所有的 (phi) 的和是 1,可得到:

    (sum limits _{j=1}^k frac {sum limits _{i=1}^n w_j^{(i)}}{-eta} = 1)

    (eta) 是常数, 可以提出来

    (frac {1}{-eta} sum limits _{j=1}^k sum limits _{i=1}^n w_j^{(i)} = 1)

    又因为 (w_j^{(i)} = Q_i(z_i = j)) 因此得到:

    (frac {1}{-eta} sum limits _{i=1}^n 1 = 1)

    则: (-eta = n) 这样一来, 最终化简得出:

    (phi_j = frac {1}{n} sum limits_{i=1}^n w_j^{(i)})

    小结

    重复执行 E, M 步骤, 直到收敛...

    while True:

    E-步: (即给定 (phi, mu, Sigma, x_i) 的条件下, (P(z_i = j)) 的概率有多大)

    (w_j^{(i)} = Q_i(z_i = j) = P(z_i = j | x_i; phi, Sigma, mu))

    M-步: (更新参数 (Sigma, mu))

    (mu_l = frac {sum limits _{i=1}^n w_l^{(i)} x_i}{sum limits _{i=1}^n w_l^{(i)} })

    (Sigma_j = frac {sum limits _{i=1}^n w_j^{(i)} (x_i -mu_j)(x_i-mu_j)^T}{sum limits _{i=1}^n w_j^{(i)}})

    (phi_j = frac {1}{n} sum limits_{i=1}^n w_j^{(i)})

    ​ IF 收敛:

    ​ break

    总体上, 还是有点难度的感觉, 就是 大小类的层级关系 加上 条件概率, 真的是挺容易晕的, 也不太确定, 是否一定正确, 还是过后再来仔细检查一波.

  • 相关阅读:
    列出 visual studio 的所有快捷键
    CVS命令深入研究 zz
    大话系统之权限控制 (转)
    策略模式
    使用ISAPI_Rewrite对asp.net实现URL重写,显示HTML后缀
    使用ICSharpCode.SharpZipLib.dll实现在线解压缩
    ISAPI_REWRITE(转)
    ISAPI_Rewrite集
    做快乐的程序员(转)
    Request.PathInfo,Request.Path,RequestRawUrl
  • 原文地址:https://www.cnblogs.com/chenjieyouge/p/12075617.html
Copyright © 2011-2022 走看看