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

场景

朴素贝叶斯分类器是一种基于贝叶斯定理的简单概率分类器,广泛应用于各种机器学习场景。朴素贝叶斯分类器利用贝叶斯定理来预测一个数据点的类别。贝叶斯定理提供了一种计算条件概率的方法,即在已知某些信息的情况下,事件发生的概率。“朴素”一词源于该算法对特征之间相互独立的假设。在现实世界中,这种假设可能并不总是成立,但朴素贝叶斯在实践中仍然表现良好。对于给定的训练数据集,算法首先基于类别计算特征的概率分布。然后,使用这些概率来预测新数据点的类别。

适用场景和用途

·文本分类:例如垃圾邮件识别、新闻文章分类。朴素贝叶斯特别适用于处理文本数据,因为它能够处理大量的特征(如单词)。

·情感分析:在社交媒体分析、产品评论等领域中识别正面或负面情感。

·推荐系统:基于用户的兴趣和偏好预测用户可能喜欢的产品或服务。

·医疗诊断:基于症状预测疾病。

·天气预测:例如根据历史天气数据预测下雨概率。

案例

假设我们有两个类别:0 和 1。类别 0 可以代表“负面评论”,类别 1 可以代表“正面评论”。
准备数据集:

# 示例数据集
data = ["This product is great","I am very happy with this purchase","Terrible, I hate it","Worst experience ever","I love this product","Not what I expected","Highly recommended","Very disappointed","Will buy it again","Do not recommend"
]# 对应的类别标签
labels = [1, 1, 0, 0, 1, 0, 1, 0, 1, 0]

这里我们通过两种方式,第一种是python提供好的一个API,第二个我们自己根据公式来写一个简单的分类器,比对一下效果。

API


def python_test(data,labels,vectorizer):# 将数据集转化为向量X = vectorizer.fit_transform(data)# 划分数据集和训练集X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.2, random_state=42)# 创建并训练朴素贝叶斯模型model = MultinomialNB()model.fit(X_train, y_train)return modelif __name__ == '__main__':vectorizer = CountVectorizer()data,labels = loadData()model =  python_test(data,labels,vectorizer)test_data = ["Really happy with this product", "It was a bad purchase"]test_X = vectorizer.transform(test_data)predictions = model.predict(test_X)print(predictions)

结果是[0,1]
在这里我们可以看到是把数据先转成向量,然后划分数据集和训练集,然后训练这些数据,最后给出结果,就其原理,实际上是,将词拆开之后,对每一个词计算概率,然后对给出的这个词,看看它的概率是好评大,还是差评大。我们可以写一下这个过程。

算法

加载数据集
# 加载数据集
def loadDataSet():postingList = [['you', 'are', 'a', 'pig'],['you', 'are', 'a', 'smart', 'boy']]classVec = [1, 0]  # 1代表侮辱性文档,0代表非侮辱性文档return postingList, classVec

这里我们有两个数据集,1代表侮辱性文档,0代表非侮辱性的文档。

创建词汇表
def createVocabList(dataSet):vocabSet = set([])  for document in dataSet:vocabSet = vocabSet | set(document)  return list(vocabSet)

这里我们创建了词汇表 将所有的单词都放入这个词汇表中去了

将文档转换为词向量
def setOfWords2Vec(vocabList, inputSet):returnVec = [0] * len(vocabList)for word in inputSet:if word in vocabList:returnVec[vocabList.index(word)] = 1else:print("the word: %s is not in my Vocabulary!" % word)return returnVec

这里很简单,就是拿到这个语句在词汇表中的索引集,非常简单

训练朴素贝叶斯分类器
def trainNB0(trainMatrix, trainCategory):numTrainDocs = len(trainMatrix)numWords = len(trainMatrix[0])pAbusive = sum(trainCategory) / float(numTrainDocs)p0Num = ones(numWords)p1Num = ones(numWords)p0Denom = 2.0p1Denom = 2.0for i in range(numTrainDocs):if trainCategory[i] == 1:p1Num += trainMatrix[i]p1Denom += sum(trainMatrix[i])else:p0Num += trainMatrix[i]p0Denom += sum(trainMatrix[i])p1Vect = log(p1Num / p1Denom)p0Vect = log(p0Num / p0Denom)return p0Vect, p1Vect, pAbusive

这里事实上就是计算 好坏文档的概率,然后再计算 每一个词在好文档,坏文档中出现的概率

对新文档进行分类

传入一个新文档,对文档进行分类。

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):p1 = sum(vec2Classify * p1Vec) + log(pClass1)p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)return 1 if p1 > p0 else 0

其实就是比较概率谁大而已

测试
if __name__ == '__main__':# 加载数据 postingList是总文档,classVec是类别表示是否是侮辱性文档postingList, classVec = loadDataSet()# 简历独立的词汇表print(postingList)print(classVec)list = createVocabList(postingList)print(list)trainMatrix= []for posting in postingList:trainMatrix.append(setOfWords2Vec(list,posting))print(trainMatrix)p0Vect,p1Vect,pAbusive = trainNB0(trainMatrix,classVec)print(p0Vect)testEntry = ['FUCK','LOVE']thisDoc = array(setOfWords2Vec(list, testEntry))result = classifyNB(thisDoc, p0Vect, p1Vect, pAbusive)print(result)

结束

朴素贝叶斯分类器基本使用和原理结束

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

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

相关文章

【转载】MyBatisCodeHelperPro最新版使用教程

在开发中编写生成bean,mapper,mapper.xml费时也费力,可以通过MyBatisCodeHelper-Pro自动生成bean,dao,mapper.xml等文件。 MyBatisCodeHelper-Pro是IDEA下的一个插件,类似于mybatis plugin,但可…

Docker0网络设置

Docker网络 当部署运行Docker后,Docker在启动时会默认创建三个网络 bridge: 默认网络驱动程序。当不指定网络驱动运行容器时,默认会使用该网络。host: 直接访问宿主机网络,取消容器和宿主机的网络隔离 host网络模式可以直接使用宿主机网络&…

书生·浦语大模型实战营第四节课笔记及作业

XTuner 大模型单卡低成本微调实战 1 Finetune简介 大语言模型LLM是在海量的文本内容基础上,以无监督或半监督方式进行训练的。海量的文本内容赋予了大模型各种各样的行业知识。但是如果直接把大模型的知识用于生产实践,会发现回答不大满意。微调的目的…

2、NumPy ndarray:多维数组对象基础

目录 1. ndarray 对象简介 2. 创建 ndarray 从现有数据创建 使用内置函数创建 使用范围和间隔创建数组 使用随机函数创建数组 3. 数组属性和数据类型 常用属性 数据类型转换 1. ndarray 对象简介 NumPy 的 ndarray 是一个多维数组对象,它支持快速的、向量化…

adb wifi 远程调试 安卓手机 命令

使用adb wifi 模式调试需要满足以下前提条件: 手机 和 PC 需要在同一局域网下。手机需要开启开发者模式,然后打开 USB 调试模式。 具体操作步骤如下: 将安卓手机通过 USB 线连接到 PC。(连接的时候,会弹出请求&#x…

零花钱也能设计精美网页!推荐几个免费设计素材站点!

UI设计师最怕什么? 没有创意,没有灵感,没有思路! 在哪里可以得到idea?别担心,往下看! 你知道网络有多大,你想要什么吗?今天,我想和大家分享一些宝藏网页设…

解决flask中jinja2插值变量变成字符串的办法

今天在通过使用{{ variable_name }}这种方式插入html内容时,发现变量内容到了页面中全部变成了字符串, python代码: return render_template(FilePath.file_path_to_page,md_contenthtml_content # 返回html内容 )html代码中插入&#xff1…

【IAP】FreeRTOS多线程环境下调用NVIC_SystemReset()系统复位函数出现问题

衔接 上篇 调好写入Flash失败后,又出现新问题: 由BOOT跳APP再跳APP,在升级接受升级文件过程中,突然出现系统复位,而且出现位置和时间都是随机的。 定位问题 尝试改RTOS空间大小 本以为是FreeRTOS空间给小了,尝试加大还…

最简单爱心的解析

首先你需要了解爱心代码在直角坐标系的方程 数学知识&#xff1a;x 属于 -1.5 ~ 1.5 y 属于 -1 ~ 1.5 和 高中所学的线性规划 请看代码 #include <math.h> #include <stdlib.h> #include <Windows.h> #include <stdio.h> int main() { …

MySQL中varchar(100)和Oracle 中varchar2(100)

MySQL中的VARCHAR(100)和Oracle中的VARCHAR2(100)虽然在概念上相似&#xff0c;但是在细节上存在差异&#xff0c;这些差异体现在存储方式、性能优化、字符集处理等方面。 MySQL中VARCHAR(100)和Oracle中的VARCHAR2(100) MySQL中的VARCHAR(100) 在MySQL中&#xff0c;VARCH…

【REST2SQL】10 REST2SQL操作指南

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 【RE…

谭浩强C语言程序设计习题-循环结构程序设计

最大公约数与最小公倍数 //辗转相除法求公约公倍 #include <stdio.h>int gcd(int a, int b) {return (a % b 0) ? b : gcd(b, a % b); }int main() {int m, n;scanf("%d %d", &m, &n); int ans gcd(m, n);printf("%d %d\n", ans, m * n…

ESP系列入门教程(四)——之MQTT通信实现设备反控【分别附上 ESP32 + ESP8266 的具体代码】

ESP系列入门教程<四> 概要技术名词简介● ESP系列简介● MQTT简介 硬件连接实现&#xff08;同教程2&#xff0c;没有变化&#xff09;代码实现●Demo&#xff1a;通过MQTT进行开关灯反控○ ESP8266代码○ ESP32代码 特别鸣谢 概要 最近在跟着几个大佬的教学视频做项目。…

02--数据定义语言DDL

1、数据定义语言DDL 1.1 操作数据库-DDL 创建数据库 create database 数据库名称; 创建数据库&#xff0c;并指定字符集 create database 数据库名称 character set 字符集名; 查询所有数据库的名称 show databases; 查询某个数据库的字符集:查询某个数据库的创建语句及字…

Raft算法

内容出自 : https://www.bilibili.com/video/BV1eL411578r/?spm_id_from333.337.search-card.all.click raft具备良好的容错能力&#xff0c;能够在系统出现复杂的故障时依旧能够保证数据的一致性 能够继续对外提供服务 在raft协议中&#xff0c;分布式系统的每个节点有三个…

Qemu 之安装(源码安装)

Qemu 之安装 Qemu 有两种安装方式&#xff1a; apt 下载二进制文件&#xff0c;可以直接用&#xff0c;但是换版本、卸载等比较麻烦源码编译安装&#xff0c;需要一定的配置&#xff0c;但是自由度比较高 这里主要介绍源码编译安装的方式&#xff1a; 0、安装依赖 这部分参…

AboutAndroid 多语种适配框架,兼容高版本,适配第三方库语种

语种切换框架 项目地址&#xff1a;Github 可以扫码下载 Demo 进行演示或者测试&#xff0c;如果扫码下载不了的&#xff0c;点击此处可直接下载 集成步骤 如果你的项目 Gradle 配置是在 7.0 以下&#xff0c;需要在 build.gradle 文件中加入 allprojects {repositories {…

微服务介绍

背景 微服务是什么?杜克大学教授DanAriely说过一段非常出名的话&#xff0c;用来表述Big Data的发展现状。我觉得把这句话放到微服务身上也极其贴切。 Micro-services is like teenage sex: Everyone talks about it, nobody really knows how to do it, everyo ne thinks ev…

excel(vab)删除空行

删除第一、二、三列位空的所有行&#xff08;8000)行范围以内 代码如下&#xff1a; Sub Macro1()Dim hang As Integer For hang 8000 To 1 Step -1If Sheet1.Cells(hang, 1) "" And Sheet1.Cells(hang, 2) "" And Sheet1.Cells(hang, 3) "&quo…

系统性学习vue-vue中的ajax

vue中的ajax 配置代理常用发送Ajax请求方式跨域方式一方式二 vue-resource插槽默认插槽具名插槽作用域插槽 配置代理 常用发送Ajax请求方式 xhr new XMLHttpRequest() 在真正开发中不常用&#xff0c;比较麻烦jQuery 封装了xhraxios 封装了xhr 与jQuery相比优势是&#xff1a…