朴素贝叶斯(基于R语言)

基于R

相信自己,每天多学一点。

温故而知新,如有错误请指正。



首先,说到朴素贝叶斯,那么先了解一下思想。

其实朴素贝叶斯在我看来,就是根据某些先验概率来计算Y变量属于某个类别的后验概率

公式如下:


举个例子,如下表:


通过上表,可以计算P(X),P(Y) 和P(X|Y)的值

然后我们可以选取最大的P(Y|X)来确定观测量所属的类

根据前面的,我们需要做的是最大化

Y变量有m个类别,为C1,C2,C3,...,Cm

由此可知,P(Ci|X)的最大化是并非依赖分母,而是由分子决定的

在这里的P(Ci)的值可以根据训练集的Y变量计算出先验概率

那么其实困难的是如何快的得到P(X|Ci)的值



朴素贝叶斯有一个前提假设,自变量之间是类条件独立

也就是说变量A导致Y取1的概率与变量B导致Y取1的概率是不相关的

所以在这里

那么在这里还有一个问题

当变量x是不同的数据类型的时候(离散变量or连续变量),怎么计算P(X|Ci)


首先,还是先考虑离散变量

还是用如下的表:


假如流失变量churn取Y值和N值时,用户为女性(F)且为本科学历(BK)的后验概率是多少?

1,当churn取Y值时有:

P(gender = F|churn = Y) = 2/4 =0.5

P(edu = BK|churn = Y) = 2/4 =0.5

P(gender = F,edu = BK|churn = Y) = 0.5 * 0.5 = 0.25

P(gender = F,edu = BK|churn = Y) * P(churn = Y) = 0.25 * 4/7 = 0/14

2,当churn取N值时有:

P(gender = F|churn = N) = 2/3 =0.67

P(edu = BK|churn = N) = 2/3 =0.67

P(gender = F,edu = BK|churn = N) = 0.67 * 0.67 = 0.44

P(gender = F,edu = BK|churn = N) * P(churn = N) = 0.44 * 3/7 = 0.18

所以,综上,对于离散变量X,P(X|Ci)就等于Ci组中,某水平值的一个频率



那么,对于连续变量的问题

计算后验概率会稍微复杂一点,但是任然会有前提假设,即假设该连续变量服从正态分布

正态分布的概率密度函数为:



所以只要计算出在Ci组中,变量X的均值,标准差,然后将每一个样本值代入到上方的公式即可。

fx <- function(x,mu,sigma){

        p = 1/sqrt(2*pi*sigma)*exp(-(x-mu)^2/2*sigma^2)

        return(p)}

 

同样的利用如下表:


那么对于churn分别取Y值与N值的时候,用户的年龄为22岁,

收入为7800元,频次为12次,支出为4000元的后验概率为多少?



#churn取Y时,变量age的均值和标准差

age.muY <- mean(c(22,24,25,27))

age.sdY <- sd(c(22,24,25,27))

#churn取N时,变量age的均值和标准差

age.muN <- mean(c(23,26,28))

age.sdN <- sd(c(23,26,28))

#计算概率密度值

ageYP <- fx(22,age.muY,age.sdY)

ageNP <- fx(22,age.muN,age.sdN)



#churn取Y时,变量income的均值和标准差

income.muY <- mean(c(7800,8800,9000,8760))

income.sdY <- sd(c(7800,8800,9000,8760))

#churn取N时,变量income的均值和标准差

income.muN <- mean(c(5600,6780,9200))

income.sdN <- sd(c(5600,6780,9200))

#计算概率密度值

incomeYP <- fx(7800,income.muY,income.sdY)

incomeNP <- fx(7800,income.muN,income.sdN)



#churn取Y时,变量freq的均值和标准差

freq.muY <- mean(c(12,24,15,16))

freq.sdY <- sd(c(12,24,15,16))

#churn取N时,变量freq的均值和标准差

freq.muN <- mean(c(33,22,31))

freq.sdN <- sd(c(33,22,31))

#计算概率密度值

freqYP <- fx(12,freq.muY,freq.sdY)

freqNP <- fx(12,freq.muN,freq.sdN)


#churn取Y时,变量outcome的均值和标准差

outcome.muY <- mean(c(4000,3570,4290,3421))

outcome.sdY <- sd(c(4000,3570,4290,3421))

#churn取N时,变量outcome的均值和标准差

outcome.muN <- mean(c(3400,4530,5300))

outcome.sdN <- sd(c(3400,4530,5300))

#计算概率密度值

outcomeYP <- fx(4000,outcome.muY,outcome.sdY)

outcomeNP <- fx(4000,outcome.muN,outcome.sdN)


在离散变量多的领域,按照理论情况下(前提假设都满足),

贝叶斯算法具有最小的错误率,但是实际情况不会那么理想化。


在R语言中,我们使用klaR包中的NaiveBayes()函数实现贝叶斯分类算法。

用法如下:NaiveBayes(formula, data, ..., subset, na.action = na.pass)

其中:formula指定参与模型计算的变量,以公式形式给出,类似于y=x1+x2+x3

data用于指定需要分析的数据对象

na.action指定缺失值的处理方法,默认情况下不将缺失值纳入模型计算,也不会发生报错信息,
当设为“na.omit”时则会删除含有缺失值的样本







  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
朴素贝叶斯是一种基于贝叶斯定理的分类算法,其核心思想是利用已知的先验概率和特征之间的条件概率来预测样本的类别。它的“朴素”之处在于假设特征之间是相互独立的,因此可以将它们的条件概率相乘来得到整个样本属于某个类别的概率。 以下是一个用R语言实现朴素贝叶斯的简单案例: 假设我们有一个数据集,其中包含了一些电子邮件及其所属的分类(垃圾邮件或非垃圾邮件),我们希望根据邮件中出现的关键词来预测它的类别。我们可以用朴素贝叶斯算法来实现。 首先,我们需要将数据集导入R中,并对邮件中的文本进行预处理,比如去除标点符号、停用词和数字等。然后,我们可以将每个单词作为特征,构建一个词汇表。对于每个邮件,我们可以统计它包含词汇表中每个单词的次数,并将这些次数作为特征值,构建一个特征向量。 接下来,我们需要计算每个类别(垃圾邮件或非垃圾邮件)的先验概率,即它们在整个数据集中出现的频率。然后,对于每个特征,我们需要计算它在每个类别下出现的条件概率,即给定一个类别,这个特征出现的概率。这可以通过计算在该类别下包含该特征的邮件数与该类别下所有邮件的数量之比来实现。 最后,对于一个新的邮件,我们可以将它的特征向量代入朴素贝叶斯公式中计算出它属于每个类别的概率,然后选择概率最大的类别作为预测结果。 以上就是一个简单的用R语言实现朴素贝叶斯算法的案例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值