前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R 语言 朴素贝叶斯算法

R 语言 朴素贝叶斯算法

作者头像
张泽旭
发布于 2018-12-10 08:45:58
发布于 2018-12-10 08:45:58
63400
代码可运行
举报
文章被收录于专栏:张泽旭的专栏张泽旭的专栏
运行总次数:0
代码可运行

朴素贝叶斯算法

学习与分类算法

1 训练数据

代码语言:javascript
代码运行次数:0
运行
复制
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X1<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3)
X2<-c("S","M","M","S","S","S","M","M","L","L","L","M","M","L","L")
Y<-c(-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1)

2 采用模型学习

对于一个新的实例的特征x,x的取值必须是已知特征的取值范围内的,就可以进行后验概率的估计,否则无法使用朴素贝叶斯进行预测
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#cls指的是“class”类别属性,也就是因变量:,atr指的是一个包含特征名称的字符串向量,特征顺序是可以任意的
#data 是数据框Imada是控制参数,=0,模型采用极大似然估计法进行学习>0,模型采用贝叶斯估计法进行学习
#=1,使用的是拉普拉斯平滑法,所有的组建信息可通过names()或srt()获取
代码语言:javascript
代码运行次数:0
运行
复制
  1. navieBayes<-function(cls= "Y",atr=c("X1","X2"),data=NULL,lmada=0){
  2. if(!is.data.frame(data)) stop("Please enter a data frame.")
  3. if(lmada<0) stop("lmada must be greater than or equal to ZERO.")
  4. d<-as.data.frame(apply(data,2,as.factor))
  5. n<-nrow(d)
  6. prodvar_lst<-list()#用来装计算出来的概率
  7. prec_var<-d[cls][,1];levelprec<-levels(prec_var);lprec<-length(levelprec)
  8. prec_p<-data.frame(level=levelprec,prob=NA)
  9. for(i in 1:lprec){
  10. prec_p[i,2]<-(sum(prec_var==levelprec[i])+lmada)/(n+lprec*lmada)
  11. }#类Y的先验概率
  12. prodvar_lst[[cls]]<-prec_p
  13. lvar=length(atr)#特征个数
  14. for(i in 1:lvar){ #特征的条件先验概率
  15. xvar<-d[atr[i]][,1]
  16. txy<-table(xvar,prec_var)+lmada
  17. ptxy<-prop.table(txy,2)
  18. prodvar_lst[[atr[i]]]<-ptxy}
  19. prodvar_lst$lmada<-lmada
  20. prodvar_lst$response<-cls
  21. prodvar_lst$variables<-atr
  22. class(prodvar_lst)<-"navieBayes" #指定输出对象的类
  23. return(prodvar_lst)}

3 打印结果

代码语言:javascript
代码运行次数:0
运行
复制
  1. print.navieBayes<-function(obj){
  2. cat("response=prec_var: ",obj$response,";","lmada=",obj$lmada,"\n","\n")
  3. cat("The variables are:", obj$variables,"\n","\n")
  4. lobj<-length(c(obj$response,obj$variables))
  5. print.default(obj[1:lobj])}

4 对一个进行预测

代码语言:javascript
代码运行次数:0
运行
复制
  1. preCnavieBayes<-function(NBobj,cls=NULL,atr=NULL,atr_value=NULL){
  2. #只能对一个函数进行预测
  3. level<-NBobj[[cls]][,1];ncls<-length(level)
  4. latr<-length(NBobj)-4#特征的个数
  5. start_atr<-2
  6. end_atr<-latr+1
  7. predict_df<-data.frame(matrix(NA,ncls,latr+2))#先建立一个数据框储存结果
  8. colnames(predict_df)<-c(atr,"level","post_p")
  9. for(l in 1:latr){
  10. predict_df[1:ncls,l]<-atr_value[l]
  11. }
  12. predict_df$level<-level
  13. for(i in 1:ncls){
  14. xvec<-NULL
  15. for(j in start_atr:end_atr){
  16. xwhich<-which(rownames(NBobj[[atr[j-1]]])==as.character(atr_value[j-1]))
  17. ywhich<-which(colnames(NBobj[[atr[j-1]]])==as.character(predict_df$level[i]))
  18. px<-NBobj[[atr[j-1]]][xwhich,ywhich]
  19. xvec<-c(xvec,px) }
  20. ypre<-NBobj[[1]][,2][i]
  21. predict_df[i,4]<-ypre*prod(xvec)
  22. }
  23. return(predict_df)
  24. }

5 对多个样本实例进行预测

代码语言:javascript
代码运行次数:0
运行
复制
  1. predict.navieBayes<-function(NBobj,cls=NULL,atr=NULL,atr_value=NULL){
  2. if(!is.data.frame(atr_value)) stop("atr_value must be a data.frame!")
  3. post_lst<-apply(atr_value,1,preCnavieBayes,NBobj=NBobj,atr= atr,cls=cls)
  4. lst<-length(post_lst)
  5. post_df<-NULL
  6. for(i in 1:lst) {
  7. prc_df<-post_lst[[i]]
  8. post_df<-rbind(post_df,prc_df)}
  9. cat("The response :",cls,"\n")
  10. return(post_df)}

6 确定实例

代码语言:javascript
代码运行次数:0
运行
复制
  1. dataB4.1<-data.frame(X1=X1,X2=X2,Y=Y)#将训练数据储存在数据框中
  2. pred_var<-data.frame(X1=c(2),X2=c("S"))
  3. #需要预测的实例
  4. plist<-navieBayes(cls="Y",atr=c("X1","X2"),data=dataB4.1,lmada=0)#训练模型
  5. predict(plist,cls="Y",atr=c("X1","X2"),atr_value=pred_var)#预测模型
  6. 1/15
  7. 1/45
  8. plist#打印“navieBayes”类
  9. plist1<-navieBayes(cls="Y",atr=c("X1","X2"),data=dataB4.1,lmada=1)#训练模型
  10. predict(plist1,cls="Y",atr=c("X1","X2"),atr_value=pred_var)#预测模型
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年06月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
「R」处理glm.fit: fitted probabilities numerically 0 or 1 occurred
当拟合逻辑回归模型,且数据框中一个或多个观测值的预测概率与0或1难以区分时,会出现此警告。
王诗翔呀
2021/10/14
5.3K0
R语言快速入门上手
    较早之前就听说R是一门便捷的数据分析工具,但由于课程设计的原因,一直没有空出足够时间来进行学习。最近自从决定本科毕业出来找工作之后,渐渐开始接触大数据行业的技术,现在觉得是时候把R拿下了;用了3天时间,除了对R先有一个大概认识之外,也着手敲指令。由于计算机专业的底子还不错,而且先后接触过不下10种编程语言,感觉R语言入门上手还是挺简单的。下面是自己汇总的一些简单入门代码供大家参考,感兴趣的朋友也可逐行敲打测试。
云海谷天
2022/08/09
8760
R语言代做编程辅导M3S2 Spring - Assessed Coursework:linear model(附答案)
For this coursework you are required to download a dataset personal to you. Your dataset is available at: http://wwwf.imperial.ac.uk/~fdl06/M3S2_cw_2015/.RData where you must replace with your CID number. Any problems, email me. This dataset contains a dataframe called mydat | it consists of a response y and 3 columns of covariates x1, x2 and x3. Be aware!
拓端
2022/12/14
2960
R语言与机器学习(分类算法)支持向量机
说到支持向量机,必须要提到july大神的《支持向量机通俗导论》,个人感觉再怎么写也不可能写得比他更好的了。这也正如青莲居士见到崔颢的黄鹤楼后也只能叹“此处有景道不得”。不过我还是打算写写SVM的基本想法与libSVM中R的接口。 一、SVM的想法 回到我们最开始讨论的KNN算法,它占用的内存十分的大,而且需要的运算量也非常大。那么我们有没有可能找到几个最有代表性的点(即保留较少的点)达到一个可比的效果呢? 要回答这个问题,我们首先必须思考如何确定点的代表性?我想
机器学习AI算法工程
2018/03/12
1.2K0
R语言与机器学习(分类算法)支持向量机
R语言用多重插补法估算相对风险
在这里,我将用R中的一个小模拟示例进行说明。首先,我们使用X1和X2双变量法线和Y模拟大型数据集,其中Y遵循给定X1和X2的逻辑模型。
拓端
2020/07/17
4580
R语言模拟:Bias Variance Trade-Off
本文是对ESL中第七章一个小案例的复现,主要是对机器学习算法误差的分解,全文包括理论推导和模拟两部分。
量化小白
2019/08/29
7860
R语言模拟:Bias Variance Trade-Off
朴素贝叶斯算法
        朴素贝叶斯算法是流行的十大算法之一,该算法是有监督的学习算法,解决的是分类问题,如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独立(条件特征独立)性和连续变量的正态性假设为前提,就会导致算法精度在某种程度上受影响。
Flaneur
2020/03/25
7880
朴素贝叶斯算法及其Python实现
中文名比较好听,叫朴素贝叶斯,英文叫Naive Bayes,Naive是什么意思大家都知道,朴素贝叶斯的朴素就体现在它假设所有的属性(即特征)之间相互独立,这一假设可以表述为:
带萝卜
2020/10/26
3.6K0
朴素贝叶斯算法及其Python实现
如何应对缺失值带来的分布变化?探索填充缺失值的最佳插补算法
本文将探讨了缺失值插补的不同方法,并比较了它们在复原数据真实分布方面的效果,处理插补是一个不确定性的问题,尤其是在样本量较小或数据复杂性高时的挑战,应选择能够适应数据分布变化并准确插补缺失值的方法。
deephub
2024/06/17
6310
如何应对缺失值带来的分布变化?探索填充缺失值的最佳插补算法
R语言logistic回归的细节解读
R语言中的factor()函数可以把变量变为因子类型,默认是没有等级之分的(可以理解为无序分类变量nominal)!当然也可以通过添加参数ordered=T变成有序因子(等级资料,有序分类ordinal)。
医学和生信笔记
2022/11/15
9980
R语言多项逻辑回归-因变量是无序多分类
因变量是无序多分类资料(>2)时,可使用多分类逻辑回归(multinomial logistic regression)。
医学和生信笔记
2022/11/15
1K0
R语言多项逻辑回归-因变量是无序多分类
生信技能树 R语言入门 第一周总结
因为自己之前学习过一部分B站生信技能树的R语言入门视频,但实际使用时经常会遇到一些问题,这次参加了生信技能树的系统培训班想查漏补缺。这里是整理的第一周学习笔记,主要是针对以前存在的一些问题有了更清晰的认识。
大茗
2023/03/12
1.1K0
「R」apply,lapply,sapply用法探索
apply函数族是R语言中数据处理的一组核心函数,通过使用apply函数,我们可以实现对数据的循环、分组、过滤、类型控制等操作。但是,由于在R语言中apply函数与其他语言循环体的处理思路是完全不一样的,所以apply函数族一直是使用者玩不转一类核心函数。
王诗翔呀
2020/07/06
4.7K0
「R」apply,lapply,sapply用法探索
R语言ROC曲线评价分类器的好坏
本文将使用一个小数据说明ROC曲线,其中n = 10个观测值,两个连续变量x_1和x_2,以及二元变量y∈{0,1}。
拓端
2021/01/13
6590
机器学习(14)——朴素贝叶斯算法思想:基于概率的预测贝叶斯公式朴素贝叶斯算法示例:文本数据分类
前言:在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数Y=f(X)要么是条件分布P(Y|X)。但是朴素贝叶斯却是生成方法,也就是直接找出特征输出Y和特征X的联合分布然后用P(Y|X)=P(X,Y)/P(X)得出。 朴素贝叶斯很直观,计算量也不大,在很多领域有广泛的应用, 算法思想:基于概率的预测 逻辑回归通过拟合曲线(或者学习超平面)实现分类
DC童生
2018/04/27
14.3K0
机器学习(14)——朴素贝叶斯算法思想:基于概率的预测贝叶斯公式朴素贝叶斯算法示例:文本数据分类
R_basic 01
Vector一维 c(1,2,3,4,4) c("A","B","C") c(T,F,F,T,F)
用户10407321
2023/03/23
3190
R语言和医学统计学系列:协方差分析
今天继续学习使用R语言进行医学统计学分析,今天要学习的内容是协方差分析,还是使用课本中的例子。
医学和生信笔记
2022/11/15
4440
R语言和医学统计学系列:协方差分析
R语言多项式回归拟合非线性关系
当我们分析有一些弯曲的波动数据时,拟合这种类型的回归是很关键的。 在这篇文章中,我们将学习如何在R中拟合和绘制多项式回归数据。我们在这个回归模型中使用了lm()函数。虽然它是一个线性回归模型函数,但通过改变目标公式类型,lm()对多项式模型也适用。本教程包括
拓端
2021/05/11
3.8K0
R语言缺失值的处理:线性回归模型插补
我们在这里模拟数据,然后根据模型生成数据。未定义将转换为NA。一般建议是将缺失值替换为-1,然后拟合未定义的模型。默认情况下,R的策略是删除缺失值。如果未定义50%,则缺少数据,将删除一半的行
拓端
2020/10/21
3.6K0
R语言ggplot2绘制曼哈顿图展示GWAS分析的结果
之前分享过一篇推文介绍过这个内容 R语言ggplot2包画曼哈顿图的一个简单小例子,但是当时自己不太懂曼哈顿图,实现是直接借助ggplot2的geom_jitter()这个函数实现的。这个函数并不会考虑每个变异位点的位置,而实际的曼哈顿图是需要根据变异位点的位置来画的。今天的推文重新介绍一下ggplot2绘制曼哈顿图的代码。数据集就使用之前的推文中用到的数据跟着Nature Genetics学GWAS分析:emmax软件gwas分析/qqman包展示结果,这个数据太大,出图有些慢,只随机选取了其中1%的数据 (这个数据我自己的存储路径population.genomics/gwas/NG.tomato/at/)。
用户7010445
2023/09/21
1.1K0
R语言ggplot2绘制曼哈顿图展示GWAS分析的结果
推荐阅读
相关推荐
「R」处理glm.fit: fitted probabilities numerically 0 or 1 occurred
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验