理工科的我们早在高中时期就听闻贝叶斯公式大名,我们接触较多的是条件概率公式,即P(X,Y|C)此类,完整的贝叶斯公式,是条件概率公式的升级版。
我们需要基础概率知识作为前提:
- 条件概率,事件B发生的情况下,事件A发生的概率,用P(A|B)来表示。
- 先验概率,普通的已知事件的概率。(这个人来自赵家堡的概率?)
- 后验概率,比较重要,已知一个事实条件,对于另一事件的概率。(已知这个人姓赵,那么他来自赵家堡的概率?)
-
推导了这个贝叶斯公式就能看懂后面了:
贝叶斯公式变形,后面会用
同时我们需要理解,朴素的概念。朴素贝叶斯用在算法中,是考虑了最理想的情况,每一个特征/数据都是独立的,即特征与特征之间不考虑相关性。虽然在现实中看似不现实,但是在实际算法中,“朴素”使得数据降维,避免了模型的过度复杂。
我们举垃圾邮件分类的例子来理解这个算法。
对于电子邮件;
- 垃圾邮件的垃圾词汇,假设构建一个垃圾词汇列表,假设列表有m个特征;
每一封邮件包含N个词汇;那么对于这封邮件,用来判断的样本数为 m*N - 我们将这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)
- 我们此时开始训练贝叶斯函数;在训练函数的过程中,我们拿出相当一部分垃圾邮件和正常邮件(即有标注的训练数据)
- 容易计算训练集中,邮件类型的概率。
- 循环遍历所有词汇,我们能够计算,每个词汇的类型(是否为垃圾词汇)的概率
- 对于任意一个词汇我们得到他的后验概率。(已知文档类型,词汇类型的概率)
- 训练集中的邮件,有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
- 我们根据后验概率的向量形式,构建出分类函数,这点需要根据二分类或者多分类问题的不同。接下来,就可以导入测试集进行测试了
朴素贝叶斯在机器学习中,初步展示给我们训练和测试的意义所在,训练是从部分已知中寻找特定规律来推测未知。个人愚钝,文字描述还有不清晰的地方,必须尽快提高。
网友评论