朴素贝叶斯算法分类

def loadDataSet():
    postingList=[['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]#类别标签向量,1代表侮辱性词汇,0代表不是
    return postingList,classVec
# 函数说明:将切分的实验样本词条整理成不重复的词条列表,也就是词汇表
def createVocabList(dataSet):
    vocabSet = set([])                      #创建一个空的不重复列表
    for document in dataSet:
        vocabSet = vocabSet | set(document) #取并集
    return list(vocabSet)

 if __name__ == '__main__':
    postingList, classVec = loadDataSet()
    myVocabList = createVocabList(postingList)
   
print('myVocabList:\n', myVocabList)
myVocabList:
 ['is', 'problems', 'has', 'so', 'ate', 'licks', 'him', 'help', 'steak', 'cute', 'worthless', 'food', 'flea', 'stop', 'how', 'park', 'quit', 'buying', 'garbage', 'mr', 'to', 'I', 'please', 'not', 'take', 'stupid', 'posting', 'maybe', 'dalmation', 'love', 'my', 'dog']
	# 函数说明:根据vocabList词汇表,将inputSet向量化,向量的每个元素为1或0
def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0] * len(vocabList)    #创建一个其中所含元素都为0的向量
    for word in inputSet:              #遍历每个词条
        if word in vocabList:         #如果词条存在于词汇表中,则置1
            returnVec[vocabList.index(word)] = 1
        else: print("the word: %s is not in my Vocabulary!" % word)
    return returnVec                 #返回文档向量

    trainMat = []
    #遍历每一个词向量来填充trainMat列表
    for postinDoc in postingList:
        trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
    # print(trainMat)

在这里插入图片描述

我们先使用极大似然估计计算条件概率和先验概率

import numpy as np

p0V, p1V, pAb = trainNB0(trainMat, classVec)

# 先验概率
def trainNB0(trainMatrix, trainCategory):
    numTrainDocs = len(trainMatrix) # 文件数,也就是行向量的个数
    numWords = len(trainMatrix[0]) # 单词数,也就是词汇表中单词的个数
    
    # 先验概率 👇
    pAbusive = sum(trainCategory) / float(numTrainDocs) 
    # 侮辱性文件的出现概率,即 trainCategory 中所有 1 的个数(0 1 相加即得 1 的个数)
    
    
    # 条件概率 👇
    
    # (非)侮辱性单词在每个文件中出现的次数列表
    # 比如说 p0Num = [1,3,12,....] 表示第 2 个文档中出现了 3 次非侮辱词汇
    p0Num = np.zeros(numWords) # [0,0,0,.....] 非侮辱性单词在每个文件中出现的次数列表
    p1Num = np.zeros(numWords) # [0,0,0,.....] 侮辱性单词出在每个文件中出现的次数列表
    
    # (非)侮辱性单词在(非)侮辱性文档出现的总数
    p0Denom = 0.0 # 0 非侮辱性词汇在所有非侮辱的文档的出现总数
    p1Denom = 0.0 # 1 侮辱性词汇在所有侮辱性的文档的出现总数
    
    #遍历每个文件
    for i in range(numTrainDocs):
        # 是否是侮辱性文件
        if trainCategory[i] == 1:
            # 如果是侮辱性文件,对侮辱性文件的向量进行相加
            #表示在所有侮辱性文件中,去重词汇表中各个词汇出现的次数
            p1Num +=  trainMatrix[i]
            # 对向量中的所有元素进行求和
            #表示在所有侮辱性文件中,去重词汇表中所有词汇出现的次数之和
            p1Denom += sum(trainMatrix[i])
        else:
            # 如果是非侮辱性文件,对非侮辱性文件的向量进行相加,表示在所有非侮辱性文件中,去重词汇表中各个词汇出现的次数
            p0Num += trainMatrix[i]
            # 对向量中的所有元素进行求和,表示在所有非侮辱性文件中去重词汇表中所有词汇出现的次数之和
            p0Denom += sum(trainMatrix[i])
            
    # 在类别 1 即侮辱性文档的条件下,去重词汇表中每个单词出现的概率
    p1Vect = p1Num / p1Denom
    
    # 在类别 0 即非侮辱性文档的条件下,去重词汇表中每个单词出现的概率
    p0Vect = p0Num / p0Denom
    
    return pAbusive, p0Vect, p1Vect

但是我们输出结果后会发现基于极大似然估计得朴素贝叶斯算法的结果差强人意,如果其中一个类别的概率值为0,那么最后的乘积也为0,我们可以贝叶斯估计优化算法,在条件概率计算的公式的分子分母上分别加上 λ 和 S j λ \lambda和S_j\lambda λSjλ S j S_j Sj代表分类的个数,此样例中为2,即侮辱与非侮辱类。
也就是将条件概率和先验概率的分子初始化为1,分母初始化为2.

# (非)侮辱性单词在每个文件中出现的次数列表
# 比如说 p0Num = [1,3,12,....] 表示第 2 个文档中出现了 3 次非侮辱词汇
p0Num = np.ones(numWords) # [1,1,1,.....] 非侮辱性单词在每个文件中出现的次数列表
p1Num = np.ones(numWords) # [1,1,1,.....] 侮辱性单词出在每个文件中出现的次数列表

# (非)侮辱性单词在(非)侮辱性文档出现的总数
p0Denom = 2.0 # 0 非侮辱性词汇在所有非侮辱的文档的出现总数
p1Denom = 2.0 # 1 侮辱性词汇在所有侮辱性的文档的出现总数

但是此时如果我们直接输出的话会出现下溢出问题,是由于太多个小数相乘造成的,在python的精度下,太多小数相乘会四舍五入为0,会影响得到正确的答案。一种解决方法是对乘积取自然对数,所以我们可以修改以下代码

	p1Vect = np.log(p1Num / p1Denom)
	p0Vect = np.log(p0Num / p0Denom)

    p0V, p1V, pAb = trainNB0(trainMat, classVec)
    print('p0V:\n', p0V)
    print('p1V:\n', p1V)
    print('classVec:\n', classVec)
    print('pAb:\n', pAb)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发六(自定义组件)

自定义组件的创建: 如何创建: 右键选择新建component 创建完成之后需要打开app.json,这是全局使用这个组件,想要单独的页面使用,就在当前页面的json文件中定义 "usingComponents": {"my-zj": &quo…

为什么光电测径仪质量更稳定可靠?

光电测径仪与激光扫描式测径仪都是目前常用的外径自动化测量设备,他们能实现的功能相同,但为什么说光电测径仪更稳定可靠,下面一起来看一下。 光电测径仪测量原理 测头部件是测径仪的核心部件,它的作用是将被测物在CCD芯片上清晰…

【Git教程】(十七)发行版交付 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 发行版交付 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 预备阶段:创建 stable 分支3.2 预备并创建发行版3.3 创建补丁 4️⃣ 替代解决方案 对于每个项目或产品来说,发布版本的创建都需要一定的时间,其具体过程因各公司或组…

HarmonyOS开发案例:【闹钟】

介绍 使用后台代理提醒,实现一个简易闹钟。要求完成以下功能: 展示指针表盘或数字时间。添加、修改和删除闹钟。展示闹钟列表,并可打开和关闭单个闹钟。闹钟到设定的时间后弹出提醒。将闹钟的定时数据保存到轻量级数据库。 相关概念 [Canva…

翻译《The Old New Thing》 - Why are HANDLE return values so inconsistent?

Why are HANDLE return values so inconsistent? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20040302-00/?p40443 Raymond Chen 2004年01月27日 简介 在处理 Windows 编程中的句柄时,开发者需要面对的一个挑战是不同函数可…

时间步长问题。tensorflow训练lstm时序模型,输出层实际输出维度和期待维度不一致

设置输出维度为1. Dense(1) 但结果跑出来的输出维度每次都是三维的。 模型设置: 输入x维度(2250,48,2) 输入y 维度(2250,) 和 (2250,1) 但模型预测…

盲人咖啡厅导航:科技之光点亮独立生活新里程

在这个繁华的世界中,咖啡厅不仅是人们社交聚会、休闲阅读的场所,更是无数人心灵栖息的一方天地。然而,对于视障群体而言,独自前往这样的公共场所往往面临重重挑战。幸运的是,一款名为蝙蝠避障专为盲人设计的辅助应用&a…

Day 5 广告管理

Day 5 广告管理 这里会总结构建项目过程中遇到的问题,主要流程,以及一些个人思考!! 学习方法: 1 github源码 文档 官网 2 内容复现 ,实际操作 项目源码同步更新到github 欢迎大家star~ 后期会更新并上传前端项目 创建…

光速记单词-brother开头的单词

1. 思维导图 1.1 brother 1.2 mom 1.3 dad 1.4 man 2. 视频链接

13. Spring AOP(一)思想及使用

1. 什么是Spring AOP AOP的全称是Aspect Oriented Programming,也就是面向切面编程,是一种思想。它是针对OOP(面向对象编程)的一种补充,是对某一类事情的集中处理。比如一个博客网站的登陆验证功能,在用户进行新增、编辑、删除博…

js手写call、bind、apply

目录 call与applyapply bind call和apply和bind有两种实现方式,第一种是隐式绑定,第二种是通过new 无论是通过隐式绑定实现还是通过new实现,核心都是针对this的绑定规则 具体关于this的绑定规则可以看我这一篇博客 this绑定规则 call与apply…

【热议】硕士和读博士洗碗区别的两大理论

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…

【软件测试基础】概述篇(持续更新中)

《 软件测试基础持续更新中》 这一章,是每一名软件测试工程师必须要掌握的常识! 1、软件测试的目的:提高软件质量 和 确保软件满足用户需求。 2、软件测试的概念:使用人工或自动手段来运行或测试某个系统的过程,目的…

品牌差异化战略:Kompas.ai如何打造独特的内容声音

在当今竞争激烈的商业环境中,品牌差异化已成为企业获取市场优势的关键策略。一个鲜明的品牌形象和独特的内容声音不仅能够帮助企业吸引目标客户,还能够在消费者心中建立起独特的地位。本文将深入探讨品牌差异化的重要性,分析Kompas.ai如何帮助…

SL3037内置MOS管 耐压60V降压恒压芯片 降12V或降24V 电路简单

SL3037B是一款内置功率MOSFET的单片降压型开关模式转换器,具有以下特点: 1. 高效率:采用开关式降压技术,仅在需要调节输出电压时才会消耗能量,从而提高了整体的效率。 2. 稳定性好:通过精确的内部电路设计…

数睿通2.0版本升级:探索数据血缘的奥秘

引言 数睿通 2.0 迎来了 4 月份的更新,该版本更新了许多用户期望的数据血缘模块,把原来外链跳转 neo4j 页面改为自研页面,方便后期的二次开发完善,此外,新版本摒弃了 neo4j 的血缘数据存储方案,一来是因为…

接口压力测试 jmeter--进阶篇(三)

一、数据实时监控JMeterGrafanaInfluxdb (mac)性能监控平台搭建JMeterGrafanaInfluxdb 优点: 1.实时 2.美观 3.能够存储和对比 原理: 1.运行jmeter时会吧数据写入到influxdb 2.influxdb实时存储执行的结果 3.grafana链接.influxd…

基于 Flexbox 的纯 CSS 框架:兼容性好、文档丰富 | 开源日报 No.232

jgthms/bulma Stars: 48.3k License: MIT bulma 是基于 Flexbox 的现代 CSS 框架。 基于 Flexbox 技术。提供快速安装方式,支持 NPM、Yarn 和 Bower。仅包含 CSS 文件,没有 JavaScript 部分。兼容性良好,在主流浏览器上运行良好。提供丰富的…

工作中常用的5种加密算法

背景 最近,项目中做了一些安全性要求的整改。而加密是使用过程中常用的手段之一。这里简单的整理下,希望对小伙伴有帮助。 使用场景 加密是一种将原始信息(明文)转换成难以被直接理解的形式(密文)的过程…

信息收集

信息收集 域名的相关知识 域名的技术指的是一个域名由多少级组成,域名的各个级别被“.”分开,简而言之,有多少个点就是几级域名 顶级域名:.com(商)、.edu(教)、.gov(政)、.mil(军) 一级域名:qq.com 二级域名&#xf…