朴素贝叶斯(NB)分类算法

1.分类任务描述

分类任务是机器学习中最常见的任务。给定一个对象X,将X划分到预定好的某一类别y中。其中Y代表所有类别的一个有限集合,如新闻类别:{军事新闻,科技新闻,生活新闻}。y代表分类集合中的某一类别,如军事新闻。X代表待分类的对象,x代表该对象的特征,如X代表一篇待分类的文章则x就代表该文章中的单词。目标:输入X,输出y

2.贝叶斯定理

推导过程:

          已知条件概率公式为:    P(X|Y) = P(X,Y)/P(Y)  在Y发生的情况下,X发生的概率

           P(X|Y) = P(X,Y)/P(Y)     ===》    P(X,Y)=P(X|Y)*P(Y)

           P(X,Y)=P(Y,X)=P(Y|X)*P(X)

           所以:P(X|Y)=P(Y|X)*P(X)/P(Y)

我们的目的是在已知对象X情况下,求X对象所属类别Yi的概率,所以最后的公式为:

           P(Yi|X)=P(X|Yi)*P(Yi)/P(X)

概念理解:

       P(X):对象X自身的概率,是一个固定值,可以忽略。可以这么理解:给定一篇文章,这篇文章已经存在所以概率为1。

       P(Yi | X):给定对象X,求对象X所属类别的概率

       P(Yi):先验概率(重要)例:给定100篇文章,其中有50篇属于军事文章,30篇属于体育文章,20篇属于科技文章。那么军事文章的先验概率为P(军事) = 50/100,体育文章的先验概率为P(体育) = 30/100,科技文章的先验概率为P(科技) = 20/100。

      P(X | Yi):某一类别产生该对象的概率。我们先看一个简单的例子P(Xi | X),前面说到X是一个对象,还是举文章的例子即X是是一篇文章,Xi是这篇文章的特征即文章中的关键词,那么这个概率就可以理解为一片文章中出现某一个关键词的概率,这样我们就可以进一步深入一个概率为P(Xi | Yi)即某一类文章中出现某一个关键词的概率。例:共有军事类文章50篇,其中飞机这个单词出现了20次,那么P(Xi | Yi) = 20/50篇文章的总词数。

3.朴素贝叶斯            

    前提条件:独立同分布

     在有独立同分布的前提条件下有:  P(X | Yi) =     P(X1 | Yi) * P(X2 | Yi) * P(X3 | Yi) ......... * P(Xn | Yi)                                                        所以由此推出朴素贝叶斯公式为:

             

 

      由上图可知,因为P(X)是一个固定值可以忽略,所以想要预测分类,我们只需要知道两个参数,其实这两个参数就是我们的模型。

          1.P(Yi):先验概率

          2.P(Xi | Yi):条件概率

     最大似然估计法求条件概率:      

           P(Xi | Yi) = Count(Xi,Yi)/ Count(Yi)

           例:给定1000篇文章,共有500篇军事文章,300篇科技文章,200篇体育文章。军事文章中飞机出现了200篇,导弹出现了80篇,则:

              先验概率:P(军事)=500/1000=0.5

              条件概率:P(飞机 | 军事) = 200/500 = 0.4  ,P(导弹 | 军事) = 80 / 500 = 0.16                                          

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是基于Python的朴素叶斯分类算法实现: ```python import math class NaiveBayes: def __init__(self): self.classes = None self.class_priors = None self.conditional_probs = None def fit(self, X, y): self.classes = list(set(y)) self.class_priors = {c: 0 for c in self.classes} self.conditional_probs = {} # 计算类别先验概率 for c in y: self.class_priors[c] += 1 for c in self.classes: self.class_priors[c] /= len(y) # 计算条件概率 for c in self.classes: self.conditional_probs[c] = {} for i in range(len(X[0])): self.conditional_probs[c][i] = {} for xi in set([x[i] for x in X]): self.conditional_probs[c][i][xi] = 0 for xi in set([x[i] for x in X]): xi_count = 0 for j in range(len(X)): if y[j] == c and X[j][i] == xi: xi_count += 1 for i in range(len(X[0])): self.conditional_probs[c][i][xi] = xi_count / self.class_priors[c] / len(X) def predict(self, X): y_pred = [] for x in X: prob_max = -1 y_pred_i = -1 for c in self.classes: prob = math.log(self.class_priors[c]) for i in range(len(x)): prob += math.log(self.conditional_probs[c][i][x[i]]) if prob > prob_max: prob_max = prob y_pred_i = c y_pred.append(y_pred_i) return y_pred ``` 其中,`fit()` 和 `predict()` 分别是训练和预测函数。在 `fit()` 函数中,首先计算了每个类别的先验概率,然后计算了每个特征值在给定类别下的条件概率。在 `predict()` 函数中,根据叶斯公式计算待预测样本属于每个类别的后验概率,并选取概率最大的类别作为预测结果。 使用朴素叶斯分类器进行分类的步骤如下: ```python # 假设已有训练集 X_train 和标签 y_train,测试集 X_test nb = NaiveBayes() nb.fit(X_train, y_train) y_pred = nb.predict(X_test) ``` 其中,训练集和测试集均为二维数组,每行代表一个样本,每列代表一个特征。标签为一维数组,长度与样本数相同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值