朴素贝叶斯(基于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”时则会删除含有缺失值的样本







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值