朴素贝叶斯算法原理

(作者:陈玓玏)

1. 损失函数

假设我们使用0-1损失函数,函数表达式如下:
在这里插入图片描述
Y Y Y为真实值,有 c 1 , c 2 , . . . , c K {c_1,c_2,...,c_K} c1,c2,...,cK K K K个类标记, f ( X ) f(X) f(X)是决策函数,其输出值就是类标记的预测值,那么对应的代价函数,也就是期望损失函数为:
R e x p ( X ) = E ( L ( Y , f ( X ) ) ) R_exp(X) = E(L(Y,f(X))) Rexp(X)=E(L(Y,f(X)))
因为这里的期望是对联合概率取的,所以有如下关系:
R e x p ( X ) = ∑ k = 1 K L ( c k , f ( X ) ) P ( c k , X ) = E x ∑ k = 1 K L ( c k , f ( X ) ) P ( c k ∣ X ) R_exp(X) = \sum_{k=1}^{K}L(c_k,f(X))P(c_k,X) = E_x\sum_{k=1}^{K}L(c_k,f(X))P(c_k|X) Rexp(X)=k=1KL(ck,f(X))P(ck,X)=Exk=1KL(ck,f(X))P(ckX)
L ( Y , f ( X ) ) L(Y,f(X)) L(Y,f(X))代入,得到:
R e x p ( X ) = ∑ k = 1 K P ( Y ≠ c k ∣ X ) = ∑ k = 1 K ( 1 − P ( Y = c k ∣ X ) ) R_exp(X) = \sum_{k=1}^{K}P(Y \neq c_k|X) = \sum_{k=1}^{K}(1-P(Y=c_k|X)) Rexp(X)=k=1KP(Y̸=ckX)=k=1K(1P(Y=ckX))
要让损失函数最小化,只需要和项中的每一项都是最小即可:
m i n ∑ k = 1 K ( 1 − P ( Y = c k ∣ X ) ) = m a x ∑ k = 1 K P ( Y = c k ∣ X ) = m a x P ( Y = c k ∣ X ) min\sum_{k=1}^{K}(1-P(Y=c_k|X)) = max\sum_{k=1}^{K}P(Y=c_k|X) = maxP(Y=c_k|X) mink=1K(1P(Y=ckX))=maxk=1KP(Y=ckX)=maxP(Y=ckX)
这也就是我们之后朴素贝叶斯算法的依据:求得最大后验概率即能最小化代价函数!

2. 求最大化后验概率

基于上面的分析我们知道,对于数据集 D = ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) D = {(x_1,y_1),(x_2,y_2),...,(x_N,y_N)} D=(x1,y1),(x2,y2),...,(xN,yN),当 y i y_i yi的可取值为 c 1 , c 2 , . . . , c K {c_1,c_2,...,c_K} c1,c2,...,cK时,我们对每个样本 x i x_i xi求其对应不同类标记 c k c_k ck的后验概率值,并选择最后的后验概率值对应的类标号 c k c_k ck作为样本的分类结果,我们就能以最小的代价函数获得最优的分类。

那么,我们可以根据贝叶斯公式来求后验概率:
P ( Y = c k ∣ X = x i ) = P ( X = x i ∣ Y = c k ) P ( Y = c k ) ∑ k = 1 K P ( X = x i ∣ Y = c k ) P ( Y = c k ) P(Y=c_k|X=x_i) = \frac{P(X=x_i|Y=c_k)P(Y=c_k)}{\sum_{k=1}^{K}P(X=x_i|Y=c_k)P(Y=c_k)} P(Y=ckX=xi)=k=1KP(X=xiY=ck)P(Y=ck)P(X=xiY=ck)P(Y=ck)
这里有些犯难了,样本 x i x_i xi J J J个属性,怎么求得先验概率呢?这时候朴素贝叶斯的优势就体现出来了,朴素贝叶斯和贝叶斯最重要的区别就在于,朴素贝叶斯假设在类确定的条件下,样本的特征之间是相互独立的!因此,上面的公式就可以拆分成以下形式:
P ( Y = c k ∣ X = x i ) = P ( Y = c k ) ∏ j = 1 J P ( X j = x i j ∣ Y = c k ) ∑ k = 1 K P ( Y = c k ) ∏ j = 1 J P ( X j = x i j ∣ Y = c k ) P(Y=c_k|X=x_i) = \frac{P(Y=c_k)\prod_{j=1}^{J} P(X^j=x_i^j|Y=c_k)}{\sum_{k=1}^{K}P(Y=c_k)\prod_{j=1}^{J} P(X^j=x_i^j|Y=c_k)} P(Y=ckX=xi)=k=1KP(Y=ck)j=1JP(Xj=xijY=ck)P(Y=ck)j=1JP(Xj=xijY=ck)
因为分母对于同一个样本来说都是一样的,因此我们在具体算法流程中是可以不考虑分母的大小的。

3. 极大似然完成参数估计

在上一小节,我们已经计算好了最大后验概率的公式,但是公式中还有两个重要的部分没有得到解答,一个是类别概率,一个是先验概率,我们通过极大似然估计来完成这两个参数的估计:
在这里插入图片描述
完成先验概率及条件概率的估算后,我们就可以完成后验概率(不需要计算分母)的计算了。针对不同的类标号计算后验概率,计算结果最大的后验概率对应的类标号即为样本对应的类标号。

4. 贝叶斯估计

用极大似然估计的先验概率及条件概率可能出现概率值为0的情况,比如计算先验概率时,发现没有 c k c_k ck类型的样本,那么先验概率 P ( Y = c k ) P(Y=c_k) P(Y=ck)的估计结果将会为0,那么条件概率 P ( X j = a j l ∣ Y = c k ) P(X^j=a_{jl}|Y=c_k) P(Xj=ajlY=ck)的分母将会为0,计算不出结果,后验概率自然也就无法计算了。这种情况下,可以在条件概率中加入一个参数来做平滑,公式如下:
在这里插入图片描述
式中 s j s_j sj为样本的第 j j j个特征的可取值个数,也就是可取值 a j 1 , a j 2 , … , a j S j a_{j1}, a_{j2},…, a_{jS_j} aj1,aj2,,ajSj的个数, λ = 0 \lambda=0 λ=0时,公式就是条件概率的极大似然估计, λ = 1 \lambda=1 λ=1时,称为拉普拉斯平滑。对先验概率也要做平滑:
在这里插入图片描述
式中 N N N为样本个数, K K K为类标号个数。

5. 朴素贝叶斯使用场景

(个人理解,有不对请提出来讨论,谢谢)朴素贝叶斯适用于给文章加标签这样的场景,假设有十万篇文章需要加标签,我们可以先对每篇文章进行分词,提取重复度高的关键词,然后生成关键词向量,如下表所示:
在这里插入图片描述
下表提取了文章中出现频率最高的关键词,并根据事先定义好的关键词向量,如果这个关键词在文中出现频率高,则标记为1,频率不高,则标记为0,然后就可以通过朴素贝叶斯算法进行分类了。比如新来一篇文章6,其出现频率最高的关键词是“吃饭”,我们需要分别计算 P ( “ 经 济 ” ∣ 文 章 6 ) P(“经济”|文章6) P(6) P ( “ 美 食 ” ∣ 文 章 6 ) P(“美食”|文章6) P(6),…, P ( “ 数 据 分 析 ” ∣ 文 章 6 ) P(“数据分析”|文章6) P(6),根据公式计算就好。

我也想过是不是不用是否出现作为特征的值,而是用出现的频率作为特征的值,但是这样的话每个特征可取的值就非常多,计算条件概率时会很复杂,所以还是采用了这种造变量的方法。

6. 朴素贝叶斯优缺点

优点:计算简单,高效;
缺点:分类性能不一定高,要求特征相互独立的条件太强。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
朴素贝叶斯算法原理朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立假设的分类算法。其基本思想是对于给定的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个类别的概率最大,就认为此待分类项属于哪个类别。具体来说,朴素贝叶斯算法假设每个特征与其他特征之间相互独立,即每个特征都独立地对分类结果产生影响。在实际应用中,朴素贝叶斯算法常用于文本分类、垃圾邮件过滤等领域。 Python实现: Python中有多个库可以实现朴素贝叶斯算法,其中比较常用的是scikit-learn库。下面是一个简单的示例代码,用于展示如何使用scikit-learn库实现朴素贝叶斯算法进行文本分类: ```python from sklearn.naive_bayes import MultinomialNB from sklearn.feature_extraction.text import CountVectorizer # 构建训练数据 train_data = ['this is a good book', 'this is a bad book', 'good day', 'bad day'] train_labels = ['positive', 'negative', 'positive', 'negative'] # 构建特征提取器 vectorizer = CountVectorizer() # 将文本转换为特征向量 train_features = vectorizer.fit_transform(train_data) # 构建朴素贝叶斯分类器 clf = MultinomialNB() # 训练分类器 clf.fit(train_features, train_labels) # 构建测试数据 test_data = ['good book', 'bad book', 'happy day'] test_features = vectorizer.transform(test_data) # 进行预测 predicted_labels = clf.predict(test_features) # 输出预测结果 print(predicted_labels) # 输出:['positive' 'negative' 'positive'] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值