机器学习(十四)
——朴素贝叶斯实现分类器
(原创内容,转载请注明来源,谢谢)
一、概述
朴素贝叶斯,在机器学习中,是另一种思想,属于概率思想。不过其还是在已知结果进行分类,因此也属于监督学习中的分类算法。
朴素贝叶斯的思想是,根据特征计算出每种分类结果的概率,取概率最大的结果作为对最终结果的预测。
“朴素”的含义是包含了两个假设,一是假定所有特征都同等重要,二是假定每个特征之间独立,即一个特征的值的变化完全不会影响另一个特征的值。
“贝叶斯”是一种概率思想,其引入了先验概率和逻辑推理;与其对应的是“频数概率”,其只从数据本身获取概率,不考虑先验。简单来说,贝叶斯的概率是一种条件概率,即在发生某件事为前提下,另一件事发送的概率。
公式如下:p(ci|x,y)=p(x,y|ci)*p(ci)/p(x,y)。其中的x,y可以拓展到n维,表示的是要求在特征x、y的情况下,ci的概率,可以通过求出ci发生情况下是x、y特征值的概率、ci本身的概率、x、y特征值的概率,再通过上面的公式求出ci。然后,再比较ci,将最大的结果对应的i,作为最终的分类结果。
本文的文本分类,都是英文文本分类,中文由于其词汇构成的复杂,分词比较复杂,暂时没有考虑。
二、文本分类
1、需求
现在需要一个工具,来判断一些词语中,是否存在侮辱性词汇。假定已经将段落拆分成单词数组,并告知哪些词汇是侮辱性词汇,需要构造一个学习器,其可以学习上面的内容,并且在新输入的内容中,进行判断和反馈。
2、样本数据
样本数据包含一些句子,以及该句子是否为侮辱性句子的矩阵。
3、数据处理
要使系统能够“学习”到样本数据,需要先读取里面的句子,对词语进行去重。
4、数据转成向量
有两种方式,一种是仅考虑是否发生(即值只有和1),称为词集模型;另一种是不仅考虑是否发生,还考虑发送次数,称为词带模型。
初始值都设置成,后面发生1次,则记录为1,标记这个词语的类别不一样。
对于多分类、判断前几名或最后几名等情况,则必须使用词带模型,因为其记录了发生次数,信息量更多。
5、朴素贝叶斯训练函数
这个函数很重要,是朴素贝叶斯的核心。其就是根据p(ci|x,y)=p(x,y| ci)*p(ci)/p(x,y)公式,计算出每个分类可能性的概率。
做法是,遍历已知的分类结果,同时遍历原先的文本段落的句子,其是一一对应的。遍历到的分类结果如果是1,表示这个文档中有1个侮辱性词汇,则概率是侮辱性内容的分子会对应的加1,否则会加到概率是的部分。
这里结果取对数,是防止结果太小被四舍五入成。另外初始值都设置成1,是防止如果有些没有发生的值,那么在矩阵除法的时候会除以。
6、朴素贝叶斯分类函数
将输入的分类向量的每个元素对应值,和p1对应元素位置相乘,再求和,再将结果加入到这个类别对应的一个整体的概率上。注意到的是,这里的加是log的加。log A + log B = log A*B,log A – log B = logA/B
由上面的分类可知,p1Vec=log(p1Num/p1Denom),这个进行sum后,相当于log(p1Num1*p1Num2..*p1Numn/(p1Denom1*p1Denom2…*p1Denomn)),其再和log(pClass1)相加后,即log的内部再乘以pClass1。这样公式正好凑成p(x,y|ci)*p(ci)/p(x,y)。
7、测试效果与运行结果
三、小结
1、朴素贝叶斯的概念和代码逻辑,相对于knn、决策树等,都要简单得多,核心即理解概率的公式,以及朴素贝叶斯的简化概念的思想。
2、对于概率求解,要注意到这里是取了对数情况下的计算,因此才会出现相加的情况,其本质上还是乘法。取对数并不会影响最终的判断结果,因为函数的增减和其对数的增减趋势是一样的,而这里只需要比较两个情况哪种概率大,并不需要一个概率的绝对值。
——written by linhxx 2018.01.13
本文来自企鹅号 - PHP思想家媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文来自企鹅号 - PHP思想家媒体
如有侵权,请联系 cloudcommunity@tencent.com 删除。