朴素贝叶斯分类

假设要对邮件进行分类(spam/non-spam)。为了用向量描述我们的邮件,可以保存所有训练集中的每一个单词,总共有n个不同的单词(比如说总共有50000个不同的单词,通常对于一些叫做stop-word的词不做统计,因为它们一般不提供有用的信息,比如the、a、is这种),那么一封邮件就可以用一个n维的向量表示,邮件中有某个词(字典中的第i个词),那么向量的第i维就是1,否则是0,比如:

类标签y只有0、1两种值,即

对于一封新来的邮件,有判断它是否是垃圾邮件,我们计算p(y=1|x)与p(y=0|x),看看哪个大。贝叶斯分类中用贝叶斯公式计算p(y|x),所以这种算法其实是属于Generative Learning Algorithm。由贝叶斯公式(说白了就是用先验算后验):

p(y)的计算通常用训练集中某一类的总数除以训练样本总数,比如y=1的有m1个,训练样本有m个,那么p(y=1)=m1/m。然而对于p(x|y)的计算我还有些搞不清。

朴素贝叶斯假设:p(x1, x2,.., xn|y) = p(x1|y)...p(xn|y)(x1,x2, ..., xn为x的各个分量),也就是条件独立,当i != j时,p(xi|y, xj) = p(xi|y),在给定y的条件下,xi出现不出现与xj无关,因此一般情况下可以这样写(下面式子已经假设总共有c个类标签,不限于两个了):


因为分子不管y是什么,分子都是p(x)(这里先不管分子是0的情况,因为有时某个词在训练集中没有出现,但在心邮件中出现了,我们就可能认为它的概率是0,一般用拉普拉斯平滑解决这个问题),所以只要计算分子,然后取使得分子较大的类标签:

唉,其他以后再补上~~~


最近在看《Machine Learning for Hackers》,补上一些代码:

为了方便,不处理邮件的header,截取第一个空行一下的文本,最后paste合并为一个字符向量,R代码如下:

get.msg <- function(path) {
con <- file(path, open="rt", encoding="latin1")
text <- readLines(con)
# The message always begins after the first full line break
msg <- text[seq(which(text=="")[1]+1,length(text),1)]
close(con)
return(paste(msg, collapse="\n"))
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值