基于R

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

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



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

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

公式如下:

r语言贝叶斯网络 r语言朴素贝叶斯算法_标准差

举个例子,如下表:

r语言贝叶斯网络 r语言朴素贝叶斯算法_标准差_02

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

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

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

r语言贝叶斯网络 r语言朴素贝叶斯算法_标准差_03

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

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

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

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

r语言贝叶斯网络 r语言朴素贝叶斯算法_概率密度_04


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

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

所以在这里

r语言贝叶斯网络 r语言朴素贝叶斯算法_r语言贝叶斯网络_05

那么在这里还有一个问题

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


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

还是用如下的表:

r语言贝叶斯网络 r语言朴素贝叶斯算法_r语言贝叶斯网络_06

假如流失变量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组中,某水平值的一个频率



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

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

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

r语言贝叶斯网络 r语言朴素贝叶斯算法_r语言贝叶斯网络_07


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

fx <- function(x,mu,sigma){
        p = 1/sqrt(2*pi*sigma)*exp(-(x-mu)^2/2*sigma^2)
        return(p)}

同样的利用如下表:

r语言贝叶斯网络 r语言朴素贝叶斯算法_后验概率_08

那么对于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”时则会删除含有缺失值的样本