一. 朴素贝叶斯
朴素贝叶斯中的朴素一词的来源就是假设各特征之间相互独立。这一假设使得朴素贝叶斯算法变得简单,但有时会牺牲一定的分类准确率。
首先给出贝叶斯公式:P(A|B)=(P(B|A)/P(A)*P(B)
可以先记住这个公式,后面会在实际的情况下做具体解释的,先根据如下的数据集做两个题目练习下
- 随机选择一个人是both的概率是多少? ===> P(both)=5/10=1/2
- 在购买类别i001上午类别下选择理由是both的概率是多少? =====> 算出可以和下面的结果去比较
- 思考:当某人的主要兴趣是健康,当前的锻炼级别适中,动机中等,习惯于技术设备,那么如何利用朴素贝叶斯的方法推荐给他
现在我们主要就问题2来分析一下这个模型如何建立,但是在了解之前还是要先知道朴素贝叶斯是如何进行预测做简单说明,我先看第一个列Main Interest如何划分类别的,现在这个类中有很多特征现在我给定的预测值是both,现在我就只要循环要分类的种类,分别计算P(both|i001),P(both|i500)这两个的条件概率,比较这两个条件概率的大小,那个大我就把both归为那个结果。
现在我们来看问题2:当购买i001下的爱好是both的概率,
我们可以先求出i001出现的次数,可以用一个字典将其存好,格式是classes==>{i001:次数,i500:次数},然后我们要求出在i001的栏目下面出现both的次数 ,我们可以这么设计 counts==>{ i001:列:{“both”:次数}} 这样P(both|i001)=counts.get(i001).get(列).get(both)/classes.get(i001) 我们把这个概率统一为条件概率
现在我们涉及多列,我们可以使用多项式的模型,就是先验概率*每一个列的条件概率 累乘
我们再来看目标 我们要根据both来预测哪一个类别 P(i001|both),根据公式,我们还要求出 P(i001)的概率,所以我们要计算整个项目的条数total,所以P(i001)=classes.get(“i001”)/total,我们将其看成是先验概率
现在我们可以来根据这个来写代码了,我会对代码做很详细的解释
class MyNaiveBayesClassifier():
#filename文件名 dataForamt文件格式 attr attr attr attr class 主要是要区分哪一个是类别
def __init__(self,filename,dataFormat):
total=0 #类别总数
#格式为 {i001:次数,"i500":次数} 先验概率和条件概率的计算都离不开它
classes={
}
#格式为 {'i001':列:{appearance:次数,both:次数}}
counts={
}
#P(i001)=classes.get('i001')/total
self.prior={
}#先验概率
#用来计算条件概率 P(both|i001)=counts.get(i001).get(列).get(both)/classes.get(i001)
self.condition={
} #条件概率
self.format=dataFormat.strip().split("\t") #解析格式
#读文件
f=open(filename,'r',encoding="utf8")
lines=f.readlines()#读取到文件 一行一行的读
f.close()
#循环每一行数据
for line in lines:
total=total+1#统计总数
fields=line.strip().split('\t') #一行中的每一列
vector=[]#用来存储每一行中的attr类目下面的特征