机器学习基础算法(2)--朴素贝叶斯

理工科的我们早在高中时期就听闻贝叶斯公式大名,我们接触较多的是条件概率公式,即P(X,Y|C)此类,完整的贝叶斯公式,是条件概率公式的升级版。

我们需要基础概率知识作为前提:

  • 条件概率,事件B发生的情况下,事件A发生的概率,用P(A|B)来表示。
  • 先验概率,普通的已知事件的概率。(这个人来自赵家堡的概率?)
  • 后验概率,比较重要,已知一个事实条件,对于另一事件的概率。(已知这个人姓赵,那么他来自赵家堡的概率?)
  • 推导了这个贝叶斯公式就能看懂后面了:


    贝叶斯公式变形,后面会用

同时我们需要理解,朴素的概念。朴素贝叶斯用在算法中,是考虑了最理想的情况,每一个特征/数据都是独立的,即特征与特征之间不考虑相关性。虽然在现实中看似不现实,但是在实际算法中,“朴素”使得数据降维,避免了模型的过度复杂。

我们举垃圾邮件分类的例子来理解这个算法。
对于电子邮件;

  1. 垃圾邮件的垃圾词汇,假设构建一个垃圾词汇列表,假设列表有m个特征;
    每一封邮件包含N个词汇;那么对于这封邮件,用来判断的样本数为 m*N
  2. 我们将这N个词汇,看作N个向量(简化认为无重复词汇);每一个向量,在列表中遍历一次,对比有无和垃圾词汇重合,记为0或1。此时得到的向量形如[0, 0, 1, 0, 1, 1, 1, 0, 0, 0...0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0](1*N)
  3. 我们此时开始训练贝叶斯函数;在训练函数的过程中,我们拿出相当一部分垃圾邮件和正常邮件(即有标注的训练数据)
  • 容易计算训练集中,邮件类型的概率。
  • 循环遍历所有词汇,我们能够计算,每个词汇的类型(是否为垃圾词汇)的概率
  • 对于任意一个词汇我们得到他的后验概率。(已知文档类型,词汇类型的概率)
  • 训练集中的邮件,有N个词汇,我们得到1*N的后验概率向量,这
    一向量非常重要,要用来构建分类函数。示例一段简明的Python分类函数代码。
    def train(train_matrix, train_category):
     # 朴素贝叶斯分类器训练函数
     num_train = len(train_matrix)
     num_words = len(train_matrix[0])
     p_abusive = sum(train_category)/float(num_train)
     p0num = np.ones(num_words)
     p1num = np.ones(num_words)
     p0_denom = 2.0  #取2.0使得计算结果不会过小
     p1_denom = 2.0
     p0vec = []
     p1vec = []
     for i in range(num_train):
         if train_category[i] == 1:
             p1num += train_matrix[i]
             p1_denom += sum(train_matrix[i])
         else:
             p0num += train_matrix[i]
             p0_denom += sum(train_matrix[i])
     for i in range(num_words):
         p0vec.append(math.log(p0num[i] / p0_denom))
         p1vec.append(math.log(p1num[i] / p1_denom))
         # 取对数了防止多个很小的数相乘使得程序下溢出
     return p_abusive, p0vec, p1vec
    
    
  1. 我们根据后验概率的向量形式,构建出分类函数,这点需要根据二分类或者多分类问题的不同。接下来,就可以导入测试集进行测试了

朴素贝叶斯在机器学习中,初步展示给我们训练和测试的意义所在,训练是从部分已知中寻找特定规律来推测未知。个人愚钝,文字描述还有不清晰的地方,必须尽快提高。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容