机器学习笔记(10)---朴素贝叶斯

本文介绍了朴素贝叶斯分类方法,重点解析了贝叶斯定理及其在机器学习中的应用。文章通过讲解如何计算关键概率,解决零频率和下溢问题,展示了如何在实际中运用朴素贝叶斯。并提供了机器学习实战中的朴素贝叶斯代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于概率论的分类方法:朴素贝叶斯

前两章KNN和决策树相对来说是很简单的,本章开始学习朴素贝叶斯,使用基于概率论的分类方法。这部分的内容要用一定的统计学和概率论与数理统计的基础。

可参考中国大学MOOC课程概率论与数理统计 由哈工大数学系出品,另外还可参考浙江大学和同济大学的概率论与数理统计课程,相关课程请自行搜索。

朴素贝叶斯总结

贝叶斯相关理论一开始并没有理解,看了好多遍视频,再结合书,来来回回倒腾了好多次,最后再细细体会才算基本上弄明白了。想弄明白贝叶斯相关理论基础需要把前言部分推荐的书《概率论与数理统计》第一章和第二章中条件概率、乘法定理以及全概率弄明白,建议最好跟着老师的视频看。

贝叶斯其实最主要的就是MLiA P60页的这个公式:

p(ci|w)=p(w|ci)p(ci)p(w) p ( c i | w ) = p ( w | c i ) p ( c i ) p ( w )

其中的 w w 是一个句子的词向量(直接理解为句子组成方式即可,如何转换成向量可参考书上), c i 为类别(侮辱性或非侮辱性), p(ci|w) p ( c i | w ) 则表示在给定一个句子组成方式的情况下属于类别

### 使用N-Gram模型预测句子出现概率 #### N-Gram模型概述 N-Gram是一种基于统计的语言模型,用于预测下一个单词的概率分布。该方法通过分析前\( n-1 \)个词的历史来估计第\( n \)个词的条件概率[^1]。 对于二元语法(Bigram),即当 \( n=2 \)时,每个词仅依赖于其前一个词。这种简化使得计算变得更为可行,并且能够有效地捕捉到一些局部的语言结构特征[^2]。 #### 计算过程 为了评估某个特定序列(如一句话)的可能性,在实践中通常会采用最大似然估计(Maximum Likelihood Estimation, MLE)来进行参数学习。具体来说: \[ P(w_i | w_{i-1}) = \frac{C(w_{i-1},w_i)}{\sum\limits_v C(w_{i-1},v)} \] 其中, - \(P(w_i|w_{i−1})\) 表示在已知上一个词语的情况下当前词语发生的条件概率- \(C(x,y)\) 是指一对连续词语 (x, y) 出现次数;而分母则是所有可能后续词汇 v 的总频次之和。 因此,整个句子 S 的联合概率可以通过连乘各个位置上的条件概率得到: \[ P(S)=\prod _{{t}=1}^{T}{P}(w_{{t}}|w_{{t}-1}) \] 这里 T 代表句子长度。 #### 实际应用中的平滑技术 然而,在实际应用场景下,由于数据稀疏性问题的存在,某些组合可能会从未见过或常罕见,从而导致零概率的情况发生。为了避免这种情况影响整体性能,一般还会引入各种形式的平滑策略,比如加一平滑(Laplace smoothing)[^3]。 ```python import jieba from collections import defaultdict class BigramModel: def __init__(self): self.unigrams = defaultdict(int) self.bigrams = defaultdict(lambda: defaultdict(int)) def train(self, corpus): for sentence in corpus: words = ['<s>'] + list(jieba.cut(sentence)) + ['</s>'] for i in range(1, len(words)): prev_word = words[i-1] curr_word = words[i] self.unigrams[curr_word] += 1 self.bigrams[prev_word][curr_word] += 1 def predict_sentence_prob(self, sentence): prob = 0.0 words = ['<s>'] + list(jieba.cut(sentence)) + ['</s>'] for i in range(1, len(words)): prev_word = words[i-1] curr_word = words[i] bigram_count = self.bigrams.get(prev_word, {}).get(curr_word, 0) unigram_count = self.unigrams.get(prev_word, 0) if unigram_count != 0 and bigram_count != 0: prob += math.log(bigram_count / unigram_count) else: # Handle unseen cases with a small probability or apply smoothing techniques. pass return math.exp(prob) # Example usage corpus = ["我喜欢吃苹果", "他喜欢吃香蕉"] model = BigramModel() model.train(corpus) print(model.predict_sentence_prob("我喜欢吃")) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值