机器学习--朴素贝叶斯分类器

这篇具有很好参考价值的文章主要介绍了机器学习--朴素贝叶斯分类器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第1关:条件概率

什么是条件概率

概率指的是某一事件A发生的可能性,表示为P(A)。而条件概率指的是某一事件A已经发生了条件下,另一事件B发生的可能性,表示为P(B|A),举个例子:

今天有25%的可能性下雨,即P(下雨)=0.25; 今天75%的可能性是晴天,即P(晴天)=0.75; 如果下雨,我有75%的可能性穿外套,即P(穿外套|下雨)=0.75; 如果下雨,我有25%的可能性穿T恤,即P(穿T恤|下雨)=0.25;

从上述例子可以看出,条件概率描述的是|右边的事件已经发生之后,左边的事件发生的可能性,而不是两个事件同时发生的可能性!

  • 1、P(AB)表示的是事件A与事件B同时发生的概率,P(A|B)表示的是事件B已经发生的条件下,事件A发生的概率。

    A、对   B、错
  • 2、从1,2,...,15中小明和小红两人各任取一个数字,现已知小明取到的数字是5的倍数,请问小明取到的数大于小红取到的数的概率是多少?

    A、7/14   B、8/14  C、9/14   D、10/14

答案:1、A        2、C 

第2关:贝叶斯公式

全概率公式:

当为了达到某种目的,但是达到目的有很多种方式,如果想知道通过所有方式能够达到目的的概率是多少的话,就需要用到全概率公式上面的例子就是这种情况!)。全概率公式的定义如下:

若事件B1​,B2​,...,Bn​两两互不相容,并且其概率和为1。那么对于任意一个事件C都满足:

P(C)=P(B1​)P(C∣B1​)+...+P(Bn​)P(C∣Bn​)=i=1∑n​P(Bi​)P(C∣Bi​)

贝叶斯公式:

当已知引发事件发生的各种原因的概率,想要算该事件发生的概率时,我们可以用全概率公式。但如果现在反过来,已知事件已经发生了,但想要计算引发该事件的各种原因的概率时,我们就需要用到贝叶斯公式了。

贝叶斯公式定义如下,其中A表示已经发生的事件,Bi为导致事件A发生的第i个原因:

P(Bi​∣A)=∑i=1n​P(A∣Bi​)P(Bi​)P(A∣Bi​)P(Bi​)​

贝叶斯公式看起来比较复杂,其实非常简单,分子部分是乘法定理,分母部分是全概率公式(分母等于P(A))。

如果我们对贝叶斯公式进行一个简单的数学变换(两边同时乘以分母,再两边同时除以P(Bi))。就能够得到如下公式:

P(A∣Bi​)=P(Bi​)P(Bi​∣A)P(A)​

这个公式是朴素贝叶斯分类算法的核心数学公式。

  • 1、对以往数据分析结果表明,当机器调整得良好时,产品的合格率为98%,而当机器发生某种故障时,产品的合格率为55%。每天早上机器开动时,机器调整得良好的概率为95%。计算已知某日早上第一件产品是合格时,机器调整得良好的概率是多少?

    A、0.94    B、0.95    C、0.96    D、0.97
  • 2、一批产品共8件,其中正品6件,次品2件。现不放回地从中取产品两次,每次一件,求第二次取得正品的概率。

    A、1/4    B、1/2    C、3/4    D、1

答案:1、D   2、C        

第3关:朴素贝叶斯分类算法流程

import numpy as np
class NaiveBayesClassifier(object):
    def __init__(self):
        '''
        self.label_prob表示每种类别在数据中出现的概率
        例如,{0:0.333, 1:0.667}表示数据中类别0出现的概率为0.333,类别1的概率为0.667
        '''
        self.label_prob = {}
        '''
        self.condition_prob表示每种类别确定的条件下各个特征出现的概率
        例如训练数据集中的特征为 [[2, 1, 1],
                              [1, 2, 2],
                              [2, 2, 2],
                              [2, 1, 2],
                              [1, 2, 3]]
        标签为[1, 0, 1, 0, 1]
        那么当标签为0时第0列的值为1的概率为0.5,值为2的概率为0.5;
        当标签为0时第1列的值为1的概率为0.5,值为2的概率为0.5;
        当标签为0时第2列的值为1的概率为0,值为2的概率为1,值为3的概率为0;
        当标签为1时第0列的值为1的概率为0.333,值为2的概率为0.666;
        当标签为1时第1列的值为1的概率为0.333,值为2的概率为0.666;
        当标签为1时第2列的值为1的概率为0.333,值为2的概率为0.333,值为3的概率为0.333;
        因此self.label_prob的值如下:     
        {
            0:{
                0:{
                    1:0.5
                    2:0.5
                }
                1:{
                    1:0.5
                    2:0.5
                }
                2:{
                    1:0
                    2:1
                    3:0
                }
            }
            1:
            {
                0:{
                    1:0.333
                    2:0.666
                }
                1:{
                    1:0.333
                    2:0.666
                }
                2:{
                    1:0.333
                    2:0.333
                    3:0.333
                }
            }
        }
        '''
        self.condition_prob = {}
    def fit(self, feature, label):
        '''
        对模型进行训练,需要将各种概率分别保存在self.label_prob和self.condition_prob中
        :param feature: 训练数据集所有特征组成的ndarray
        :param label:训练数据集中所有标签组成的ndarray
        :return: 无返回
        '''

        #********* Begin *********#
        row_num=len(feature)
        col_num=len(feature[0])
        for c in label:
            if c in self.label_prob:
                self.label_prob[c]+=1
            else:
                self.label_prob[c]=1;
        for key in  self.label_prob.keys():
            self.label_prob[key]/=row_num
            self.condition_prob[key]={}
            for i in range(col_num):
                self.condition_prob[key][i]={}
                for k in np.unique(feature[:,i],axis=0):
                    self.condition_prob[key][i][k]=0
        for i in range(len(feature)):
            for j in range(len(feature[i])):
                if feature[i][j] in self.condition_prob[label[i]]:
                    self.condition_prob[label[i]][j][feature[i][j]]+=1
                else:
                    self.condition_prob[label[i]][j][feature[i][j]]=1
        for label_key in self.condition_prob.keys():
            for k in self.condition_prob[label_key].keys():
                total=0
                for v in self.condition_prob[label_key][k].values():
                    total +=v
                for kk in self.condition_prob[label_key][k].keys():
                    self.condition_prob[label_key][k][kk] /=total

        #********* End *********#

    def predict(self, feature):
        '''
        对数据进行预测,返回预测结果
        :param feature:测试数据集所有特征组成的ndarray
        :return:
        '''
        # ********* Begin *********#
        result =[]
        for i,f in enumerate(feature):
            prob=np.zeros(len(self.label_prob.keys()))
            ii=0
            for label,label_prob in self.label_prob.items():
                prob[ii]=label_prob
                for  j  in range(len(feature[0])):
                    prob[ii] *= self.condition_prob[label][j][f[j]]
                ii+=1
            result.append(list(self.label_prob.keys())[np.argmax(prob)])
        return np.array(result)
        #********* End *********#
    

第4关:拉普拉斯平滑 

import numpy as np

class NaiveBayesClassifier(object):
    def __init__(self):
        '''
        self.label_prob表示每种类别在数据中出现的概率
        例如,{0:0.333, 1:0.667}表示数据中类别0出现的概率为0.333,类别1的概率为0.667
        '''
        self.label_prob = {}
        '''
        self.condition_prob表示每种类别确定的条件下各个特征出现的概率
        例如训练数据集中的特征为 [[2, 1, 1],
                              [1, 2, 2],
                              [2, 2, 2],
                              [2, 1, 2],
                              [1, 2, 3]]
        标签为[1, 0, 1, 0, 1]
        那么当标签为0时第0列的值为1的概率为0.5,值为2的概率为0.5;
        当标签为0时第1列的值为1的概率为0.5,值为2的概率为0.5;
        当标签为0时第2列的值为1的概率为0,值为2的概率为1,值为3的概率为0;
        当标签为1时第0列的值为1的概率为0.333,值为2的概率为0.666;
        当标签为1时第1列的值为1的概率为0.333,值为2的概率为0.666;
        当标签为1时第2列的值为1的概率为0.333,值为2的概率为0.333,值为3的概率为0.333;
        因此self.label_prob的值如下:     
        {
            0:{
                0:{
                    1:0.5
                    2:0.5
                }
                1:{
                    1:0.5
                    2:0.5
                }
                2:{
                    1:0
                    2:1
                    3:0
                }
            }
            1:
            {
                0:{
                    1:0.333
                    2:0.666
                }
                1:{
                    1:0.333
                    2:0.666
                }
                2:{
                    1:0.333
                    2:0.333
                    3:0.333
                }
            }
        }
        '''
        self.condition_prob = {}

    def fit(self, feature, label):
        '''
        对模型进行训练,需要将各种概率分别保存在self.label_prob和self.condition_prob中
        :param feature: 训练数据集所有特征组成的ndarray
        :param label:训练数据集中所有标签组成的ndarray
        :return: 无返回
        '''

        #********* Begin *********#
        row_num=len(feature)
        col_num=len(feature[0])
        unique_label_count=len(set(label))
        for c in label:
            if c in self.label_prob:
                self.label_prob[c]+=1
            else:
                self.label_prob[c]=1
        for key in self.label_prob.keys():
            self.label_prob[key]+=1
            self.label_prob[key]/=(unique_label_count+row_num)
            self.condition_prob[key]={}
            for i in range(col_num):
                self.condition_prob[key][i]={}
                for k in np.unique(feature[:,i],axis=0):
                    self.condition_prob[key][i][k]=1
        for i in range(len(feature)):
            for j in range(len(feature[i])):
                if feature[i][j] in self.condition_prob[label[i]]:
                    self.condition_prob[label[i]][j][feature[i][j]]+=1
        
        for label_key in self.condition_prob.keys():
            for k in self.condition_prob[label_key].keys():
                total =len(self.condition_prob[label_key].keys())
                for v in self.condition_prob[label_key][k].values():
                    total+=v
                for kk in self.condition_prob[label_key][k].keys():
                    self.condition_prob[label_key][k][kk]/=total
                #********* End *********#


    def predict(self, feature):
        '''
        对数据进行预测,返回预测结果
        :param feature:测试数据集所有特征组成的ndarray
        :return:
        '''

        result = []
        # 对每条测试数据都进行预测
        for i, f in enumerate(feature):
            # 可能的类别的概率
            prob = np.zeros(len(self.label_prob.keys()))
            ii = 0
            for label, label_prob in self.label_prob.items():
                # 计算概率
                prob[ii] = label_prob
                for j in range(len(feature[0])):
                    prob[ii] *= self.condition_prob[label][j][f[j]]
                ii += 1
            # 取概率最大的类别作为结果
            result.append(list(self.label_prob.keys())[np.argmax(prob)])
        return np.array(result)
        

第5关:sklearn中的朴素贝叶斯分类器 

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfTransformer

def news_predict(train_sample, train_label, test_sample):
    '''
    训练模型并进行预测,返回预测结果
    :param train_sample:原始训练集中的新闻文本,类型为ndarray
    :param train_label:训练集中新闻文本对应的主题标签,类型为ndarray
    :param test_sample:原始测试集中的新闻文本,类型为ndarray
    :return 预测结果,类型为ndarray
    '''
    #********* Begin *********#
    vec=CountVectorizer()
    train_sample=vec.fit_transform(train_sample)
    test_sample=vec.transform(test_sample)
    
    tfidf=TfidfTransformer()

    train_sample =tfidf.fit_transform(train_sample)
    test_sample=tfidf.transform(test_sample)
    mnb=MultinomialNB(alpha=0.01)
    mnb.fit(train_sample,train_label)
    predict=mnb.predict(test_sample)
    return predict
    #********* End *********#

 文章来源地址https://www.toymoban.com/news/detail-478830.html

到了这里,关于机器学习--朴素贝叶斯分类器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习算法——贝叶斯分类器3(朴素贝叶斯分类器)

    基于贝叶斯公式来估计后验概率P(c|x)的主要困难在于:类条件概率P(x|c)是所有属性上的联合概率,难以从有限的训练样本直接估计而得。 为避开这个障碍,朴素贝叶斯分类器(Naive Bayes classfier)采用了“ 属性条件独立性假设 ”:对已知类别,假设所有属性相互独立。换句话

    2023年04月22日
    浏览(44)
  • 机器学习--朴素贝叶斯分类器

    第1关:条件概率 什么是条件概率 概率指的是某一事件 A 发生的可能性,表示为 P(A) 。而条件概率指的是某一事件 A 已经发生了条件下,另一事件 B 发生的可能性,表示为 P(B|A) ,举个例子: 今天有 25% 的可能性下雨,即 P(下雨)=0.25 ; 今天 75% 的可能性是晴天,即 P(晴天)=0.7

    2024年02月08日
    浏览(48)
  • 机器学习实验 - 朴素贝叶斯分类器

    报告内容仅供学习参考,请独立完成作业和实验喔~ 1.1 实验要求 (1)了解朴素贝叶斯与半朴素贝叶斯的区别与联系,掌握高斯分布、多项式分布和伯努利分布的朴素贝叶斯计算方法。 (2)编程实现朴素贝叶斯分类器,基于多分类数据集,使用朴素贝叶斯分类器实现多分类预

    2024年02月09日
    浏览(38)
  • 机器学习笔记07---朴素贝叶斯分类器

    贝叶斯决策论是概率框架下实施决策的基本方法。对分类任务来说,在所有相关概率都已知的理想情形下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。     贝叶斯公式:  其中,P(c)是类\\\"先验\\\"概率;P(x|c)是样本x相对于类标记c的类条件概率,或称

    2024年02月07日
    浏览(48)
  • 【机器学习】分类算法 - 朴素贝叶斯 MultinomialNB

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 md5() 可以计算字符串的 「MD5散列值」 。 语法 参数 $str :需要计算的字符串

    2024年02月14日
    浏览(32)
  • 机器学习——朴素贝叶斯算法(垃圾邮件分类)

    先验概率 :指的是 事件发生前 的预判概率,可以根据历史数据/经验估算得到。例如,当我们需要判断西瓜是不是好瓜的时候,对纹理、根蒂等特征都不了解,只是平常我们买西瓜的时候买到好瓜的概率是70%,那么这个西瓜是好瓜的概率我们也可以认为是70%。这个概率70%就是

    2024年02月03日
    浏览(45)
  • 机器学习——基于朴素贝叶斯分类算法实现垃圾邮件分类

    贝叶斯定理: 贝叶斯理论指的是,根据一个已发生事件的概率,计算另一个事件的发生概率。贝叶斯理论从数学上的表示可以写成这样:  ,在这里A和B都是事件, P(B)P(B)不为0。 在贝叶斯定理中: 1. P(A) 称为”先验概率”,即在B事件发生之前,我们对A事件概率的一个判断。如

    2024年02月04日
    浏览(43)
  • 机器学习-基于朴素贝叶斯的垃圾邮件分类

    概率论是许多机器学习算法的基础,此篇博客会给出一些使用概率论进行分类的方法。 首先从一个最简单的概率分类器开始,然后给出一些假设来学习朴素贝叶斯分类器。我们称之为“朴素”,是因为整个形式化过程只做最原始、最简单的假设。 我们还将构建另一个分类器

    2024年02月02日
    浏览(35)
  • 《机器学习核心算法》分类算法 - 朴素贝叶斯 MultinomialNB

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 小白零基础《Python入门到精通》 朴素贝叶斯法(Naive Bayes model 简称 NBM )是基于 「贝叶斯定理」 与 「特征条件独立假设」 的分类方法。 「贝

    2024年02月08日
    浏览(43)
  • 机器学习:基于朴素贝叶斯(Naive Bayes)的分类预测

    目录 一、简介和环境准备 简介: 环境: 二、实战演练 2.1使用葡萄(Wine)数据集,进行贝叶斯分类 1.数据导入 2.模型训练 3.模型预测 2.2模拟离散数据集–贝叶斯分类 1.数据导入、分析 2.模型训练、预测  三、原理解析 朴素贝叶斯算法 优缺点: 朴素贝叶斯(Naive Bayes, NB) 是

    2023年04月19日
    浏览(80)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包