机器学习之朴素贝叶斯三、拉普拉斯平滑技术、优化改进情感分析

news2025/1/31 11:28:11

文章目录

  • 一、前文问题
    • 1. 先看下改进前我们的代码计算部分
    • 2. `问题分析`:
  • 二、针对问题进行解决
    • 1. 什么是`拉普拉斯平滑`技术
    • 2. 拉普拉斯优化-下溢上溢问题
    • 3. 改进地方分析:
    • 4.改进优化
      • 1.优化一,对条件概率计算进行优化
      • 2.优化二,对后延概率计算进行优化
      • 3. 优化结果分析
  • 三、源码
  • 四、下一篇 学习如何做舆情分析

一、前文问题

改进前情感分析实践

1. 先看下改进前我们的代码计算部分

条件概率计算部分

在这里插入图片描述看下训练后的结果展示

在这里插入图片描述

2. 问题分析

可以看到此时的训练后的结果是,在开心和伤心的条件概率中存在0,的结果。那么在计算后验概率P(C|X)其中X是特征C是label。发现:计算的结果为0
原因是什么?
来看下我们的条件概率计算过程是什么:

'''
	在计算样本 x 属于某个类别 C 的后验概率时,朴素贝叶斯假设各个特征之间相互独立,即 
	p(x|C) = p(x1|C)p(x2|C)...p(xn|C),其中 x1, x2, ..., xn 分别是特征向量的不同维
	度。这个假设简化了计算过程,但是忽略了特征之间的相关性。	
	根据贝叶斯公式,朴素贝叶斯可表示为: p(C|x) = p(x|C)p(C)/p(x) 其中,p(x|C) 表示在类
	别 C 下特征向量 x 出现的概率,p(C) 表示类别 C 的先验概率,p(x) 表示特征向量出现的概
	率。由于对于所有类别都是相同的,所以可以省略分母 p(x)

	可以看到vec_0 =  array_0/_0计算的就是p(x|C) = p(x1|C)p(x2|C)...p(xn|C)
	也就是当是开心样本的时候,是特征 X 的概率。
	array_0,中的每一个维度就是一个特征,那么array_0将所有开行样本中的数据相加,也就计算出
	了,每个特征发生次数。那么就可以计算,当开心label时候,特征X发生的概率。即 每个特征发生
	次数/总的样本发生次数
	_0 计算的就是,开心样本数据中,总的样本发生次数。
'''

可以看到,array_0计算的是 每个特征发生次数/总的样本发生次数,那么如果我们的样本中某个特征发生次数为0,这个时候这进行p(x|C) = p(x1|C)p(x2|C)...p(xn|C)计算的时候,就会出现为0的情况。

二、针对问题进行解决

我们经过分析知道问题所在那么可以针对问题进行解决了。

1. 什么是拉普拉斯平滑技术

拉普拉斯平滑是一种用于解决朴素贝叶斯算法中零概率问题的技术。在计算条件概率时,有些情况下会出现某个特征在某个类别下没有出现过的情况导致概率为零,这就无法使用贝叶斯公式进行计算。为了避免这种情况,可以对概率进行平滑处理,使得每个特征在每个类别下至少出现一次,从而避免概率为零的情况。而拉普拉斯平滑就是一种常用的平滑方法,它在计算概率时将每个特征的计数都加上一个常数k,从而保证每个特征至少出现k次

2. 拉普拉斯优化-下溢上溢问题

在进行拉普拉斯平滑时,条件概率的计算会涉及多个特征的连乘积,这容易导致数值过小而出现下溢(underflow)或者上溢(overflow)的问题。因此,为了避免这种问题,在实际应用中通常会使用对数操作将连乘积转换成加和运算,从而方便计算。同时,取对数还有一个好处是可以简化计算,因为对数具有以下常用的运算规则:

log(a*b) = log(a) + log(b)
log(a/b) = log(a) - log(b)
通过这些运算规则,可以大大简化计算,并且防止由于浮点数的精度限制而导致的计算误差。因此,在进行拉普拉斯优化时,经常会使用对数操作来计算条件概率

3. 改进地方分析:

在这里插入图片描述
看到我们在进行初始化的时候,使用的是np.zeros()函数,也就造成前面说的问题。

4.改进优化

1.优化一,对条件概率计算进行优化

def train(data,label):
    '''
    :param data: 这里的数据是样本经过向量化后的向量信息
    :param label:  样本所对应的标签信息
    :return:
    1. vec_0 --- 开心的条件概率组
    2. vec_1 --- 伤心的条件概率组
    3. simple_1 --- 样本数据属于伤心的概率
    '''
    num_simple = len(data) #样本的数量
    num_words = len(data[0]) #统计每个样本的词的数据量

    simple_1 = sum(label)/float(num_simple)  #计算的是伤心的
    '''
    这里说明一下,为什么使用的是sum(label) 来进行计算:
    正常这里应该是,属于伤心的样本数据/总的样本数
    那么我们这里用sum的效果就是,伤心样本的数量,因为伤心
    的label为1,开心为0,所有label的和就是,伤心的数量
    这里取巧了。
    '''
    #todo 改进一
    # 进行条件概率数组初始化
    # array_0,array_1 = np.zeros(num_words),np.zeros(num_words)
    array_0,array_1 = np.ones(num_words),np.ones(num_words) #todo 改进一
    _0 = 2.0 #todo 改进
    _1 = 2.0 #这里是多求条件概率的分母进行初始化,至于怎么用后面说
	'''
	这里为甚使用np.ones,和2来进行优化,这个没有定数,你可以自己指定,
	用这个主要还是好计算
	'''


    #todo 对所有伤心的样本进行计算条件概率
    for i in range(num_simple):
        if label[i] == 1: #伤心
            array_1 += data[i]
            _1 += sum(data[i])
        else: #开心
            array_0 += data[i]
            _0 += sum(data[i])

    #todo 改进优化二
    # vec_0 =  array_0/_0
    vec_0 =  np.log(array_0/_0)
    vec_1 =  np.log(array_1/_1)
    return vec_0,vec_1,simple_1

改进后的结果

在这里插入图片描述

2.优化二,对后延概率计算进行优化

在这里插入图片描述
这里分析一下为什么使用对数优化

pro_0 = sum(vec_test*vec_0) * np.log(1 - simple_1)
print('pro_0:',pro_0)
#pro_1 = reduce(lambda x,y:x*y,vec_test*vec_1) * simple_1
pro_1 = sum(vec_test*vec_1) * np.log(simple_1)
'''
这里pro_0 计算的是后验概率P(C|X),我们的vec_0计算的是条件概率,
我们知道朴素贝叶斯:后验概率=先验概率*条件概率
根据 log(后验概率)=log(先验概率) + log(条件概率)
vec_0在训练的时候已经进行log()过了。
'''


print('pro_1:',pro_1)
if pro_0 > pro_1:
    return 0
else:
    return 1

改进后结果展示

在这里插入图片描述

3. 优化结果分析

可以看到优化后的结果,效果直线上升。
后续问题::::
但是我在进行优化后的代码执行的的时候,依然会遇到,不能识别的类别的情况,甚至,分类的记过都是一种情况,经过试验我发现是因为,样本数据不均衡导致的,我适当优化下数据集,就好了。
由此可以看到,机器学习,对数据特征工程依赖还是很大的,到没有深度端到端来的爽,但是机器学习有着深度不可替代的能力。

三、源码

改进后的源码

致谢

四、下一篇 学习如何做舆情分析

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

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

相关文章

从小白到黑客高手:一份全面详细的学习路线指南

前言 黑客从入门到精通需要经过深入的学习和实践,这是一个需要长时间投入和大量精力的过程。在这份学习路线中,我将为你介绍黑客学习的基本知识和技能,帮助你逐步掌握黑客技能。 黑客 一、入门阶段 1.了解计算机基础知识 学习计算机基础知…

红黑树(小白教学)

分享一个动画展示的网址:Red/Black Tree Visualization (lerogo.com) 将红黑树之前,我们先来了解一下什么叫做2-3树!!! 在我们以前学习的过程中(二分搜索树、完全二叉树等)结点都是存放了一个元…

Auto_GPT:如何使用Auto-GPT、安装、开发

文章目录 前言一、使用前提二、如何在您的 PC 上安装 Auto-GPT第 1 步:安装 Python第 2 步:获取 Auto-GPT 源代码和 OpenAI API 密钥第 3 步:在 Windows、MacOS和 Linux上安装 Auto-GPT 三、如何在你的 PC 上运行Auto-GPT总结 前言 Auto-GPT…

Redis消息队列(1)

一)消息队列:从字面意思上来看是存储消息的队列,最简单的消息队列包含三个元素: 1)消息队列:存储和管理消息,也被称之为是消息代理 2)生产者:发送消息到消息队列 3)消费者:从消息队列中获取消息并处理消息 4)当有用户想要进行秒杀下单的时候,…

CENTO OS上的网络安全工具(二十一)Hadoop HA swarm容器化集群部署

如果使用swarm来构建Hadoop、Spark之类的集群,一个绕不过去的问题每个容器都需要支持SSH免密互联——因为Hadoop需要。这就需要事先准备可以一键进行集群化部署的SSH镜像。 一、SSH集群及镜像的构建 1. 准备更换镜像源的Centos7 由于Centos7已经停止维护&#xff0c…

stm32 iic驱动ds1307实际使用驱动

本文使用的工程代码如下: (1条消息) stm32iic驱动ds1307实际使用驱动,参考博客:资源-CSDN文库 上次我记得写了一个使用开发板测试DS1307的测试例程,DS1307也是使用测试板,后面项目上具体使用了,又优化了驱…

HelloSpring

1.beans.xml配置文件 在resource资源文件夹下创建beans.xml文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&qu…

我们的愿景是在个人计算机上实现量子霸权

奥维尔号量子计算机 简介 采用扩展的量子二进制算法。在经典计算机上实现量子计算机。我们的景愿是在个人计算机上实现量子霸权。 此计算机的字长是64位&#xff0c;等效数据位为32位字长的量子计算机。我们采用量子扩展二进制&#xff0c;共有&#xff14;个字符:0,1,Q,P可以…

Redis---主从复制 哨兵

目录 一、主从复制 1、什么是主从复制呢&#xff1f; 2、案例演示 2.1 配置文件 2.2 一主二仆 2.2.1 相关题目&#xff1a; 2.3 薪火相传 & 反客为主 3、复制原理和工作流程 3.1、slave启动&#xff0c;同步清初 3.2 首次连接&#xff0c;全量复制 3.…

【CNN】卷积神经网络(LeNet)是什么?如何实现LeNet?

系列文章目录 第一章 深度学习 CNN中的卷积神经网络&#xff08;LeNet&#xff09; 目录 系列文章目录 文章目录 前言 一、卷积神经网络&#xff08;LeNet&#xff09;是什么&#xff1f; 二、LeNet的网络结构 三、实现LeNet模型 ​​​​ 总结 前言 本文主要是介绍卷…

【改进粒子群优化算法】自适应惯性权重粒子群算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【软考|软件设计师】某计算机系统的CPU主频为2.8GHz

目录 题&#xff1a; CPI MIPS 题&#xff1a; 某计算机系统的CPU主频为2.8GHz。某应用程序包括3类指令&#xff0c;各类指令的CPI &#xff08;执行每条指令所需要的时钟周期&#xff09;及指令比例如下表所示。执行该应用程序时 的平均CPI为______&#xff1b; 运算速度…

面试了一个00后,绝对能称为是内卷届的天花板

前言 公司前段缺人&#xff0c;也面了不少测试&#xff0c;结果竟然没有一个合适的。一开始瞄准的就是中级的水准&#xff0c;也没指望来大牛&#xff0c;提供的薪资也不低&#xff0c;面试的人很多&#xff0c;但平均水平很让人失望。令我印象最深的是一个00后测试员&#xf…

DelphiMVCFrameWork 源码分析(三)

中间件(MiddleWare) 文档中是这样说的&#xff1a; Middleware is a powerful and flexible layer within DMVCFramework. Middleware allows you to write SOLID code and separate the processing or each request into smaller steps to be invoked during the request ha…

二本4年测试经验,5面阿里(定薪38K),分享我的心得

年前准备跳槽&#xff0c;先后面试了各大小公司&#xff0c;拿了一些offer&#xff0c;有阿里&#xff0c;滴滴&#xff0c;快手&#xff0c;达达&#xff0c;得物等公司。面试的公司大部分都能过&#xff0c;所以这里给大家分享下自己的经验&#xff0c;也给自己做个归档&…

新书推荐:《AIGC未来已来——迈向通用人工智能时代》

新书推荐&#xff1a;《AIGC未来已来——迈向通用人工智能时代》 导言 AIGC为何引发关注&#xff1f; ChatGPT会成为人工智能的拐点吗&#xff1f; GPT-4未来已来&#xff0c;奇点时刻该如何面对&#xff1f; 人类的创新能力会被AIGC替代吗&#xff1f; 当下有哪些典型的AIGC变…

单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用

光感芯片veml7700的使用 1、veml有7个寄存器&#xff0c;每个十六位&#xff0c;见图。 00是config寄存器&#xff0c; 01 02 是中断设置的阈值 03是节能模式的设置 04 是得到的光的亮度值 05是得到的data of whole WHITE 06是中断设置值。 2、我们只测试得到光的亮度值&…

86盒IP对讲一键报警器

86盒IP对讲一键报警器 86盒IP对讲一键报警器&#xff1a;革命性保障生命安全的利器&#xff01; 随着科技的飞速发展&#xff0c;我们的生活变得越来越方便和智能化。而86盒IP对讲一键报警器更是在这种背景下应运而生。这款产品不仅无缝对接各种手机APP&#xff0c;也可以在智…

Linux系统crash后定位方法-PCIE举例

crash解释 在Linux操作系统中&#xff0c;"crash"通常是指一种用于分析系统崩溃&#xff08;crash&#xff09;的工具或方法。当系统发生崩溃时&#xff0c;可能会产生一些关键信息&#xff0c;如错误日志、内存转储文件等。使用crash工具可以分析这些信息&#xff…

零基础自学【Web安全/网络渗透】,保姆级快速入门指南(非常详细)

前言 基础真的很简单&#xff0c;是个人稍微认点真都能懂&#xff0c;这就是好多人说的网络安全简单、易懂、好学&#xff0c;然后就是一顿浮夸的言论&#xff0c;误导那些小白&#xff0c;再然后那些小白也就跟着浮夸。这里我就给那些轻浮的人泼一桶冷水&#xff0c;懂跟学会…