机器学习笔记:Generative Learning

  一口气看完了第五讲。主要讲了Generating Learning(生成学习算法)。什么是Generating Learning呢?Andrew Ng 先给出了Discriminative Learning(判别学习算法)的概念,Logistic Regression就是典型的Discriminative Learning,它将最大化P(y|x)作为优化的目标,拟合出h(x),对于输入x,将h(x)与0.5比大小,就得到了分类结果。而Generating Learning(生成学习算法)则不同,它不知道P(y=1|x)和P(y=0|x),但可以通过训练或者先验知识得到P(x|y=0/1),P(y=0/1),再由贝叶斯公式:P(y=i|x)=P(x|y=i)*P(y=i)/P(x);P(x)=P(x|y=1)*P(y=1)+P(x|y=0)*P(y=0)计算得到后验概率P(y=i|x),然后比较后验概率的大小即可得到分类结果。

  第一个算法是高斯判别分析(Gaussian discriminant analysis),这个算法很经典,x各维特征的均值和协方差矩阵不同,后验概率密度函数p(y|x)的形状也会不同,上学期的《模式识别》课已经有详细的介绍。相同的内容,今天听Andrew Ng讲有了新的收获,他画出了P(y=1|x)的图,跟Logistic Regression中的sigmoid函数非常像。之后他给出了一个非常漂亮的结论,如果x|y服从高斯分布,则后验分布函数P(y=1|x)将是一个sigmoid函数,反之则不一定成立。前者是一个更强的假设。这也给了我们工程实现中的启示:如果知道x|y很好地服从高斯分布,则果断选择Gaussian discriminant analysis,如果x|y不服从高斯分布,则Logistic Regression效果可能更好。

  第二个算法是朴素贝叶斯算法(Naive Bayesian),以前一直以为Gaussian discriminant analysis就是Naive Bayesian,今天才知道真正Naive的是我机器学习笔记:Generative Learning - 李小宝 O(∩_∩)O。算法原理很简单:根据训练数据得到P(y=i)、P(x=j|y=i),最后通过贝叶斯公式求得P(y=i|x=j)。例如识别垃圾邮件的问题,y=1/0分别表示是否为垃圾邮件,X为一个5000维的向量,Xi=1/0表示字典中第i个词是否在邮件中,设m为邮件样本数,则P(y=i)=#(y=i)/m,P(x=j|y=i)=#(x=j,y=i)/#(y=i)。这里有一个小问题,假如某个词k一直未出现在训练样本中,那么P(x=k|y=1)=#(x=k,y=1)/#(y=1)=0,意味着词k不可能在正常邮件中出现,但事实上k有可能出现,“至于你信不信,反正我是信了”。怎么办呢,用拉普拉斯平滑(Laplace Smoothing)的办法:P(y=i)=(#(y=i)+1)/(m+2),P(x=j|y=i)=(#(x=j,y=i)+1)/(#(y=i)+2)。吴军在《数学之美》讲自然语言处理的统计模型的时候提到过类似的方法。  

  参考链接:http://v.163.com/movie/2008/1/A/R/M6SGF6VB4_M6SGHMFAR.html