基于人工智能的贝叶斯分类算法
贝尔斯算法的应用:
1.百度实时路况
2.腾讯新闻分类
3.数据清洗:数据补全
4.数据归类
5.垃圾邮箱
什么是贝叶斯算法
贝尔斯算法就是贝叶斯所研究的逆向概率: 给出一个条件,根据这个条件来推测某一个事件
例子:有一黑盒里面有若干个白球和黑球,当我们取出一个或几个球之后,
观察这些球的颜色,推断出黑白球的比例
通过一些信息推出未知的信息,这就是逆向概率
朴素贝叶斯算法就是应用先前事件的有关数据来估计未来事件发生的概率
根据例题推导贝叶斯分类算法
一所学校中有60%的男生,40%女生.男生全部穿长裤,女生一半穿长裤一半穿短裙,随机挑选一个学生,穿长裤的概率是多少?
假设 学校有U个人,
P(男生)=60%
P(女生)=40%
P(长裤|男生)=100%
P(长裤|女生)=50%
首先我们正向算一下穿长裤的总人数和穿裙子的总人数:
穿长裤人数=U∗P(男生)∗P(长裤∣男生):U∗60%∗100%+U∗P(女生)∗P(长裤∣女生):U∗40%∗50%=0.8U
穿长裤人数=U*P(男生)*P(长裤|男生):U*60\%*100\% +
U*P(女生)*P(长裤|女生):U*40\%*50\%=0.8U
穿长裤人数=U∗P(男生)∗P(长裤∣男生):U∗60%∗100%+U∗P(女生)∗P(长裤∣女生):U∗40%∗50%=0.8U
穿裙子的总人数=U−0.8U=0.2U
穿裙子的总人数=U-0.8U=0.2U
穿裙子的总人数=U−0.8U=0.2U
如果你只能看见她/他穿的是长裤,但不知道他/她的性别,你能推断出他/她是男生的概率么?
那么女生长裤该怎么计算呢
首先我们先计算出该学校中所有穿长裤的人数
U∗P(男生)∗P(长裤∣男生)+U∗P(女生)∗P(长裤∣女生)
U*P(男生)*P(长裤|男生)+U*P(女生)*P(长裤|女生)
U∗P(男生)∗P(长裤∣男生)+U∗P(女生)∗P(长裤∣女生)
然后我们在算出所有穿长裤的女生
U∗P(女生)∗P(长裤女生)
U*P(女生)*P(长裤女生)
U∗P(女生)∗P(长裤女生)
用所有穿长裤的女生/所有穿长裤的人
P(长裤∣女生)=U∗P(女生)∗P(长裤∣女生)/U∗P(男生)∗P(长裤∣男生)+U∗P(女生)∗G(长裤∣女生)
P(长裤|女生)=U*P(女生)*P(长裤|女生)/U*P(男生)*P(长裤|男生)+U*P(女生)*G(长裤|女生)
P(长裤∣女生)=U∗P(女生)∗P(长裤∣女生)/U∗P(男生)∗P(长裤∣男生)+U∗P(女生)∗G(长裤∣女生)
然后进行公式代换并简化,假设
男生=A
女生=B
长裤=C
P(B∣C)=P(B)∗P(C∣B)/(P(A)∗P(C∣A)+P(B)∗P(C∣B))
P(B|C)=P(B)*P(C|B)/(P(A)*P(C|A)+P(B)*P(C|B))
P(B∣C)=P(B)∗P(C∣B)/(P(A)∗P(C∣A)+P(B)∗P(C∣B))
简化:在之前公式中将U约掉,表示所有穿长裤的人可以直接用**P©来表示,用P(BC)**来表示所有穿长裤的女生
简化后公式:
P(B∣C)=P(BC)/P(C)
P(B|C)=P(BC)/P(C)
P(B∣C)=P(BC)/P(C)
进行公式变换
P(AB)=P(B∣C)∗P(C)
P(AB)=P(B|C)*P(C)
P(AB)=P(B∣C)∗P(C)
“|” 左边代表的条件,右边代表的是在这个条件下发生的概率,P(AB)代表的是同时发生的概率
然后我们在进行转换:
P(C)∗P(B∣C)=P(CB)=P(B)∗P(C∣B)
P(C)*P(B|C)=P(CB)=P(B)*P(C|B)
P(C)∗P(B∣C)=P(CB)=P(B)∗P(C∣B)
既然P©*P(B|C)=P(B)*P(C|B),在将公式进行变换
P(C∣B)=P(C)∗P(B∣C)/P(B)
P(C|B)=P(C)*P(B|C)/P(B)
P(C∣B)=P(C)∗P(B∣C)/P(B)
最后这个公式就是我们推导出来的贝叶斯公式
P(A∣B)=P(B∣A)P(A)P(B)
P(A|B)=\frac{P(B|A)P(A)}{P(B)}
P(A∣B)=P(B)P(B∣A)P(A)
基于贝叶斯算法的邮件分类
陈述:100封邮件,80封正常,20封垃圾邮件
问题:1.当接收到一封新的含有"Viagra"这个词的邮件,这封邮件是垃圾邮件的概率
查看分析图:01
首先我们要知道算的Viagra在垃圾邮件中的概率,即P(垃圾邮件|Viagra)
然后代入贝叶斯公式中
P(spam∣Viagra)=P(Viagra∣spam)P(spam)P(Viagra)
P(spam|Viagra)=\frac{P(Viagra|spam)P(spam)}{P(Viagra)}
P(spam∣Viagra)=P(Viagra)P(Viagra∣spam)P(spam)
在这个公式左边为 后验概率 公式右边为 先验概率
02
根据概率表将数据套入公式之中
P(垃圾邮件|Viagra)=P(Viagra|垃圾邮件)P(垃圾邮件)/P(Viagra)=(4/20)(20/100)/(5/100)=0.8
得出是垃圾邮件的概率是0.8
这种情况下,我们只考虑的了一个单词,如果包含多个单词,该如何计算:
2.如果一封邮件中,含有W1,W4这个单词,但没有出现W2,W3这俩个单词,求这是垃圾邮件的概率
根据问题推出公式
但是在概率表中发现,没有符合分母的这种情况,该如何解决?
有句话是这么说的:*如果俩个事件是相互独立的,那么就可以写为P(AB)=P(A)P(B),前提是这俩个事件是相互独立的.
而分母的这种情况,正好符合上述情况,那么就可以写为:
P(w1)∗P(!w2)∗P(!w3)∗P(w4)
P(w1)*P(!w2)*P(!w3)*P(w4)
P(w1)∗P(!w2)∗P(!w3)∗P(w4)
分子类比分母也可以这么写
最后变化后的公式:
然后我们将数据代入公式
分母相同可将它约掉,垃圾邮件的总似然为:
(4/20)∗(10/20)∗(20/20)∗(12/20)∗(20/100)=0.012
(4/20)*(10/20)*(20/20)*(12/20)*(20/100)=0.012
(4/20)∗(10/20)∗(20/20)∗(12/20)∗(20/100)=0.012
在这种情况下6:7
非垃圾邮件的总似然为:
(1/80)∗(66//80)∗(71/80)∗(23/80)∗(80/100)=0.002
(1/80)*(66//80)*(71/80)*(23/80)*(80/100)=0.002
(1/80)∗(66//80)∗(71/80)∗(23/80)∗(80/100)=0.002
这种情况下是1:7
计算出来后,它们比值为6:1
6:7约等于为85.7%,是垃圾邮件的概率为85.7%
3.假设一封邮件中,包含了w1,w2,w3,w4这4个单词,该如何计算这是垃圾邮件的概率
代入贝叶斯公式中
P(spam∣w1,w2,w3,w4)=P(w1,w2,w3,w4)∗P(spam)P(w1,w2,w3,w4)
P(spam|w1,w2,w3,w4)=\frac{P(w1,w2,w3,w4)*P(spam)}{P(w1,w2,w3,w4)}
P(spam∣w1,w2,w3,w4)=P(w1,w2,w3,w4)P(w1,w2,w3,w4)∗P(spam)
然后我们在把数据代入公式中计算,先算分子
P(w1∣spam)∗P(w2∣spam)∗P(w3∣spam)∗P(w4∣spam)
P(w1|spam)*P(w2|spam)*P(w3|spam)*P(w4|spam)
P(w1∣spam)∗P(w2∣spam)∗P(w3∣spam)∗P(w4∣spam)
当我们在计算时发现W3出现的概率是0,那么这个公式的结果就是0,但是这就成为了一个必然事件,仅仅因为W3的概率,而否定所有其他情况,那么这个结论就是不准确的.
这时,我们就需要拉普拉斯估计来解决这个问题.
拉普拉斯估计:
拉普拉斯估计本质上是给频率表中的每一个计数加一个较小的数,这样就避免了每一个类中每个特征发生概率为零的情况.
明白了拉普拉斯估计,然后代入到问题当中:
在添加4封垃圾邮件,每一封垃圾邮件中只包含一个单词.当我们添加4封垃圾邮件后,还要在添加16封正常邮件,
因为在表中可以看出,垃圾邮件和正常邮件的比值是4:1,所以我们要同比的添加16封正常邮件
然后,我们把改变后的值在代入公式当中进行计算
垃圾邮件的似然为:
(5/24)∗(11/24)∗(1/24)∗(13/24)∗(20/108)=0.0004
(5/24)*(11/24)*(1/24)*(13/24)*(20/108)=0.0004
(5/24)∗(11/24)∗(1/24)∗(13/24)∗(20/108)=0.0004
非垃圾邮件的似然为:
(2/84)∗(15/84)∗(9/84)∗(24/84)∗(80/100)=0.0001
(2/84)*(15/84)*(9/84)*(24/84)*(80/100)=0.0001
(2/84)∗(15/84)∗(9/84)∗(24/84)∗(80/100)=0.0001
使用拉普拉斯估计后 垃圾邮件的概率为80%,是非垃圾邮件的概率为20%
使用Python来进行测试
在运行之前需要添加一个sklearn模块,在PyCharm中的settings中的Plugins中搜索
sklearn并进行安装
截取部分代码
from skearn naive_bayes import MultinomialNB #sklearn模块
from sklearn feature_extraction.text import CountVectorizer
# 读取文本构建语料库
corpus = []
labels = []
courpus_test = []
labels_test = []
f = codecs.open("d:/sms_spam.txt", "rb") #读取数据集
count = 0
while True:
line = f.readline()
if count == 0:
count = count +1
continue
if line: 无锡人流多少钱 http://mobile.bhnfkyy
count = count +1
line = line.split(",")
lable = line[0]
sentence = line[1]
if count > 5550: #训练数据集次数,总共是5560条数据,拿5550条进行训练,剩下10条来进行测试
corpus_test.append(sentence)
if "ham"==label:
labels_test.append(0) #0表示正常,1表示垃圾邮件
elif "spam"==label:
labels_test.append(1)
else
corpus.append(sentence)
if"ham" == label:
labels.append(0)
elif "spam" == label:
labels.append(1)
else :
break
vectorizer=CounVectorizer()
fea_train = vectorizer
vectorizer=CountVectorizer()
fea_train = vectorizer.fit_transform(corpus)
print vectorizer.get_feature_names()
print fea_train.toarray()
#
vectorizer2=CountVectorizer(vocabulary=vectorizer.vocabulary_)
fea_test = vectorizer2.fit_transform(corpus_test)
# print fea_test
print fea_test.toarray()
# print vectorizer2.get_feature_names()
#create the Multinomial Naive Bevesian Classifire 朴素贝叶斯
clf = MultinomialNB(alpha = 1) #这里用到拉普拉斯估计,给每一个值加一个较小的数,一般为1
#clf就是模型 这个模型中就保存着一个概率表
clf.fit(fea_train.labels) #将训练数据传过来
#predict()就是根据贝尔斯算法来计算
pred = clf.predict(fea_test) #预测,将训练数据传进去
for p in pred:
if p == 0: #如果预测出来为0,则是正常邮件,否则为垃圾邮件
print ("正常邮件")
else:
print ("垃圾邮件")
然后我们来执行,查看结果
04
然后和数据集进行对比,发现只有10%的错误率,正确率达到了90%,一般来说一个模板达到80%以上就可以进行使用.
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。