位置: IT常识 - 正文

Python实现朴素贝叶斯分类器(用python编写素数)

编辑:rootadmin
Python实现朴素贝叶斯分类器 朴素贝叶斯分类器文章目录朴素贝叶斯分类器一、贝叶斯分类器是什么?贝叶斯判定准则朴素贝叶斯分类器举个栗子二、相关代码1.数据处理2.生成朴素贝叶斯表(字典)关于如何判断属性的连续或离散性根据朴素贝叶斯表计算预测标签总结一、贝叶斯分类器是什么?

推荐整理分享Python实现朴素贝叶斯分类器(用python编写素数),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python purple,python素数,用python编写素数,python怎么素数,python求素数算法,python purple,python求素数算法,python purple,内容如对您有帮助,希望把文章链接给更多的朋友!

贝叶斯分类器是以贝叶斯决策论为基础的一类分类器。和频率决策论不同,贝叶斯决策论使用后验概率来计算将某个数据data分类为某一类c的风险概率。对分类任务来说,在所有相关概率都已知的理想情况下,贝叶斯决策论考虑如何基于这些概率和误判损失来选择最优的类别标记。

贝叶斯判定准则

假设对于数据集D,有N种可能的类别标记,即Y={c1,c2...cn,}Y=\{c_{1},c_{2}...c_{n},\}Y={c1​,c2​...cn​,},λij\lambda_{ij}λij​是将一个真实标记为cjc_{j}cj​的样本误分类为cic_{i}ci​的损失,基于后验概率P(ci∣x)P(c_{i}|x)P(ci​∣x)可获得将样本x分类为cic_{i}ci​所产生的期望损失,即在样本x上的“条件概率”。R(ci∣x)=∑j=iNλijP(cj∣x)R(c_{i}|x)=\sum^{N}_{j=i}{\lambda_{ij}P(c_{j}|x)}R(ci​∣x)=j=i∑N​λij​P(cj​∣x) 我们的任务就是寻找一个判定标准h:X→Yh:X\rightarrow Yh:X→Y以最小化总体风险。 R(h)=Ex[R(h(x)∣x)]R(h)=E_{x}[R(h(x)|x)]R(h)=Ex​[R(h(x)∣x)] 对于每个样本x,若h能以最小化条件风险R(h(x)|x),则总体风险R(h)也将被最小化。这就产生了贝叶斯判定准则(Bayes decision rule):为最小化总体风险,只需在每个样本上选择那个能使条件风险R(c|x)最小的类别标记,即h∗(x)=argminc∈YR(c∣x)h^{*}(x)=arg\quad min_{c\in Y}{R(c|x)}h∗(x)=argminc∈Y​R(c∣x)此时,h∗h^{*}h∗称为贝叶斯最优分类器,与之对应的总体风险R(h*)称为在贝叶斯风险。 具体来说,若目标是最小化分类风险,那么 λij={ifi=j1otherwise\lambda_{ij}=\begin{cases}0&if\quad i=j\\1&otherwise\end{cases}λij​={01​ifi=jotherwise​ 此时条件风险R(c∣x)=1−P(c∣x)R(c|x)=1-P(c|x)R(c∣x)=1−P(c∣x)于是,最小化分类错误率的贝叶斯最优分类器为h∗(x)=argmaxc∈YP(c∣x)(1.1)h^{*}(x)=arg\quad max_{c\in Y}P(c|x)\quad(1.1)h∗(x)=argmaxc∈Y​P(c∣x)(1.1) ,即对每个样本x,选择能使后验概率P(c∣x)P(c|x)P(c∣x)最大的类别标记。基于贝叶斯定理,P(c∣x)P(c|x)P(c∣x)可写为P(c∣x)=P(c)P(x∣c)P(x)(1.2)P(c|x)=\dfrac{P(c)P(x|c)}{P(x)}\quad(1.2)P(c∣x)=P(x)P(c)P(x∣c)​(1.2),其中,P(c)P(c)P(c)是类“先验(prior)”概率;P(x∣c)P(x|c)P(x∣c)是样本x相对于类别标记c的条件概率。

朴素贝叶斯分类器

不难发现,基于贝叶斯公式来估计后验概率P(c∣x)P(c|x)P(c∣x)的主要难度在于类条件概率P(x∣c)P(x|c)P(x∣c)是所有属性的联合概率,难以从有限的训练集上进行直接计算。为了避开这个坑,朴素贝叶斯分类器的做法是,假设所有属性都互相独立。那么,基于属性条件独立假设,式(1.2)可重写为 P(c∣x)=P(c)P(x)∏i=1dP(xi∣c)(1.3)P(c|x)=\dfrac{P(c)}{P(x)}\prod^{d}_{i=1}{P(x_{i}|c)}\quad(1.3)P(c∣x)=P(x)P(c)​i=1∏d​P(xi​∣c)(1.3) 其中ddd为属性数目,xix_{i}xi​为x\mathbf{x}x在第iii个属性上的取值。 由于对于所有类别来说P(x)P(x)P(x)相同,因此基于式(1.1)的贝叶斯判定准则有hnb(x)=argmaxc∈YP(c)∏i=1dP(xi∣c)h_{nb}(x)=argmax_{c\in Y}P(c)\prod^{d}_{i=1}P(x_{i}|c)hnb​(x)=argmaxc∈Y​P(c)i=1∏d​P(xi​∣c)。 显然,朴素贝叶斯分类器的训练过程就是基于训练集D来估计先验概率P(c)P(c)P(c),并为每个属性估计条件概率P(xi∣c)P(x_{i}|c)P(xi​∣c)。令DcD_{c}Dc​表示训练集D种第ccc类样本组成的集合,若有充足的独立同分布样本,则可容易地估计出类先验概率P(c)=∣Dc∣∣D∣P(c)=\dfrac{|D_{c}|}{|D|}P(c)=∣D∣∣Dc​∣​。 对于离散属性而言,令Dc,xiD_{c,x_{i}}Dc,xi​​表示DcD_{c}Dc​中在第iii个属性上取值为xix_{i}xi​的样本组成的集合,则条件概率P(xi∣c)P(x_{i}|c)P(xi​∣c)可估计为P(xi∣c)=∣Dc,xi∣∣Dc∣P(x_{i}|c)=\dfrac{|D_{c,x_{i}}|}{|D_{c}|}P(xi​∣c)=∣Dc​∣∣Dc,xi​​∣​。 对于连续属性可考虑概率密度函数,假定p(xi∣c) N(μc,i,σc,i2)p(x_{i}|c)~\mathcal{N}(\mu_{c,i},\sigma^{2}_{c,i})p(xi​∣c) N(μc,i​,σc,i2​),其中μc,i\mu_{c,i}μc,i​和σc,i2\sigma^{2}_{c,i}σc,i2​分别是第ccc类样本在第iii个属性上取值的均值和方差,则有p(xi∣c)=12πσc,iexp(−(xi−μc,i)22σc,i2)p(x_{i}|c)=\dfrac{1}{\sqrt{2\pi }\sigma_{c,i}}exp(-\dfrac{(x_{i}-\mu_{c,i})^{2}}{2\sigma^{2}_{c,i}})p(xi​∣c)=2π​σc,i​1​exp(−2σc,i2​(xi​−μc,i​)2​)

举个栗子Python实现朴素贝叶斯分类器(用python编写素数)

如上图所示的西瓜数据集,对测试样例编号1进行分类。对于先验概率P(c)P(c)P(c),有P(好瓜=是)=817P(好瓜=是)=\dfrac{8}{17}P(好瓜=是)=178​P(好瓜=否)=917P(好瓜=否)=\dfrac{9}{17}P(好瓜=否)=179​ 然后为每个属性估计条件概率P(xi∣c)P(x_{i}|c)P(xi​∣c): P青绿∣是=P(色泽=青绿∣好瓜=是)=38P_{青绿|是}=P(色泽=青绿|好瓜=是)=\dfrac{3}{8}P青绿∣是​=P(色泽=青绿∣好瓜=是)=83​ P蜷缩∣是=P(根蒂=蜷缩∣好瓜=是)=58P_{蜷缩|是}=P(根蒂=蜷缩|好瓜=是)=\dfrac{5}{8}P蜷缩∣是​=P(根蒂=蜷缩∣好瓜=是)=85​… p密度:0.697∣是=p(密度=0.697∣好瓜=是)=12π∗0.129exp(−(0.697−0.574)22∗0.1292)p_{密度:0.697|是}=p(密度=0.697|好瓜=是)=\dfrac{1}{\sqrt{2\pi}*0.129}exp(-\dfrac{(0.697-0.574)^{2}}{2*0.129^{2}})p密度:0.697∣是​=p(密度=0.697∣好瓜=是)=2π​∗0.1291​exp(−2∗0.1292(0.697−0.574)2​) 其余属性条件概率略 最后,P(好瓜=是)≈0.063P(好瓜=是)\approx 0.063P(好瓜=是)≈0.063 P(好瓜=否)≈6.80∗1−5P(好瓜=否)\approx 6.80*10^{-5}P(好瓜=否)≈6.80∗10−5 由于0.063>6.80∗1−50.063>6.80*10^{-5}0.063>6.80∗10−5因此将样例1判定为“好瓜”。

二、相关代码1.数据处理

该数据集是我通过西瓜书上的西瓜数据集随机生成的10000条数据。需要的评论留言。

代码如下(示例):

import numpy as npimport pandas as pddata=pd.read_csv("DataOrDocu/NewWatermelon2.csv",index_col=0)attributes=data.columnspath="DataOrDocu/PosterProbDict.npy"feature=data[:,:-1]label=data[:,-1]featureTrain,featureTest,labelTrain,labelTest=train_test_split(feature,label,train_size=0.7,random_state=10)labelTrain=np.reshape(labelTrain,(labelTrain.shape[0],1))labelTest=np.reshape(labelTest,(labelTest.shape[0],1))dataTrain=np.concatenate((featureTrain,labelTrain),axis=1)dataTrain=pd.DataFrame(dataTrain,columns=attributes,index=None)dataTest=np.concatenate((featureTest,labelTest),axis=1)dataTest=pd.DataFrame(dataTest,columns=attributes,index=None)2.生成朴素贝叶斯表(字典)

逻辑很简单,即根据式(1.3),先计算《好瓜=是|否》的先验概率,即P(好瓜=是)P(好瓜=是)P(好瓜=是)和P(好瓜=否)P(好瓜=否)P(好瓜=否),并以字典形式返回。然后计算各种条件概率比如P(色泽=青绿∣好瓜=是)P(色泽=青绿|好瓜=是)P(色泽=青绿∣好瓜=是)等等,如果是离散属性,那么保存P(a=ai∣好瓜=是or否)P(a=a_{i}|好瓜=是or否)P(a=ai​∣好瓜=是or否)等一系列条件概率;如果是连续属性,那么保存p好瓜,属性ap_{好瓜,属性a}p好瓜,属性a​的均值和方差。最后,将生成的字典保存成npy文件,方便后续使用。

关于如何判断属性的连续或离散性

此外,有一个问题其中有一个函数,用于判断某个属性是离散属性还是连续属性,我考虑了2种方案,但实际上并不都是完美的逻辑,只是针对具体的数据集具有逻辑的相对完备性。一是判断数据是否为字符类型,一般字符类型将其判断为离散属性,其他判断为连续属性,但很容易在其他数据集上发现例外;二是计算某属性的所有数据集中包含的值的所有种类,如果种类数量<一定的范围,那么,我即认定为其为离散值,大于该范围的,认定其为连续值。但当遇到稀疏数据时,此类办法也会经常失效。

具体代码如下:

import numpy as npdef PosteriorProbDivided(data,attributes,label,path): priorProba={} length=data.shape[0] labelKinds=KindsGet(data,label) #获取标签的所有类别 posterProbTable={} try: for i in labelKinds: dataTemp=data.loc[data[label]==i] tempLength=dataTemp.shape[0] tempPrior=tempLength/length priorProba.update({i:tempPrior}) tempAttr = {} # 用于保存所有属性的条件概率 for j in attributes: if IfDivideAttr(data,j): tempPosterProb=DivCondiProba(data,j,length) tempAttr.update({j:tempPosterProb}) #将该属性的条件概率保存 else: averageVar=ContiCondiProba(data,j) #如果该属性是连续值,那么将该属性的平均值和方差求出,并保存 tempAttr.update({j:averageVar}) posterProbTable.update({i:tempAttr}) try: np.save(path,posterProbTable) except FileExistsError as error: print(error) return priorProba except IndexError as error: print(error)def IfDivideAttr(data,attribute): #第一种判断属性离散还是连续的函数 values=np.unique(data[attribute]).shape[0] #获取某一属性的值的种类 length=data.shape[0] if values!=0: if values<=length/10: #如果某一属性的取值数量小于等于总数据量的十分之一,即判定其为离散值 return True else: return Falsedef IfDivideAttr2(data,attribute): #第二种判断属性离散还是连续的函数 return not isinstance(data[attribute],float)def KindsGet(data,attribute): #用于将离散属性的所有值返回 if IfDivideAttr(data,attribute): values=np.unique(np.array(data[attribute])) return values return Nonedef DivCondiProba(data,attribute,length): #计算某一离散属性的条件概率 tempAttrValues = KindsGet(data, attribute) tempPosterProb = {} # 用于保存某一属性的后验概率 for k in tempAttrValues: tempAttrPoster = data.loc[data[attribute] == k].shape[0] / length # 计算出当某属性a的值为k时,其在标签c上的条件概率P(k|c),并将其压进列表 tempPosterProb.update({k: tempAttrPoster}) return tempPosterProbdef ContiCondiProba(data,attribute): #计算某一连续属性的平均值和方差 contiValue=data[attribute] contiValue=np.array(contiValue) average=np.average(contiValue) variance=np.var(contiValue) return average,variance根据朴素贝叶斯表计算预测标签

针对某个数据的每一个属性对应的值,如果是离散属性,那么就从表中获取,如果是离散属性,那么就根据表中的均值和方差计算条件概率。但是区别于式(1.3),在程序中我对连乘做了一个取对数,防止指数爆炸(方正就是防止差距过大)。然后一个判断正确率的函数,单纯计算预测数据中的正确比例。

def PosteriorFind(data,posterProbTabel,priorProba): #用于计算某单个数据的最后标签 posterValues=[] #用于保存每一个标签的后验概率 bayesProba=0 for label in posterProbTabel: for attribute in posterProbTabel[label]: # attrValue=list(attribute.keys())[0] #取出字典键值对中的健 if IfDivideAttr2(data,attribute): tempValue=np.log(posterProbTabel[label][attribute][data[attribute]]) bayesProba+=tempValue else: averageVar=posterProbTabel[label][attribute] xi=data[attribute] average,variance=averageVar[0],averageVar[1] tempValue=1/(np.square(2*pi)*variance)*np.exp(-(xi-average)**2/2*variance**2) tempValue=np.log(tempValue) bayesProba+=tempValue labelKey=label #取出label的key labelPrior=priorProba[labelKey] bayesProba+=np.log(labelPrior) #将该循环内的标签c所对应的先验概率加入其中 posterValues.append(bayesProba) bayesProba=0 posterDict=zip(posterValues,list(posterProbTabel.keys())) posterDict=dict(posterDict) bestValue=np.max(posterValues) bestLabel=posterDict[bestValue] return bestLabeldef AccCal(data,label,PosterProbaTabel,priorProba): length=data.shape[0] acc=0 for i in range(data.shape[0]): labelPre=PosteriorFind(data.loc[i],PosterProbaTabel,priorProba) if labelPre==data[label][i]: acc+=1 ratio=acc/length return ratio总结

使用随机生成的10000条数据,按照0.7训练集,0.3测试集的比例。最后的正确率大概是百分之四十几 之后又使用了一下鸢尾花的数据集 结果如下正确率是百分之三十一(可以说是很辣鸡了 最后附上sklearn的高斯贝叶斯和决策树跑鸢尾花的正确率 要不怎么说人家是专业的呢(doge

本文链接地址:https://www.jiuchutong.com/zhishi/300623.html 转载请保留说明!

上一篇:YOLOv5|YOLOv7|YOLOv8改各种IoU损失函数:YOLOv8涨点Trick,改进添加SIoU损失函数、EIoU损失函数、GIoU损失函数、α-IoU损失函数

下一篇:Copilot 初体验(pilot coat)

  • 电子商务网店的建设策划(电子商务网店的类型有哪些)

    电子商务网店的建设策划(电子商务网店的类型有哪些)

  • 天语v40质量怎么样(天语v8刷机)(天语sx4质量如何)

    天语v40质量怎么样(天语v8刷机)(天语sx4质量如何)

  • oppo手机怎么让应用一直运行(oppo手机怎么让时间显示在右上方)

    oppo手机怎么让应用一直运行(oppo手机怎么让时间显示在右上方)

  • 苹果相册icloud关闭照片没了(苹果相册icloud关闭了照片怎么办)

    苹果相册icloud关闭照片没了(苹果相册icloud关闭了照片怎么办)

  • 验证失败您尚未接入互联网(验证失败尚未连入互联网)

    验证失败您尚未接入互联网(验证失败尚未连入互联网)

  • 三星手机不断重启怎么回事(三星手机不断重启无法开机)

    三星手机不断重启怎么回事(三星手机不断重启无法开机)

  • 打印机需要连接网线吗(打印机需要连接电脑主机吗)

    打印机需要连接网线吗(打印机需要连接电脑主机吗)

  • 手机电池鼓起来了还能用吗(手机电池鼓起来了会爆炸吗)

    手机电池鼓起来了还能用吗(手机电池鼓起来了会爆炸吗)

  • ppt怎么插入符号(ppt增加符号)

    ppt怎么插入符号(ppt增加符号)

  • 路由器对人体有伤害吗(路由器对人体有辐射吗应离开多远的距离)

    路由器对人体有伤害吗(路由器对人体有辐射吗应离开多远的距离)

  • 苹果11数据线和苹果6数据线一样吗(苹果11数据线和12一样吗)

    苹果11数据线和苹果6数据线一样吗(苹果11数据线和12一样吗)

  • airpodspro支持18w快充吗(Airpodspro支持多少采样率)

    airpodspro支持18w快充吗(Airpodspro支持多少采样率)

  • 快手上提示的消息为什么看不了(快手消息清空后怎么恢复)

    快手上提示的消息为什么看不了(快手消息清空后怎么恢复)

  • 华硕哪个国家的品牌(华硕哪个国家的电脑)

    华硕哪个国家的品牌(华硕哪个国家的电脑)

  • 无线路由器灯一直闪烁(无线路由器灯一闪一闪怎么回事)

    无线路由器灯一直闪烁(无线路由器灯一闪一闪怎么回事)

  • PPT怎么打开网格参考线(ppt怎么弄出网格)

    PPT怎么打开网格参考线(ppt怎么弄出网格)

  • vivox30pro左边按键干嘛用(vivox30pro侧边按键)

    vivox30pro左边按键干嘛用(vivox30pro侧边按键)

  • 电脑屏幕不亮,显示屏指示灯在闪(电脑屏幕不亮键盘不亮是怎么回事)

    电脑屏幕不亮,显示屏指示灯在闪(电脑屏幕不亮键盘不亮是怎么回事)

  • 腾讯视频缓存的视频在哪个文件夹(腾讯视频缓存的视频怎么传给别人)

    腾讯视频缓存的视频在哪个文件夹(腾讯视频缓存的视频怎么传给别人)

  • 卡贴机能开热点吗(苹果卡贴机怎么开热点)

    卡贴机能开热点吗(苹果卡贴机怎么开热点)

  • 8250和8265u区别(8265u比8250u强多少)

    8250和8265u区别(8265u比8250u强多少)

  • 抖音怎么更改绑定手机号(抖音怎么更改绑定支付宝账号)

    抖音怎么更改绑定手机号(抖音怎么更改绑定支付宝账号)

  • 小红书什么意思(用户已注销小红书什么意思)

    小红书什么意思(用户已注销小红书什么意思)

  • 七天网络未授权怎么弄(七天网络未授权什么意思)

    七天网络未授权怎么弄(七天网络未授权什么意思)

  • IP是什么(ip是什么的缩写)

    IP是什么(ip是什么的缩写)

  • Linux的特殊权限SUID SGID和SBIT讲解(linux特殊权限设置)

    Linux的特殊权限SUID SGID和SBIT讲解(linux特殊权限设置)

  • 9 个实用的 VSCode 扩展插件,让你的开发工作更轻松(vscode简单入门)

    9 个实用的 VSCode 扩展插件,让你的开发工作更轻松(vscode简单入门)

  • 深度学习之快速实现数据集增强的方法

    深度学习之快速实现数据集增强的方法

  • 企业向股东借款个人所得税
  • 收到待报解预算收入怎么查退的什么税
  • 企业所得税亏损弥补的规定
  • 农产品的税率是9%吗
  • 实收资本变动额怎么算
  • 其他业务收入冲应收账款
  • 增值税降到16个点什么时候实行
  • 分公司是独立核算还是非独立核算
  • 长期股权投资的4个明细科目
  • 损益类账户的会计要素有哪些
  • 一般纳税人公司是什么型企业
  • 小规模纳税人开票税率
  • 房地产销售土地增值税纳税人减免申请核准表
  • 代开专票作废了扣了两次税怎么办?
  • 废气处理工程会计分录
  • 应有财务软件
  • 冬虫夏草开票什么税率
  • 未办理三证合一营业执照会注销吗
  • 国家税务局定额发票验证
  • 退休人员再任职个人所得税
  • 简易征收红字发票怎么在报表中表现
  • 公司注销对外投资股权有效吗
  • 其他综合收益要转入投资收益吗
  • 小规模减半征收什么时候开始
  • 递延所得税资产对应的会计科目
  • 勒索病毒文件怎么恢复
  • 技术合同的计税依据包括研究开发经费
  • 周转房维修请示
  • 王者荣耀中张飞的台词
  • 预付账款主要是
  • 出租商品计入什么科目
  • win11如何调整鼠标中键
  • 查补税款有未缴纳怎么办
  • 所得税税前扣除的费用有哪些
  • PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
  • 营改增后一般纳税人缴纳增值税彩用简易征收3%
  • css 单行显示
  • 怎么给复选框赋值
  • thinkphp3.0
  • 简单解决微信文案的方法
  • 增值税发票填写注意事项
  • 后处理作用
  • vue实现文件上传和下载
  • 任何单位和个人发现洗钱活动有权向什么举报
  • 工程质保金可以不退吗
  • mysql中的外键的作用
  • url静态化怎么操作
  • 织梦标签教程
  • 累计增长率如何计算公式
  • 商贸企业 税收 政策规定
  • 发表文章开什么发票
  • 零售金银首饰是否缴纳消费税
  • 资产减值损失如何计算
  • 发行债券支付的发行费用计入哪里
  • 出租使用权什么意思
  • etc发票当天可以打印吗
  • 母子公司往来款是否涉及交税
  • 银行承兑汇票怎么看
  • mysql的表文件在哪
  • mysql锁表的sql
  • windrv.exe
  • downloader.exe是什么
  • linux安装迅雷
  • 如何卸载win8系统
  • win7系统如何修改锁屏密码
  • win8自带驱动吗
  • javascript组件
  • jquery data-
  • nodejs内置的包管理器
  • 创建步骤
  • 百度关键词设置
  • linux shell脚本攻略(第3版)
  • unity3d图形学
  • getelementbyid isnotafunction
  • easyui-dialog
  • 重庆网上税务局个人怎么绑定企业账户
  • 海南省地方税务局关于土地增值税清算有关问题的通知
  • 浙里办扫码在哪里
  • 副局长是由局长任命的吗
  • 养猪场环保税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设