分类算法1:朴素贝叶斯法及R语言实现

想想还是从理论到应用说起来比较清晰。

朴素贝叶斯法基于两个要素:
(1)贝叶斯定理
(2)特征条件独立的假设

先介绍贝叶斯定理,想必大家是既熟悉又陌生了。这里,只介绍事件形式的贝叶斯定理,关于随机变量形式的贝叶斯定理,作为补充,详见后面附录:
P(BiA)=P(ABi)P(Bi)j=1nP(ABj)P(Bij)P(B_i|A)=\frac{P(A|B_i)P(B_i)}{\sum_{j=1}^{n}P(A|B_j)P(B_ij)}
显然,它是由全概率公式和条件概率推导而来,并没有大家想象的那么神秘。由于j=1nP(ABj)P(Bj)\sum_{j=1}^{n}P(A|B_j)P(B_j)是一个常数因子,所以,我们又可以将其简化为:
P(BiA)=P(ABi)P(Bi)P(B_i|A)=P(A|B_i)P(B_i),这也称为贝叶斯定理的核。下面,我们来引入特征条件独立的假设,特征条件独立假设就是假设数据AA所携带kk个特征之间是相互独立的,于是,又可以进一步简化,P(ABi)P(Bi)=P(A1Bi)P(A2Bi)P(AkBi)P(Bi)P(A|B_i)P(B_i)=P(A_1|B_i)P(A_2|B_i)\cdot \cdot \cdot P(A_k|B_i)P(B_i),所以就有:P(BiA)=P(A1Bi)P(A2Bi)P(AkBi)P(Bi)P(B_i|A)=P(A_1|B_i)P(A_2|B_i)\cdot \cdot \cdot P(A_k|B_i)P(B_i)。这里,我们假设有qq个类别,朴素贝叶斯法就是求出P(B1A)P(B2A),,P(BqA)P(B_1|A),P(B_2|A),\cdot \cdot \cdot ,P(B_q|A)qq个概率,然后找出最大的哪一个概率,进而进行分类。
特征条件独立是一个很强的假设,但是试验效果显示,朴素贝叶斯法的准确度非常的高。所以说,该方法不仅计算效率高(特征条件独立的强假设赋予了它这一性质),结果准确度也高,因此它在十大分类算法中占有一席之地。废话不多说,光说不练假把式,no,no,no,还有一点差点忘了,那就是拉普拉斯平滑,想想发明这些东西的人,真是逻辑太严谨了,方方面面都能给你考虑到,真不知道他们平时吃的什么。
拉普拉斯平滑:我想用理论来解释就非常清楚,P(BiA)=P(A1Bi)P(A2Bi)P(AkBi)P(Bi)P(B_i|A)=P(A_1|B_i)P(A_2|B_i)\cdot \cdot \cdot P(A_k|B_i)P(B_i),拉普拉斯平滑就是说,如果某个数据中有一个特征AjA_j不存在,为0,那就出大事了,求出来的P(BiA)P(B_i|A)的结果也就是0了,显然这是不对的,于是他们就给每个特征都加上1(实际中可以调整),那么这样该类别BiB_i就要加上qq,这样不仅保证了其概率和依然为1,而且也完美解决了0概率的问题,反正把0变成1,其在所有特征中的概率依然是最小的,哈哈,我的天,真是聪明!光说不练假把式,理论和实际应用结合起来才更让人痴迷。
这里用一个简单的例子来展示一下朴素贝叶斯法吧,其实对于不同的数据,方法都是一样的,只不过是数据清洗的手段不一样而已,这里我直接使用鸢尾花数据集,来跳过数据清洗这个繁琐让人头疼的环节。

先来介绍一下鸢尾花iris数据集吧,如下:

## iris data set

# 该数据集有3个类别:setosa & versicolor & virginica
# 4个特征:Sepal.Length & Sepal.Width & Petal.Length & Petal.Width

##-----------------------------------------------------------------------------------

# 详细了解iris数据集

#埃德加安德森的虹膜数据

#虹膜数据集分别给出了3种虹膜中50种花的变量萼片长度和宽度以及花瓣长度和宽度的厘米尺寸。
#物种是鸢尾(Iris setosa),云芝(versicolor)和维吉尼亚(virginica)

step1:构建训练集 & 测试集



##-----------------------------------------------------------------------------------


##  总共150个样本,选120个做为训练集(每个类别选40个样本),剩下的30个作为测试集

### 用抽样的方式构造训练集会更为科学

train_ord <- sample(nrow(iris),120,replace = FALSE)
train <- iris[train_ord,]
test <- iris[-train_ord,]


step2:构建朴素贝叶斯分类器(具体请查看help文档)

library(e1071)
m <- naiveBayes(Species ~., data = train)
pred <- predict(m,test)
library(gmodels)
CrossTable(test$Species,pred)

分类结果
在这里插入图片描述
从分类结果可以看出,测试集中的12个 setosa全部分类正确,12个versicolor有10个分类正确,有2个错误的分到了virginica中,6个virginica全部分类正确。由此可以看出,朴素贝叶斯法的分类效果真的是立竿见影。

附录

X1,...XnX_1,...X_n是来自总体XX的样本,x1,...,xnx_1,...,x_n是它的观察值,那么我们就可以得到X1,...XnX_1,...X_n的联合密度:f(x,θ)=f(x1,...,xn,θ)f(x,\theta)=f(x_1,...,x_n,\theta)θΘ\theta \in \Theta是总体X中的参数,Θ\Theta是参数空间,显然,从总体中抽样得到的样本信息都包含在了联合密度f(x,θ)=f(x1,...,xn,θ)f(x,\theta)=f(x_1,...,x_n,\theta)中,没办法,就是这么强大。经典统计学认为未知参数θ\theta是常数,而贝叶斯统计认为未知参数θ\theta是一个随机变量,这样,样本X1,...XnX_1,...X_n的联合密度函数就是在给定θ\theta的条件下的条件密度函数,称为似然函数,即L(xθ)=f(x1,...,xn,θ)L(x| \theta)=f(x_1,...,x_n,\theta),由于θ\theta是随机变量,故它也具有自己的分布,我们称之为先验分布,这里,用π(θ)\pi(\theta)来表示,一般是由参数的先验信息来确定的,这个地方,就有点神秘了,这里重点理解贝叶斯定理,对如何确定π(θ)\pi(\theta)不做过多的介绍。
于是,我们看出,上述提到了两类信息:θ\theta的先验信息,还有样本的抽样信息。前面已经说过,联合密度具有综合所有信息的功能,所以,下面给出θ\thetaX1,...XnX_1,...X_n的联合密度函数:h(x,θ)=L(xθ)π(θ)h(x,\theta)=L(x| \theta)\pi(\theta),于是,我们便可以得到密度形式的贝叶斯定理:
π(θx)=L(xθ)π(θ)ΘL(xθ)π(θ)\pi(\theta|x)=\frac{L(x| \theta)\pi(\theta)}{\int_{\Theta}L(x| \theta)\pi(\theta)},称为后验密度函数。

参考文献
[1] 贝叶斯统计学及其应用,韩明,同济大学出版社,2015.6.

展开阅读全文

没有更多推荐了,返回首页