基于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用于指定需要分析的数据对象