数据分析与挖掘 - R语言:贝叶斯分类算法(案例二)

接着案例一,我们再使用另一种方法实例一个案例

直接上代码:

#!/usr/bin/Rscript

library(plyr)
library(reshape2)

#1、根据训练集创建朴素贝叶斯分类器
#1.1、生成类别的概率

##计算训练集合D中类别出现的概率,即P{c_i}
##输入:trainData 训练集,类型为数据框
##      strClassName 指明训练集中名称为    strClassName列为分类结果
##输出:数据框,P{c_i}的集合,类别名称|概率(列名为 prob)
class_prob <- function(trainData, strClassName){
    #训练集样本数
    #nrow返回行数
    length.train <- nrow(trainData)
    dTemp <- ddply(trainData, strClassName, "nrow")
    dTemp <- ddply(dTemp, strClassName, mutate, prob = nrow/length.train)
    dTemp[,-2]
}

##1.2、生成每个类别下,特征取不同值的概率
##计算训练集合D中,生成每个类别下,特征取不同值的概率,即P{fi|c_i}
##输入:trainData 训练集,类型为数据框
##      strClassName 指明训练集中名称为strClassName列为分类结果,其余的全部列认为是特征值
##输出:数据框,P{fi|c_i}的集合,类别名称|特征名称|特征取值|概率(列名为 prob)
feature_class_prob <- function(trainData, strClassName){
    # 横表转换为纵表
    data.melt <- melt(trainData,id=c(strClassName))
    # 统计频数
    aa <- ddply(data.melt, c(strClassName,"variable","value"), "nrow")
    # 计算概率
    bb <- ddply(aa, c(strClassName,"variable"), mutate, sum = sum(nrow), prob = nrow/sum)
    # 增加列名
    colnames(bb) <- c("class.name",
                    "feature.name",
                    "feature.value",
                    "feature.nrow",
                    "feature.sum",
                    "prob")
    # 返回结果
    bb[,c(1,2,3,6)]
}

## 以上创建完朴素贝叶斯分类器

## 2、使用生成的朴素贝叶斯分类器进行预测
##使用生成的朴素贝叶斯分类器进行预测P{fi|c_i}
##输入:oneObs 数据框,待预测的样本,格式为 特征名称|特征值
##      pc 数据框,训练集合D中类别出现的概率,即P{c_i}  类别名称|概率
##      pfc 数据框,每个类别下,特征取不同值的概率,即P{fi|c_i}
##                  类别名称|特征名称|特征值|概率
##输出:数据框,待预测样本的分类对每个类别的概率,类别名称|后验概率(列名为 prob)
pre_class <- function(oneObs, pc,pfc){
    colnames(oneObs) <- c("feature.name", "feature.value")
    colnames(pc) <- c("class.name","prob")
    colnames(pfc) <- c("class.name","feature.name","feature.value","prob")

    # 取出特征的取值的条件概率
    feature.all <- join(oneObs,pfc,by=c("feature.name","feature.value"),type="inner")
    # 取出特征取值的条件概率连乘
    feature.prob <- ddply(feature.all,.(class.name),summarize,prob_fea=prod(prob))  #prod为连乘函数

    #取出类别的概率
    class.all <- join(feature.prob,pc,by="class.name",type="inner")
    #输出结果
    ddply(class.all,.(class.name),mutate,pre_prob=prob_fea*prob)[,c(1,4)]
}

##3、数据测试
##用上面苹果的数据作为例子进行测试
#训练集
train.apple <-data.frame(
    size=c("大","小","大","大","小","小"),
    weight=c("轻","重","轻","轻","重","轻"),
    color=c("红","红","红","绿","红","绿"),
    taste=c("good","good","bad","bad","bad","good")
)
#待预测样本
oneObs<-data.frame(
    feature.name =c("size", "weight", "color"),
    feature.value =c("大","重","红")
)

#预测分类
pc <- class_prob(train.apple,"taste")
pfc <- feature_class_prob(train.apple,"taste")
pre_class(oneObs, pc, pfc)

预测结果为:

class.name pre_prob
1 bad 0.07407407
2 good 0.03703704

可见该苹果的口味为:bad

*********************************************这里是分割线****************************************************

我们使用这个方法再预测一下案例一中的数据集。

#数据集样本
data <- data.frame(c("sunny","hot","high","weak","no",
                 "sunny","hot","high","strong","no",
                 "overcast","hot","high","weak","yes",
                 "rain","mild","high","weak","yes",
                 "rain","cool","normal","weak","yes",
                 "rain","cool","normal","strong","no",
                 "overcast","cool","normal","strong","yes",
                 "sunny","mild","high","weak","no",
                 "sunny","cool","normal","weak","yes",
                 "rain","mild","normal","weak","yes",
                 "sunny","mild","normal","strong","yes",
                 "overcast","mild","high","strong","yes",
                 "overcast","hot","normal","weak","yes",
                 "rain","mild","high","strong","no"),
                 byrow = TRUE,
                 dimnames = list(day = c(),condition = c("outlook","temperature","humidity","wind","playtennis")),
                 nrow=14,
                 ncol=5);  

#待预测样本
ddata<-data.frame(
    feature.name =c("outlook", "temperature","humidity","wind"),
    feature.value =c("overcast","mild","normal","weak")
)

#预测分类
pc <- class_prob(data,"playtennis")
pfc <- feature_class_prob(data,"playtennis")
pre_class(ddata, pc, pfc)

预测结果为:

class.name   pre_prob
1         no 0.02666667
2        yes 0.13168724

预测结果为:yes,可见与案例一的结果一样。

时间: 2024-12-11 12:45:11

数据分析与挖掘 - R语言:贝叶斯分类算法(案例二)的相关文章

下载零基础数据分析与挖掘R语言实战课程(R语言)

随着大数据在各行业的落地生根和蓬勃发展,能从数据中挖金子的数据分析人员越来越宝贝,于是很多的程序员都想转行到数据分析,挖掘技术哪家强?当然是R语言了,R语言的火热程度,从TIOBE上编程语言排名情况可见一斑.于是善于学习的程序员们开始了R语言的学习之旅.对于有其他语言背景的程序员来说,学习R的语法小菜一碟,因为它的语法的确太简单了,甚至有的同学说1周就能掌握R语言,的确如此.但是之后呢?……好像进行不下去了!死记硬背记住了两个分析模型却不明其意,输出结果如同天书不会解读,各种参数全部使用缺省值,

零基础数据分析与挖掘R语言实战课程(R语言)

随着大数据在各行业的落地生根和蓬勃发展,能从数据中挖金子的数据分析人员越来越宝贝,于是很多的程序员都想转行到数据分析, 挖掘技术哪家强?当然是R语言了,R语言的火热程度,从TIOBE上编程语言排名情况可见一斑.于是善于学习的程序员们开始了R语言的学习 之旅.对于有其他语言背景的程序员来说,学习R的语法小菜一碟,因为它的语法的确太简单了,甚至有的同学说1周就能掌握R语言,的确如 此.但是之后呢?……好像进行不下去了!死记硬背记住了两个分析模型却不明其意,输出结果如同天书不会解读,各种参数全部使用缺

数据分析与挖掘 - R语言:贝叶斯分类算法(案例三)

案例三比较简单,不需要自己写公式算法,使用了R自带的naiveBayes函数. 代码如下: > library(e1071)> classifier<-naiveBayes(iris[,1:4], iris[,5]) #或写成下面形式,都可以. > classifier<- naiveBayes(Species ~ ., data = iris) #其中Species是类别变量 #预测 > predict(classifier, iris[1, -5]) 预测结果为:

数据分析与挖掘 - R语言:KNN算法

一个简单的例子!环境:CentOS6.5Hadoop集群.Hive.R.RHive,具体安装及调试方法见博客内文档. KNN算法步骤:需对所有样本点(已知分类+未知分类)进行归一化处理.然后,对未知分类的数据集中的每个样本点依次执行以下操作:1.计算已知类别数据集中的点与当前点(未知分类)的距离.2.按照距离递增排序3.选取与当前距离最小的k个点4.确定前k个点所在类别的出现频率5.返回前k个点出现频率最高的类别作为当前点的预测类别 编写R脚本: #!/usr/bin/Rscript #1.对i

2015lopdev生态联盟开发者大会:股市中的R语言量化算法模型

前言 记得10年前还在上学的时候,总是参加IBM的大会,看着各种新技术从实验室创造,特别地神奇.今天我也有机会站在了IBM大会的讲台上,给大家分享我所研究的R语言技术,对我来说也是一件非常有纪念意义的事情. 感谢IBM主办方的邀请,也真心希望有机会与IBM建立合作机会. 目录 我的演讲主题:股市中的R语言量化算法模型 会议体验和照片分享 整体文章:http://blog.fens.me/meeting-lopdev-20150922/

2015WOT移动互联网开发者大会:股市中的R语言量化算法模型

前言 大会历时两天,以"洞察移动互联网用户行为 分享移动应用研发实践"为主题,共设立"架构与设计"."平台与技术"."MDSA创新与创业"."移动游戏"."算法分析"."HTML5专场"."运维安全"."新浪微博技术"等八大技术专场,并垂直整合了技术和体验,深度服务于参会者与讲师.同时,在内容上也深度结合了目前移动互联网环境,通

R语言 神经网络算法

人工神经网络(ANN),简称神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型.神经网络由大量的人工神经元联结进行计算.大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统.现代神经网络是一种非线性统计性数据建模工具,常用来对输入和输出间复杂的关系进行建模,或用来探索数据的模式. 人工神经网络从以下四个方面去模拟人的智能行为: 物理结构:人工神经元将模拟生物神经元的功能 计算模拟:人脑的神经元有局部计算和存储的功能,通过连接构成一个系统.人工神经网络中也有大量

R语言基础入门之二:数据导入和描述统计

by 写长城的诗 • October 30, 2011 • Comments Off This post was kindly contributed by 数据科学与R语言 - go there to comment and to read  the full post. 一.数据导入 对初学者来讲,面对一片空白的命令行窗口,第一道真正的难关也许就是数据的导入.数据导入有很多途径,例如从网页抓取.公共数据源获得.文本文件导入.为了快速入门,建议初学者采取R语言协同Excel电子表格的方法.也就

R语言学习笔记(二)

今天主要学习了两个统计学的基本概念:峰度和偏度,并且用R语言来描述. > vars<-c("mpg","hp","wt") > head(mtcars[vars]) mpg hp wt Mazda RX4 21.0 110 2.620 Mazda RX4 Wag 21.0 110 2.875 Datsun 710 22.8 93 2.320 Hornet 4 Drive 21.4 110 3.215 Hornet Sportab