超简单白话文机器学习-朴素贝叶斯算法(含算法讲解,公式全解,手写代码实现,调包实现

news2024/11/23 5:11:05

1. 朴素贝叶斯算法

朴素贝叶斯(Naive Bayes)算法是一类基于贝叶斯定理的简单而强大的概率分类器,它在假设特征之间相互独立的前提下工作。尽管这种“朴素”的假设在现实中很少成立,但朴素贝叶斯分类器在许多实际应用中表现良好,特别是在文本分类和自然语言处理领域。下面是对朴素贝叶斯算法的详细介绍,包括其原理、优点、局限性和应用场景。

1.1 贝叶斯公式

这是一个简单的贝叶斯公式,看不懂?让我们转换为中文:

-P(类别|特征)是给定特征,类别的后验概率

-P(特征|类别) 是给定类别后,条件概率

-P(类别) 是类别的先验概率

-P(特征) 是特征的边缘概率

贝叶斯公式最基本的假设是条件之间相互独立,每个条件的变更不会影响其他条件的概率。

让我们来细讲一下:

P(类别)先验概率表示类别在样本集中出现频率,比如垃圾邮件占比60%,正常邮件占比40%

条件概率表示在某个类别下特征出现的频率,计算方法为在给定的类别样本中,某个特征出现频率,例如垃圾邮件共有20封,“免费”这个词在其中出现了2次,那么条件概率为2/20 = 1/10

那么组合一下,根据公式我们可以得到每个类别的后验概率,意义就是这些特征出现,那么特征为A&B的概率是多少。

朴素贝叶斯分类就是比较后验概率的大小,如果这个类别的概率比另一个大,那么我们认定其属于概率较大的类。

根据公式我们可以得知:

计算P(特征)可以抵消,实际上我们是在比较分子大小,那么计算分子大小就是算法的关键所在。

1.2 平滑处理

实际应用中,可能出现训练数据中某些特征在某个类别下从来没有出现,将会导致计算概率为0。为了解决这个问题,我们常使用拉普拉斯平滑:

1.3 步骤分解

1. 计算先验概率  P(C) :

   先验概率表示每个类别在训练数据中出现的频率。例如,如果我们有两类邮件,垃圾邮件和正常邮件,它们各自的比例是 30% 和 70%,那么P({垃圾邮件}) = 0.3 ,P({正常邮件}) = 0.7。

2. 计算条件概率P(x_i|C) :

   条件概率表示在某个类别下特征出现的频率。例如,在垃圾邮件中,“免费”这个词出现的频率可能是 20%,而在正常邮件中可能是 1%。这些频率可以通过统计训练数据中的词频来计算。

3. 组合概率:

   将先验概率和条件概率组合在一起,计算每个类别的后验概率。然后选择后验概率最大的类别作为预测结果。

1.4 举个例子

场景:垃圾邮件分类

步骤1: 计算先验概率

P(垃圾邮件) = 3/5

P(正常邮件) = 2/5

步骤2: 计算条件概率:(这里用到拉普拉斯平滑)

垃圾邮件下的条件概率:

P(免费|垃圾邮件)= (2+1)/(9+5)= 3/14

P(中奖|垃圾邮件)= (1+1)/(9+5)= 2/14

P(点击|垃圾邮件)=(3+1)/(9+5)= 4/14

P(优惠|垃圾邮件)=(2+1)/(9+5)= 3/14

同理得到正常邮件的条件概率

步骤3:分类新邮件:

假设有一封新邮件,内容为“免费,点击,会议”,判断是属于什么类别的邮件

属于概率较大的一类

2. 手写代码实现

def loadData():
    postList = [['my','dog','has','flea','problems','help','please'],
               ['maybe','not','take','him','to','dog','park','stupid'],
               ['my','dalmation','is','so','cute','I','love','him'],
               ['stop','posting','stupid','worthless','garbage'],
               ['mr','licks','ate','my','steak','how','to','stop','him'],
               ['quit','buying','worthless','dog','food','stupid']]
    classVec = [0,1,0,1,0,1]
    return postList,classVec

首先自定义一个数据集

def createVocabList(dataset): #包含在文档中不出现重复的词 相当于关键词集合
    vocabSet = set([])
    for document in dataset:
        vocabSet = vocabSet | set(document) #求并集
    return list(vocabSet)

设置一个关键词字典

def setOfwords(vocabList,inputSet):
    returnVec = [0]*len(vocabList) #创建与词汇表等长的零向量
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] = 1 #word在关键词集合中的位置,在returnVec中同样的位置设定为1
        
    return returnVec

判断数据集中是否出现了我们所设置的关键词

def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    p0Num = np.ones(numWords)
    p1Num = np.ones(numWords)
    p0Denom = 2.0;p1Denom=2.0
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = np.log(p1Num/p1Denom)
    p0Vect = np.log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive

计算出先验概率以及条件概率

#朴素贝叶斯分类函数
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
    p1 = sum(vec2Classify * p1Vec) + np.log(pClass1) #前部分为频率*概率
    p0 = sum(vec2Classify * p0Vec) + np.log(1-pClass1)
    if p1 > p0:
        return 1
    else:
        return 0

最后判断比较每个类别的后验概率,得到分类结果。

3. 调包实现

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score

# 加载数据集
iris = load_iris()
X = iris.data
y = iris.target

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 初始化朴素贝叶斯分类器
nb_classifier = GaussianNB()

# 在训练集上训练分类器
nb_classifier.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = nb_classifier.predict(X_test)

# 计算分类器的准确率
accuracy = accuracy_score(y_test, y_pred)
print("朴素贝叶斯分类器的准确率为: {:.2f}".format(accuracy))

4. 算法优点与局限性

4.1 优点

1. 简单易实现:朴素贝叶斯算法实现起来非常简单,计算复杂度低,适合大规模数据的处理。

2. 训练速度快:由于朴素贝叶斯只需要计算先验概率和条件概率,训练速度非常快。

3. 对小数据集有效:在数据量较小的情况下,朴素贝叶斯分类器仍能提供较好的性能。

4. 适用于多类分类:朴素贝叶斯天然支持多类分类问题,而无需进行复杂的调整。

5. 处理缺失数据:朴素贝叶斯能够在一定程度上处理缺失数据。

4.2 局限性

1. 特征独立性假设:朴素贝叶斯假设特征之间是相互独立的,这在现实中很少成立。特征之间的相关性可能会影响分类器的性能。

2. 概率估计不准确:朴素贝叶斯分类器的概率输出不一定准确,尤其在特征独立性假设不成立时。

3. 对零概率敏感:如果训练数据中某类特征组合从未出现过,条件概率会被估计为零,导致最终概率也为零。这通常通过平滑技术(如拉普拉斯平滑)来解决。

4. 数据量要求:尽管在小数据集上表现良好,但如果数据量过小,分类器可能会受到训练数据分布的极大影响。

5. 应用前景

1. 文本分类:

   - 垃圾邮件过滤:通过分析电子邮件中的词频来判断邮件是否为垃圾邮件。

   - 情感分析:根据文本中的词语分布来判断文本的情感倾向(如积极、消极)。

   - 主题分类:将文档自动分类到不同的主题类别中。

2. 文档分类:

   - 新闻分类:根据新闻文章的内容自动将其归类到不同的新闻类别。

   - 电影评论分类:根据用户评论内容,判断其对电影的评价(如好评、中评、差评)。

3. 医疗诊断:

   - 疾病预测:根据病人的症状和体征,预测其可能患有的疾病。

4. 推荐系统:

   - 产品推荐:根据用户的历史行为和偏好,推荐可能感兴趣的产品。

5. 图像处理:

   - 图像分类:根据图像的像素值或特征进行分类。

6. 参考资料

机器学习(五)——朴素贝叶斯-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1686325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

灌区信息化管理系统助力灌区节水,打造绿色生态新农业

在现代化农业发展的浪潮中,如何实现节水、高效、绿色的农业生产成为了人们关注的焦点。智慧灌区信息化系统应运而生,以其独特的技术优势,助力灌区节水,打造绿色生态新农业,引领农业生产的未来。 灌区信息化管理系统&am…

高中数学:平面向量-题型总结及解题思路梳理

一、知识点及解题思路梳理 高中,2/3的向量题目是坐标向量题,1/3是几何向量题。但是,这1/3的几何向量题可以转换成坐标向量题。 二、练习 例题1 几何型向量题 例题2

LabVIEW波纹补偿器无线监测系统

LabVIEW波纹补偿器无线监测系统 在石油化工、冶金及电力等行业中,波纹补偿器作为一种重要的补偿性元件,其安全稳定的运行对管道输送系统的可靠性至关重要。开发了一种基于LabVIEW的波纹补偿器无线监测系统,通过实时监测波纹补偿器的工作状态…

Kubernetes的灵魂核心:kube-scheduler

Kubernetes(简称K8s)是一个开源的容器编排系统,用于自动化容器化应用程序的部署、扩展和管理。在Kubernetes集群中,kube-scheduler是一个至关重要的组件,它负责将Pod(Kubernetes中的最小部署单元&#xff0…

Dom树和渲染树的细微差别,你能分清吗?

DOM树和渲染树都是浏览器渲染页面时生成的树形结构,但它们有一些区别。 1. DOM树: DOM树是由HTML解析器解析HTML文档生成的,它是文档的结构化表示,包含了HTML文档中的所有元素节点、文本节点、注释节点等,它是一个包…

“AI+综合节能改造”:打造数据中心热管理系统节能“秘籍”

维谛技术服务: 欧小明 曲鑫 当前,基于AI技术在确保精准制冷、实现节能和提升运营效率方面的重要作用,将AI技术与热管理系统改造相结合,实现深度协同,是数据中心节能改造的关键路径之一。 “AI综合节能改造”提升热管…

从ES5迈向ES6:探索 JavaScript 新增声明命令与解构赋值的魅力

个人主页:学习前端的小z 个人专栏:JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! ES5、ES6介绍 文章目录 💯声明命令 let、const🍟1 let声明符&a…

51单片机入门:红外遥控

红外遥控系统简介 红外遥控系统是利用红外光进行通信的设备,通常由发射和接收两大部分组成,即:由红外LED将调制后的信号发出,再由专门的红外接收头进行解调输出。 红外LED:外表与普通的LED没有什么不同,发…

解锁合同管理的新路径:低代码与定制开发的完美结合

引言 合同管理在企业中扮演着至关重要的角色。无论是与供应商、客户还是合作伙伴之间的合作,合同都是约束双方责任和权利的关键文档。然而,随着业务的不断增长和全球化的发展,合同管理变得越来越复杂。传统的合同管理方法往往面临着诸多挑战&…

Web安全:SQL注入之时间盲注原理+步骤+实战操作

「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等…

深入 Rust 标准库,Rust标准库源代码系统分析

系列文章目录 送书第一期 《用户画像:平台构建与业务实践》 送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》 送书第二期 《Spring Cloud Alibaba核心技术与实战案例》 送书第三期 《深入浅出Java虚拟机》 送书第四期 《AI时代项目经理成长之道》 …

彩信JSON接口对接发送

随着通讯技术的飞速发展,传统的短信已经无法满足人们日益增长的沟通需求。在这样的背景下,群发彩信作为一种更为先进、更为丰富的信息传递方式,逐渐受到了企业和个人的青睐。那么,群发彩信应该怎么对接,又具体有哪些优…

开发短剧平台的7大关键步骤,轻松掌握

短剧平台的开发是当前数字娱乐领域的热门话题之一。随着在线视频消费的增长和用户对短视频内容的需求不断增加,开发一个成功的短剧平台成为了许多创业者和企业关注的焦点。在本文中,我将分享开发短剧平台的7大关键步骤,帮助您轻松掌握这一过程…

文件外发审核是数据防泄漏的重要手段,那该怎么落地?

企业在日常经营中,无可避免地会产生文件外发的需求,文件发送对象包括但不限于合作方、供应商、客户、公关媒体、慈善组织等等,不一而足。而由于外发的对象不同,所涉及的文件类型也多种多样: 商业合作合同:…

react实现把pc网站快捷添加到桌面快捷方式

文章目录 1. 需求2. 实现效果3. 核心逻辑4. 完整react代码 1. 需求 这种需求其实在国外一些游戏网站和推广网站中经常会用到,目的是为了让客户 快捷方便的保存网站到桌面 ,网站主动尽量避免下次找不到网站地址了,当然精确的客户自己也可以使…

【B站 heima】小兔鲜Vue3 项目学习笔记Day04

文章目录 二级分类1.整体认识和路由配置2.面包屑导航功能实现3. 基础商品列表实现4. 定制路由滚动行为 详情页1.整体认识和路由配置2.基础数据渲染3.热榜区域实现4. 图片预览组件封装5.放大镜-滑块跟随移动左侧滑块跟随鼠标移动放大镜-大图效果 6. props适配7. SKU组件熟悉使用…

【Git】Git学习-12:关联本地仓库和远程仓库

学习视频链接:【GeekHour】一小时Git教程_哔哩哔哩_bilibili​编辑https://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780 在github上建立仓库 根据指引将本地仓库push到github上 git remote add origin gitgithub.com:JVZO/f…

【STL专题】深入探索C++之std::string:不止于字符串【万字详解】

欢迎来到CILMY23的博客 🏆本篇主题为:深入探索C之std::string:不止于字符串 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux &#x1f3…

一阶数字高通滤波器

本文的主要内容包含一阶高通滤波器公式的推导和数字算法的实现以及编程和仿真 1 计算公式推导 1.1.2 算法实现及仿真 利用python实现的代码如下: import numpy as np # from scipy.signal import butter, lfilter, freqz import matplotlib.pyplot as plt #2pifW…

网站工作原理

web发展史 1.0时代不可修改 2.0可修改,比如发微博 有以下问题: 课程2: 静态页面 html 动态页面 php 经过服务端的语言解释器,解析成html文件,剩下的就和静态流程一样 后面三个是web服务器,语言解释器&…