• 机器学习原理与算法(五) 生成学习算法


    版权声明:本系列文章为博主原创文章,转载请注明出处!谢谢!


     本章索引:

    前4章,我们依次讨论了回归问题与各种回归方法,分类问题与各种分类方法,以及一种通用的建模方式,按照它提供的假设和流程,可以很方便的自动生成广义线性模型模型,以解决实际的回归问题和分类问题。之前介绍过的方法都属于判别学习算法,最重要的特点是,它们都对$(y|x)$直接建模。我们将在本章介绍一种新的学习方法,它不是针对$y|x$建模,而是针对$(x|y)$建模,而后利用贝叶斯公式进行极大似然估计。这种方法在某些应用领域非常有效(例如朴素贝叶斯算法用在文本分类)。

    1. 生成学习算法

    2. 高斯判别式分析

    3. 朴素贝叶斯


    1. 生成学习算法

    我们用一个例子引出生成学习算法,比如,我们现在需要一个能区分大象和狗的算法。本章之前的方法都是根据训练集合提供的特征和对应标签,建立分类标准。等新的动物来分类的时候,按照新来动物的特征计算它的标签,从而决定应该分在哪边。除此以外,我们还有另一种方法:遍历训练集合中所有大象的特征,根据大象的特征建立一个模型;遍历训练集合中所有狗的特征,根据狗的特征建立另一个模型。当有一个新的动物来需要分类的时候,把它特征与上述两个模型对比,与哪个更相似,就属于哪一类。

    让我们更正式的来描述一下判别学习法和生成学习发的区别。如果一个算法的目的是学习$p(y|x)$,或者学习从输入空间X到标签${0,1}$的映射$h_ heta(x)$,那么它就属于判别学习算法。相反地,如果一个算法的目的是学习$p(x|y)$,或者出于技术上的考虑去对$p(y)$进行建模,那么它就是生成学习算法。之后再应用贝叶斯模型计算后验概率:

    egin{equation*}
    p(y|x)=frac{p(x|y)p(y)}{p(x)}
    end{equation*}

    其中,分母的$p(x)$可以由$p(x) = p(x|y=1)p(y=1) + p(x|y=0)p(y=0)$计算出。甚至如果是为了求$p(y|x)$的最大似然估计的话,可以忽略分母。

    egin{eqnarray*}
    mathop{arg max p(y|x)}limits_y & = & mathop{arg max frac{p(x|y)p(y)}{p(x)}}limits_y \
    & = & mathop{arg max p(x|y)p(y)}limits_y
    end{eqnarray*}

    2. 高斯判别式分析

    我们要介绍的第一个生成学习算法是高斯判别式分析(Gaussian Discriminant Analysis, GDA)。在这个模型里面,我们假设$p(x|y)$服从多维正态分布。首先来看下多维正态分布。

    多维正态分布:

    多维正态分布的参数是:均值向量$mu in mathbb{R}^n$和协方差矩阵$Sigma in mathbb{R}^{n imes n}$,其中$Sigma geq 0$是对称的半正定矩阵。多维正态分布也写做$mathcal{N}(mu, Sigma)$。 它的概率密度函数如下:

    egin{equation*}
    p(x;mu,Sigma)= frac{1}{(2pi)^{n/2} |Sigma|^{1/2}} exp(-frac{1}{2}(x-mu)^T Sigma^{-1}(x-mu))
    end{equation*}

    期望值如下:

    egin{equation*}
    E[X]= int_x xp(x; mu, Sigma)dx=mu
    end{equation*}

    协方差矩阵如下:

    egin{equation*}
    Sigma=egin{bmatrix}1&0 \ 0&1 end{bmatrix}; Sigma=egin{bmatrix}1&0.5 \ 0.5&1 end{bmatrix} Sigma=egin{bmatrix}1&0.8 \ 0.8&1 end{bmatrix}
    end{equation*}

    假设一个二分类问题,输入特征$x$是连续的,我们就可以用高斯判别分析法建模,即用多维正态分布对$p(x|y)$建模:

    egin{equation*}
    y sim Bernoulli(phi)
    end{equation*}

    egin{equation*}
    x|y=0 ~ N(mu_0,Sigma)
    end{equation*}

    egin{equation*}
    x|y=1 ~ N(mu_1,Sigma)
    end{equation*}

    概率密度函数如下:

    egin{equation*}
    p(y)=phi_y(1-phi)^{1-y}
    end{equation*}

    egin{equation*}
    p(x|y=0) = frac{1}{(2pi)^{n/2}|Sigma|^{1/2} exp(-frac{1}{2}(x-mu_0)^TSigma^{-1}(x-mu_0))}
    end{equation*}

    egin{equation*}
    p(x|y=1) = frac{1}{(2pi)^{n/2}|Sigma|^{1/2} exp(-frac{1}{2}(x-mu_1)^TSigma^{-1}(x-mu_1)) }
    end{equation*}

    这个模型的参数包括:。

    对数似然如下:

    egin{eqnarray*}
    l(phi, mu_0, mu_1, Sigma) &=& log prod_{i=1}^m p(x^{(i)}, y^{(i)}; phi, mu_0, mu_1, Sigma) \
    &=& log prod_{i=1}^m p(x^{(i)}|y^{(i)}; mu_0, mu_1, Sigma)p(y^{(i)}; phi)
    end{eqnarray*}

    为了最大化对数似然,得到参数的最大似然估计:

    egin{equation*}
    phi = frac{1}{m}sum_{i=1}^m 1{y^{(i)}=1}
    end{equation*}

    egin{equation*}
    mu_0=frac{sum_{i=1}^m 1 {y^{(i)}=0}x^{(i)} }{sum_{i=1}^m 1 {y^{(i)} =0 }}
    end{equation*}

    egin{equation*}
    mu_1 = frac{sum_{i=1}^m 1 {y^{(i)}=1}x^{(i)}}{sum_{i=1}^m 1 {y^{(i)}=1} }
    end{equation*}

    egin{equation*}
    Sigma = frac{1}{m} sum_{i=1}^m (x^{(i)} - mu_{y^{(i)}}) (x^{(i)} - mu_{y^{(i)}})^T
    end{equation*}

    总结下高斯判别式分析和Logistic回归的对比:

    如果你知道数据大概服从高斯分布,那么高斯判别式分析将优于logistic回归,因为算法应用了这个信息;相反,如果你不确定$x|y$的情况, 那么logisitc判别式将更好。 举个例子,如果你假设数据服从高斯,但它实际上服从泊松,那么logistic回归仍然有不错的性能,因为如果数据服从泊松,$p(y=1|x)$仍是一个logistic函数。 

    通过对数据做更强的假设,高斯判别式为了拟合一个还不错的模型,通常需要更少的数据。Logistic回归的假设更少,对模型的假设方面的错误更加健壮,但通常需要更多的样本。

    生成学习算法的真正好处通常在于,它需要更少的数据,数据通常不是精确服从高斯分布的,只是近似;这时候生成学习就不错。

    此外,一定注意,高斯判别式法属于生成学习算法,而不是判别学习算法。(话说,有些算法的名字真的很容易误导人,比如:Logistic回归不是解决回归问题的算法,而是解决分类问题的算法;高斯判别式分析不是判别算法,而是生成算法...)

    3. 朴素贝叶斯

    下面介绍第2种生成学习算法:朴素贝叶斯。朴素贝叶斯算法通常用于文本分类的场景。文本分类系统的一个例子就是垃圾邮件分类器。它根据邮件中的文本来自动判断该邮件是否是垃圾邮件。为了得到这个分类器,假设我们已经有了一个训练集合,它包含了一大坨邮件已经每封邮件是否是垃圾邮件的标签信息。

    首先明确这个分类器如何表示特征。为了根据邮件内容决定是否垃圾邮件,建立一个字典,它包含了很多个可能出现在邮件中的单词。这个字典规模可能是几百到几万,比如50 000。然后,我们用一个特征向量$x$来表示一封邮件,这个特征向量的$x$的长度等于字典中词语的个数。如果这封邮件包含了字典中的第$i$个单词,那么特征变量中的第$i$个元素的值为1,否则值为0。如下图:

    egin{equation*}
    x = egin{bmatrix} 1 \ 0 \ 0 \ vdots \ 1 \ vdots \ 0 end{bmatrix} egin{bmatrix} a \ aardvark \ aardwolf \ vdots \ buy \ vdots \ zygmurgy end{bmatrix}
    end{equation*}

    这个特征向量的含义是:邮件中出现了字符串"a"和"buy",没有出现字符串"aardvark","aardwolf"和"zygmurgy"。在这种表示下,如果我们用判别式方法中的多项式模型建模,至少需要2^50 000-1个参数,是非常困难的。这种将电子邮件表示成特征向量的方法叫“多元伯努利事件模型”,因为这个向量中包含了很多个伯努利随机变量。本章最后部分会讨论另一种方法:“多项式事件模型”。

    在朴素贝叶斯算法中,我们会对$p(x|y)$做一个很强的假设:给定$y$,$x_i$之间条件独立。注意,条件独立不等同于完全独立。例如,如果我们用$y=1$表示这是一封垃圾邮件,字典的第3000个单词是"price",第5000个单词是"buy",条件的独立的意思,如果我知道了这是一封垃圾邮件(即已经给定$y=1$为条件下),第3000个单词"price"是否出现对第5000个单词"buy"是否出现没有影响,即条件概率$p(x_3000|y) = p(x_3000|y, x_5000)$成立,不带条件的概率$p(x_3000)$和p(x_3000|5000)$并不一定相等。这个假设称为朴素贝叶斯假设,在这个假设下的算法则称为朴素贝叶斯算法。通常情况下,这个假设在实际中是不成立的,但从结果来看这并不影响朴素贝叶斯是一个好的文本分类方法。

    在条件独立的假设下,以下等式成立:

    egin{eqnarray*}
    p(x_1,cdots ,x_50000|y) & = & p(x_1|y) p(x_2|y,x_1) p(x_3|y,x_1,x_2)cdots p(x_50000|y,x_1,cdots , x_49999) \
    & = & p(x_1|y) p(x_2|y) p(x_3|y)cdots p(x_50000|y) \
    & = & prod_{i=1}^n p(x_i|y)
    end{eqnarray*}

    模型的参数应该是这样的:egin{equation*} phi_{i|y=1} = p(x_i=1|y=1), phi_{i|y=0} = p(x_i=1|y=0), phi_y = p(y=1) end{equation*}

    根据模型我们写出似然:

    egin{equation*}
    L(phi_y, phi_{i|y=0}, phi_{i|y=1}) = prod_{i=1}^m p(x^{(i)},y^{(i)})
    end{equation*}

    以及最大似然估计的拟合结果:

    egin{equation*}
    phi_{j|y=1}= frac{sum_{i=1}^m 1 {x_j^{(i)}=1land y^{(i)}=1}} {sum_{i=1}^m 1 {y^{(i)}=1}}
    end{equation*}

    egin{equation*}
    phi_{j|y=0}= frac{sum_{i=1}^m 1 {x_j^{(i)}=1land y^{(i)}=0}} {sum_{i=1}^m 1 {y^{(i)}=0}}
    end{equation*}

    egin{equation*}
    phi_y=frac{sum_{i=1}^m 1 {y^{(i)}=1} } {m}
    end{equation*}

    上面符号$land$的含义是“与”。这些参数估计的含义也很明显,例如$phi_{j|y=1}$是指在训练集合的所有垃圾邮件中,包含词语$j$的邮件的比例。

    得到这些参数的估计值后,可以根据贝叶斯公式,在有新的样本需要分类时,用下式计算$p(y|x)$:

    egin{eqnarray*}
    p(y=1|x) & = & frac{p(x|y=1)p(y=1)}{p(x)} \
    & = & frac{(prod_{i=1}^m p(x_i|y=1))p(y=1)} {(prod_{i=1}^m p(x_i|y=1))p(y=1)+(prod_{i=1}^n p(x_i|y=0))p(y=0)}
    end{eqnarray*}



    拉普拉斯平滑

    朴素贝叶斯已经不错了,但是它有时会有点小问题。如果我们用拉普拉斯平滑改变一下,它可以变得更好。

    假设,字典中第30000个单词是"aabbcc",且在之前的训练集合中,无论垃圾邮件还是非垃圾邮件,这个词都没有出现过,那么根据我们之前的结论,有: 

    egin{equation*}
    phi_{35000|y=1} = frac{sum_{i=1}^m 1 {x_35000^{(i)} =1 land y^{(i)}=1}} {sum_{i=1}^m 1 {y^{(i)} =1}} =0
    end{equation*}

    egin{equation*}
    phi_{35000|y=0} = frac{sum_{i=1}^m 1 {x_35000^{(i)} =1 land y^{(i)}=0}} {sum_{i=1}^m 1 {y^{(i)} =0}} =0
    end{equation*}

    用上述结果来计算后验概率的话,有:

    egin{eqnarray*}
    p(y=1|x) & = & frac{(prod_{i=1}^m p(x_i|y=1))p(y=1)} {prod_{i=1}^m p(x_i|y=1)p(y=1)+prod_{i=1}^n p(x_i|y=0)p(y=0)} \
    & = & frac{0}{0}
    end{eqnarray*}

    这是因为公式中,每一项$prod_{i=1}^n p(x_i|y)$都包含了一项$p(x_35000|y) = 0$来相乘。如此,得到的$0/0$的结果是没有意义的。

    正如我们之前看到的,当我们用最大似然估计的时候,如果有某些$phi_j$的结果是0的话,那么就会出现问题。为了避免这种情况,我们可以把之前的估计替换为:

    egin{equation*}
    phi_{j|y=1}= frac{sum_{i=1}^m 1 {x_j^{(i)}=1land y^{(i)}=1}+1} {sum_{i=1}^m 1 {y^{(i)}=1}+2}
    end{equation*}

    egin{equation*}
    phi_{j|y=0}= frac{sum_{i=1}^m 1 {x_j^{(i)}=1land y^{(i)}=0}+1} {sum_{i=1}^m 1 {y^{(i)}=0}+2}
    end{equation*}

    即,在分子后面加1,在分母后面加2,这样就可以保证分子分母都不为0。这种方法称为拉普拉斯平滑。

    朴素贝叶斯算法的两种变化形式

    第一种:二值特征到多值特征的一般性推广

    如果我们希望把朴素贝叶斯算法从二值的特征$x_i$推广到一般的多值情况,我们只需把之前的对$p(x|y)$建模时的伯努利模型替换为多项式模型即可。另外,如果输入变量本身的取值为连续的,我们依然可以把它离散化,然后用贝叶斯模型来建模。如下例中关于房屋面积的离散化方式:

    房屋面积(平方英尺) <400 400-800 800-1200 1200-1600 >1600
    $x_i$ 1 2 3 4 5

    第二种:朴素贝叶斯的事件模型。

    之前的算法中,当我们把邮件表示成特征向量时,并没有考虑每个单词在邮件中出现的次数。我们只是定义,只要某个单词在邮件中出现过,那么特征向量中,这个单词对应位置的元素就为1。这种方式叫“多元伯努利模型”。

    这里介绍一种新的方法,不但可以。我们让$x_i$表示邮件中的第$i$个词,那么$x_i$的取值范围就是:${ 1, 2, cdots, |V| }$,其中$|V|$是我们词典的size,上例中的50000。一封邮件就可以由向量$(x_1, x_2, cdots, x_n)$构成,长度为$n$,对不同的邮件,$n$的取值也都是不一样的。换句话说,$x_1$的值就是第一个单词在词典中的索引,然后依次类推,生成这个特征向量。

    如此,训练集合的似然为:

    egin{eqnarray*}
    L(phi, phi_{i|y=0},phi_{i|y=1}) & = & prod_{i=1}^m p(x^{(i)}, y^{(i)}) \
    & = & prod_{i=1}^m (prod_{j=1}^{n_i}p(x_j^{(i)}|y;phi_{i|y=0},phi_{i|y=1}))p(y^{(i)};phi_y)
    end{eqnarray*}

    最大似然估计的结果:

    egin{equation*}
    phi_{k|y=1}= frac{sum_{i=1}^m sum_{j=1}^{n_i} 1 {x_j^{(i)}=kland y^{(i)}=1}} {sum_{i=1}^m1 {y^{(i)}=1}n_i}
    end{equation*}

    egin{equation*}
    phi_{k|y=0}= frac{sum_{i=1}^m sum_{j=1}^{n_i} 1 {x_j^{(i)}=kland y^{(i)}=0}} {sum_{i=1}^m1 {y^{(i)}=0}n_i}
    end{equation*}

    egin{equation*}
    phi_y=frac{sum_{i=1}^m 1 {y^{(i)}=1} } {m}
    end{equation*}

    考虑拉普拉斯平滑后的结果:

    egin{equation*}
    phi_y=frac{sum_{i=1}^m 1 {y^{(i)}=1} } {m}
    end{equation*}

    egin{equation*}
    phi_{k|y=1}= frac{sum_{i=1}^m sum_{j=1}^{n_i} 1 {x_j^{(i)}=kland y^{(i)}=1}+1 } {sum_{i=1}^m1 {y^{(i)}=1}n_i+|V|}
    end{equation*}

    egin{equation*}
    phi_{k|y=0}= frac{sum_{i=1}^m sum_{j=1}^{n_i} 1 {x_j^{(i)}=kland y^{(i)}=0}+1 } {sum_{i=1}^m1 {y^{(i)}=0}n_i+|V|}
    end{equation*}

    思考:非线性分类的logistic回归,为什么会得到一条线性的分界线????线性分类器?线性分类?http://www.cnblogs.com/dengdan890730/p/5539400.html

    反向传播:梯度下降算法运用在在神经网络上时的特殊名字,即在一个神经网络上对这样的一个成本函数执行梯度下降算法。

  • 相关阅读:
    配置好IIS中的SMTP服务器
    金秋十月
    "小生"的Google搜索结果
    "苏州大本营"腐败大会第三次顺利召开
    我修改了半年的密码还没有成功修改,dudu你能修改吗?
    好资源大家分享
    利用Google来调用其他网站查询信息
    推荐一本书<<专家门诊——ASP.NET开发答疑200问>>
    谁能给我一个FeedDemon v1.1的序列号或者注册文件
    毕业2月有余,苏州同学腐败第二次大聚会
  • 原文地址:https://www.cnblogs.com/li--chao/p/7622953.html
Copyright © 2020-2023  润新知