您好,登錄后才能下訂單哦!
基于人工智能的貝葉斯分類算法
貝爾斯算法的應(yīng)用:
1.百度實時路況
2.騰訊新聞分類
3.數(shù)據(jù)清洗:數(shù)據(jù)補全
4.數(shù)據(jù)歸類
5.垃圾郵箱
什么是貝葉斯算法
貝爾斯算法就是貝葉斯所研究的逆向概率: 給出一個條件,根據(jù)這個條件來推測某一個事件
例子:有一黑盒里面有若干個白球和黑球,當(dāng)我們?nèi)〕鲆粋€或幾個球之后,
觀察這些球的顏色,推斷出黑白球的比例
通過一些信息推出未知的信息,這就是逆向概率
樸素貝葉斯算法就是應(yīng)用先前事件的有關(guān)數(shù)據(jù)來估計未來事件發(fā)生的概率
根據(jù)例題推導(dǎo)貝葉斯分類算法
一所學(xué)校中有60%的男生,40%女生.男生全部穿長褲,女生一半穿長褲一半穿短裙,隨機挑選一個學(xué)生,穿長褲的概率是多少?
假設(shè) 學(xué)校有U個人,
P(男生)=60%
P(女生)=40%
P(長褲|男生)=100%
P(長褲|女生)=50%
首先我們正向算一下穿長褲的總?cè)藬?shù)和穿裙子的總?cè)藬?shù):
穿長褲人數(shù)=U?P(男生)?P(長褲∣男生):U?60%?100%+U?P(女生)?P(長褲∣女生):U?40%?50%=0.8U
穿長褲人數(shù)=U*P(男生)*P(長褲|男生):U*60\%*100\% +
U*P(女生)*P(長褲|女生):U*40\%*50\%=0.8U
穿長褲人數(shù)=U?P(男生)?P(長褲∣男生):U?60%?100%+U?P(女生)?P(長褲∣女生):U?40%?50%=0.8U
穿裙子的總?cè)藬?shù)=U?0.8U=0.2U
穿裙子的總?cè)藬?shù)=U-0.8U=0.2U
穿裙子的總?cè)藬?shù)=U?0.8U=0.2U
如果你只能看見她/他穿的是長褲,但不知道他/她的性別,你能推斷出他/她是男生的概率么?
那么女生長褲該怎么計算呢
首先我們先計算出該學(xué)校中所有穿長褲的人數(shù)
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(長褲∣女生)
然后進行公式代換并簡化,假設(shè)
男生=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)
“|” 左邊代表的條件,右邊代表的是在這個條件下發(fā)生的概率,P(AB)代表的是同時發(fā)生的概率
然后我們在進行轉(zhuǎn)換:
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)
最后這個公式就是我們推導(dǎo)出來的貝葉斯公式
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.當(dāng)接收到一封新的含有"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
根據(jù)概率表將數(shù)據(jù)套入公式之中
P(垃圾郵件|Viagra)=P(Viagra|垃圾郵件)P(垃圾郵件)/P(Viagra)=(4/20)(20/100)/(5/100)=0.8
得出是垃圾郵件的概率是0.8
這種情況下,我們只考慮的了一個單詞,如果包含多個單詞,該如何計算:
2.如果一封郵件中,含有W1,W4這個單詞,但沒有出現(xiàn)W2,W3這倆個單詞,求這是垃圾郵件的概率
根據(jù)問題推出公式
但是在概率表中發(fā)現(xiàn),沒有符合分母的這種情況,該如何解決?
有句話是這么說的:*如果倆個事件是相互獨立的,那么就可以寫為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)
分子類比分母也可以這么寫
最后變化后的公式:
然后我們將數(shù)據(jù)代入公式
分母相同可將它約掉,垃圾郵件的總似然為:
(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.假設(shè)一封郵件中,包含了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)
然后我們在把數(shù)據(jù)代入公式中計算,先算分子
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)
當(dāng)我們在計算時發(fā)現(xiàn)W3出現(xiàn)的概率是0,那么這個公式的結(jié)果就是0,但是這就成為了一個必然事件,僅僅因為W3的概率,而否定所有其他情況,那么這個結(jié)論就是不準(zhǔn)確的.
這時,我們就需要拉普拉斯估計來解決這個問題.
拉普拉斯估計:
拉普拉斯估計本質(zhì)上是給頻率表中的每一個計數(shù)加一個較小的數(shù),這樣就避免了每一個類中每個特征發(fā)生概率為零的情況.
明白了拉普拉斯估計,然后代入到問題當(dāng)中:
在添加4封垃圾郵件,每一封垃圾郵件中只包含一個單詞.當(dāng)我們添加4封垃圾郵件后,還要在添加16封正常郵件,
因為在表中可以看出,垃圾郵件和正常郵件的比值是4:1,所以我們要同比的添加16封正常郵件
然后,我們把改變后的值在代入公式當(dāng)中進行計算
垃圾郵件的似然為:
(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
# 讀取文本構(gòu)建語料庫
corpus = []
labels = []
courpus_test = []
labels_test = []
f = codecs.open("d:/sms_spam.txt", "rb") #讀取數(shù)據(jù)集
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: #訓(xùn)練數(shù)據(jù)集次數(shù),總共是5560條數(shù)據(jù),拿5550條進行訓(xùn)練,剩下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) #這里用到拉普拉斯估計,給每一個值加一個較小的數(shù),一般為1
#clf就是模型 這個模型中就保存著一個概率表
clf.fit(fea_train.labels) #將訓(xùn)練數(shù)據(jù)傳過來
#predict()就是根據(jù)貝爾斯算法來計算
pred = clf.predict(fea_test) #預(yù)測,將訓(xùn)練數(shù)據(jù)傳進去
for p in pred:
if p == 0: #如果預(yù)測出來為0,則是正常郵件,否則為垃圾郵件
print ("正常郵件")
else:
print ("垃圾郵件")
然后我們來執(zhí)行,查看結(jié)果
04
然后和數(shù)據(jù)集進行對比,發(fā)現(xiàn)只有10%的錯誤率,正確率達到了90%,一般來說一個模板達到80%以上就可以進行使用.
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。