zoukankan      html  css  js  c++  java
  • GMM

    原文:http://blog.pluskid.org/?p=39

    每个 GMM 由 K 个 Gaussian 分布组成,每个 Gaussian 称为一个“Component”,这些 Component 线性加成在一起就组成了 GMM 的概率密度函数:

    displaystyle
egin{aligned}
p(x) & = sum_{k=1}^K p(k)p(x|k) \
     & = sum_{k=1}^K pi_k mathcal{N}(x|mu_k, Sigma_k)
end{aligned}

    根据上面的式子,如果我们要从 GMM 的分布中随机地取一个点的话,实际上可以分为两步:首先随机地在这 K 个 Component 之中选一个,每个 Component 被选中的概率实际上就是它的系数 pi_k ,选中了 Component 之后,再单独地考虑从这个 Component 的分布中选取一个点就可以了──这里已经回到了普通的 Gaussian 分布,转化为了已知的问题。

    那么如何用 GMM 来做 clustering 呢?其实很简单,现在我们有了数据,假定它们是由 GMM 生成出来的,那么我们只要根据数据推出 GMM 的概率分布来就可以了,然后 GMM 的 K 个 Component 实际上就对应了 K 个 cluster 了。根据数据来推算概率密度通常被称作 density estimation ,特别地,当我们在已知(或假定)了概率密度函数的形式,而要估计其中的参数的过程被称作“参数估计”。

    现在假设我们有 N 个数据点,并假设它们服从某个分布(记作 p(x) ),现在要确定里面的一些参数的值,例如,在 GMM 中,我们就需要确定 pi_kmu_kSigma_k 这些参数。 我们的想法是,找到这样一组参数,它所确定的概率分布生成这些给定的数据点的概率最大,而这个概率实际上就等于 prod_{i=1}^N p(x_i) ,我们把这个乘积称作似然函数 (Likelihood Function)。通常单个点的概率都很小,许多很小的数字相乘起来在计算机里很容易造成浮点数下溢,因此我们通常会对其取对数,把乘积变成加和 sum_{i=1}^N log p(x_i),得到 log-likelihood function 。接下来我们只要将这个函数最大化(通常的做法是求导并令导数等于零,然后解方程),亦即找到这样一组参数值,它让似然函数取得最大值,我们就认为这是最合适的参数,这样就完成了参数估计的过程。

    下面让我们来看一看 GMM 的 log-likelihood function :

    displaystyle
sum_{i=1}^N log left{sum_{k=1}^K pi_k mathcal{N}(x_i|mu_k, Sigma_k)
ight}

    由于在对数函数里面又有加和,我们没法直接用求导解方程的办法直接求得最大值。为了解决这个问题,我们采取之前从 GMM 中随机选点的办法:分成两步,实际上也就类似于 K-means 的两步。

    1. 估计数据由每个 Component 生成的概率(并不是每个 Component 被选中的概率):对于每个数据 x_i 来说,它由第 k 个 Component 生成的概率为displaystyle
gamma(i, k) = frac{pi_k mathcal{N}(x_i|mu_k, Sigma_k)}{sum_{j=1}^K pi_jmathcal{N}(x_i|mu_j, Sigma_j)}

      由于式子里的 mu_kSigma_k 也是需要我们估计的值,我们采用迭代法,在计算 gamma(i, k) 的时候我们假定 mu_kSigma_k 均已知,我们将取上一次迭代所得的值(或者初始值)。

    2. 估计每个 Component 的参数:现在我们假设上一步中得到的 gamma(i, k) 就是正确的“数据 x_i 由 Component k 生成的概率”,亦可以当做该 Component 在生成这个数据上所做的贡献,或者说,我们可以看作 x_i 这个值其中有 gamma(i, k)x_i 这部分是由 Component k 所生成的。集中考虑所有的数据点,现在实际上可以看作 Component 生成了 gamma(1, k)x_1, ldots, gamma(N, k)x_N 这些点。由于每个 Component 都是一个标准的 Gaussian 分布,可以很容易分布求出最大似然所对应的参数值:displaystyle
egin{aligned}
mu_k & = frac{1}{N_k}sum_{i=1}^Ngamma(i, k)x_i \
Sigma_k & = frac{1}{N_k}sum_{i=1}^Ngamma(i,
k)(x_i-mu_k)(x_i-mu_k)^T
end{aligned}

      其中 N_k = sum_{i=1}^N gamma(i, k) ,并且 pi_k 也顺理成章地可以估计为 N_k/N

    3. 重复迭代前面两步,直到似然函数的值收敛为止。
  • 相关阅读:
    laravel 安装完成后安装 vendor 目录
    requires php ~7.1 -> your PHP version (7.0.18) does not satisfy that requirement
    查看laravel版本
    git update-index --assume-unchanged
    Git 取消跟踪已版本控制的文件(亲测可行)
    git把某个文件去除版本控制
    git如何移除某文件夹的版本控制
    git如何移除某文件的版本控制
    git 教程
    Git branch && Git checkout常见用法
  • 原文地址:https://www.cnblogs.com/amelie-tingting/p/6836541.html
Copyright © 2011-2022 走看看