ml课程:最大熵与EM算法及应用(含代码实现)

版权声明:===========版权所有,可随意转载,欢迎互相交流=========== https://blog.csdn.net/weixin_42446330/article/details/84324851

以下是我的学习笔记,以及总结,如有错误之处请不吝赐教。

本文主要介绍最大熵模型与EM算法相关内容及相关代码案例。

关于熵之前的文章中已经学习过,具体可以查看:ml课程:决策树、随机森林、GBDT、XGBoost相关(含代码实现),补充一些

基本概念:

信息量:信息的度量,即一件事情发生的概率P(x_{i})。那么熵既可以表示为信息量的期望,也就是H(x_{i})

联合熵(joint entropy):是联合概率分布或者多个变量的熵。

条件熵(conditionam):公式如下:

变换一下:

互信息(mutual information):是衡量两个随机变量之间的相关性,常用来特征选择或者降维;他与\rho =\frac{COV(X,Y)}{\sqrt{Var(x)}\sqrt{Var(y)}}的区别是可以衡量非线性的相关性,具体公式表示:

推倒一下得到:

我们可以根据VN图来表示以上三个概念的

相对熵(relative entropy),即KL散度(kullback-leibler divergence):是衡量两个概率分布的差异。具体表示为:

性质:

  1. 是一个非对称的近似度量;
  2. 值越大分布之间的差异越大;
  3. 始终存在D(p||q)\geqslant 0

关于性质3具体证明如下:

证明:假设y_{i}=\frac{q_{i}}{p_{i}}f(y_{i})=log\frac{q_{i}}{p_{i}},同时由于log函数为凹函数,根据琴生不等式得到:E(f(x))\leqf(E(X)):

将上述几个式子代入得到:D(p||q)\geqslant 0

交叉熵(cross entropy):是衡量两个概率分布间的差异性信息,公式如下:

                                                                          CH(p,q)=-\sum p(x_{i})logq(x_{i})

变化一下得到:

                                                                          CH(p,q)=H(p)+D(p||q)

隐变量:表示不可观测变量Y={y1,y2,y3...,yn};

显变量:表示可观测变量Z={z1,z2,z3...,zn},两个变量的性质有:

  1. P(Y)=\sum_{Z}^{N}P(Z)P(Y|Z)=\sum_{Z}^{N}P(Y,Z)
  2. P(Y|Z)=\frac{P(Y,Z)}{P(Z)}=\frac{P(Y,Z)}{\sum P(Y)P(Z|Y)}

最大似然(极大似然)估计:N个误差的联合概率密度为:p(y1,y2,...,yN),由于它们相互独立,故有:

                                                                             likelihold=\prod_{j}^{N}p(y _{i})

那么条件概率的最大似然可以表示为:

                                                                                p(y|\Theta )=\prod_{j}^{N}p(y _{i}|\Theta )

这个概率反映了,在概率密度函数的参数是θ时,得到y这组样本的概率。 需要找到一个参数θ,其对应的似然函数L(θ)最大,这个叫做θ的最大似然估计量,记为:

由于似然函数连乘求导无法求解,因此对其取对数:

                                                           H(\Theta )=ln(p(y|\Theta ))=ln\prod_{j}^{N}p(y _{i}|\Theta )=\sum_{j}^{N}lnp(y _{i}|\Theta)

最后求导令其为0,得到似然方程参数。

最大熵模型(max entropy model)

在学习概率模型的时候,在所有可能的概率模型中,熵最大的模型是最好的模型;通俗说就是承认已知事物,对未知事物没有任何偏见。

目标函数

                                                       maxH(Y|X)=-\sum \sum p(x_{i},y_{i})logp(y_{i},x_{i})

然后通过最大熵求解得到p^{*}以此来分类:

                                                                           p^{*}=argmaxH(Y|X)

我们要求解以上的目标函数,需要构建一个特征函数:

同时通过概率的条件知:

                                                                             \sum p(y_{i},x_{i})=1

同时我们定义理想状态的概率为\tilde{p},那么可以得到:

总结以上得到最大熵模型:

因此我们构造拉格朗日乘子:

其中:q=p(y|x).

对其求偏导数:

令其为0,得到:

因此最终得到:

                                                                             p^{*}(y|x)=\frac{1}{z_{\lambda }(x)}e^{\sum \lambda _{i}f(x,y)}

其中:

但是上式很难求得解析解\lambda,因此我们使用近似逼近解:

IIS(improved iterative scaling)方法:该方法类似坐标上升法,是假设最大熵模型下不断迭代\lambda +\delta使得:

                                                                          L(\lambda +\delta )-L(\lambda )\geqslant 0

EM算法(Expection Maximization):

用迭代方式交替求解优化值,这个算法可以从两个方向求解,如下图:

下面我们先从右边爬山,从最大似然的方向推到EM算法

根据前面基本概念,将含有隐变量的极大似然估计的方法写为:

                                                        L(\Theta )=\prod_{j}^{N}p_{\Theta }(y _{i})=\prod_{j}^{N}\sum_{z}^{N}p_{\Theta }(y _{i}|z)p_{\Theta }(z)

对其两边取对数:

                                          l(\Theta )=lnL(\Theta )=ln\prod_{j}^{N}p_{\Theta }(y _{i})=\sum_{j}^{N}ln\sum_{z}^{N}p_{\Theta }(y _{i}|z)p_{\Theta }(z)

我们迭代进行求解,使得l(\Theta _{n+1})> l(\Theta _{n}),即:

                                      l(\Theta )-l(\Theta _{n})=\sum_{j}^{N}ln\sum_{z}^{N}p_{\Theta }(y _{i}|z)p_{\Theta }(z)-\sum_{j}^{N}ln\sum_{z}^{N}p_{\Theta n}(y _{i}|z)p_{\Theta n}(z)

即:

                                     l(\Theta )-l(\Theta _{n})=\sum_{j}^{N}[ln\sum_{z}^{N}p_{\Theta }(y _{i}|z)p_{\Theta }(z)-ln\sum_{z}^{N}p_{\Theta n}(y _{i}|z)p_{\Theta n}(z)]

分别对前后两项进行凑项和琴生不等式得到:

                                                            l(\Theta )-l(\Theta _{n})\geqslant \sum_{z}^{N}p_{\Theta n}(z|y)ln\frac{p_{\Theta }(y|z)p_{\Theta }(z)}{p_{\Theta n}(z|y)p_{\Theta n}(y)}

                                                             l(\Theta )\geqslant l(\Theta _{n})+ \sum_{z}^{N}p_{\Theta n}(z|y)ln\frac{p_{\Theta }(y|z)p_{\Theta }(z)}{p_{\Theta n}(z|y)p_{\Theta n}(y)}

Q(\Theta |\Theta _{n})等于后面的式子,则:

                                                                                l(\Theta )\geqslant Q(\Theta |\Theta _{n})

具体推推倒过程如下图:

因此我们得到EM算法流程为:

  1. 随机生成\Theta,以此来迭代\Theta _{n}\rightarrow \Theta _{n+1}
  2. E-step:令\Theta _{_{n}}为已经求得的数,根据前面得到的式子求Q(\Theta |\Theta _{n}),也就是其下边界函数,也是熵值。
  3. M-step:求导=0,最大化\Theta ^{*}
  4. 重复2,3两步,直至\Theta _{n+1}-\Theta _{n}\leqslant \varepsilon为止。

下面我们从左边上山,从K-means(参考:ml课程:聚类概述及K-means讲解(含代码实现)方向推到EM算法

K-means算法可以表示为:

  1. 随机选择k个点作为\mu_{k}^{0},即簇类的中心点;
  2. E-step:\alpha _{ik}^{1}=\sum_{k=1}^{k}\sum_{i=1}^{N}\alpha _{ik}||x_{i}-\mu_{k}^{0}||^{2},其中\alpha _{ik}=1, or ,0表示一个隐变量概率为0或者1的硬分类;
  3. M-step:对上式求导=0,最小化\alpha _{ik}^{1}
  4. 重复2,3两步,直至||\mu _{k}^{n+1}-\mu _{k}^{n}||\leq \varepsilon为止。

EM算法应用:

高斯混合模型(GMM):

核心代码:

######################################################
# E 步:计算每个模型对样本的响应度
# Y 为样本矩阵,每个样本一行,只有一个特征时为列向量
# mu 为均值多维数组,每行表示一个样本各个特征的均值
# cov 为协方差矩阵的数组,alpha 为模型响应度数组
######################################################
def getExpectation(Y, mu, cov, alpha):
    # 样本数
    N = Y.shape[0]
    # 模型数
    K = alpha.shape[0]

    # 为避免使用单个高斯模型或样本,导致返回结果的类型不一致
    # 因此要求样本数和模型个数必须大于1
    assert N > 1, "There must be more than one sample!"
    assert K > 1, "There must be more than one gaussian model!"

    # 响应度矩阵,行对应样本,列对应响应度
    gamma = np.mat(np.zeros((N, K)))

    # 计算各模型中所有样本出现的概率,行对应样本,列对应模型
    prob = np.zeros((N, K))
    for k in range(K):
        prob[:, k] = phi(Y, mu[k], cov[k])
    prob = np.mat(prob)

    # 计算每个模型对每个样本的响应度
    for k in range(K):
        gamma[:, k] = alpha[k] * prob[:, k]
    for i in range(N):
        gamma[i, :] /= np.sum(gamma[i, :])
    return gamma

######################################################
# M 步:迭代模型参数
# Y 为样本矩阵,gamma 为响应度矩阵
######################################################
def maximize(Y, gamma):
    # 样本数和特征数
    N, D = Y.shape
    # 模型数
    K = gamma.shape[1]

    #初始化参数值
    mu = np.zeros((K, D))
    cov = []
    alpha = np.zeros(K)

    # 更新每个模型的参数
    for k in range(K):
        # 第 k 个模型对所有样本的响应度之和
        Nk = np.sum(gamma[:, k])
        # 更新 mu
        # 对每个特征求均值
        for d in range(D):
            mu[k, d] = np.sum(np.multiply(gamma[:, k], Y[:, d])) / Nk
        # 更新 cov
        cov_k = np.mat(np.zeros((D, D)))
        for i in range(N):
            cov_k += gamma[i, k] * (Y[i] - mu[k]).T * (Y[i] - mu[k]) / Nk
        cov.append(cov_k)
        # 更新 alpha
        alpha[k] = Nk / N
    cov = np.array(cov)
    return mu, cov, alpha

######################################################
# 高斯混合模型 EM 算法
# 给定样本矩阵 Y,计算模型参数
# K 为模型个数
# times 为迭代次数
######################################################
def GMM_EM(Y, K, times):
    Y = scale_data(Y)  #定义scale_data()数据预处理,将其缩放至0和1之间
    mu, cov, alpha = init_params(Y.shape, K)  #定义init_params()初始化模型参数
    for i in range(times):
        gamma = getExpectation(Y, mu, cov, alpha)  
        mu, cov, alpha = maximize(Y, gamma)
    debug("{sep} Result {sep}".format(sep="-" * 20))  #定义debug()表示调试输出变量
    debug("mu:", mu, "cov:", cov, "alpha:", alpha, sep="\n")
    return mu, cov, alpha

具体实现欢迎关注:我的github


后续将继续介绍EM算法相关的应用,To be continue...

猜你喜欢

转载自blog.csdn.net/weixin_42446330/article/details/84324851
今日推荐