基於人工智慧的貝葉斯分類算法
貝爾斯算法的應用:
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穿長褲人數=UP(男生)P(長褲∣男生):U60%100%+UP(女生)P(長褲∣女生):U40%50%=0.8U
穿裙子的總人數=U-0.8U=0.2U穿裙子的總人數=U0.8U=0.2U
如果你只能看見她/他穿的是長褲,但不知道他/她的性別,你能推斷出他/她是男生的概率麼?
那么女生長褲該怎麼計算呢
首先我們先計算出該學校中所有穿長褲的人數
U*P(男生)*P(長褲|男生)+U*P(女生)*P(長褲|女生)UP(男生)P(長褲∣男生)+UP(女生)P(長褲∣女生)
然後我們在算出所有穿長褲的女生
U*P(女生)*P(長褲女生)UP(女生)P(長褲女生)
用所有穿長褲的女生/所有穿長褲的人
P(長褲|女生)=U*P(女生)*P(長褲|女生)/U*P(男生)*P(長褲|男生)+U*P(女生)*G(長褲|女生)P(長褲∣女生)=UP(女生)P(長褲∣女生)/UP(男生)P(長褲∣男生)+UP(女生)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))
簡化:在之前公式中將U約掉,表示所有穿長褲的人可以直接用**P來表示,用P(BC)**來表示所有穿長褲的女生
簡化後公式:
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(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(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)=\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)
分子類比分母也可以這麼寫
最後變化後的公式:
然後我們將數據代入公式
分母相同可將它約掉,垃圾郵件的總似然為:
(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:7
計算出來後,它們比值為6:1
6:7約等於為85.7%,是垃圾郵件的概率為85.7%
3.假設一封郵件中,包含了w1,w2,w3,w4這4個單詞,該如何計算這是垃圾郵件的概率
代入貝葉斯公式中
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)
當我們在計算時發現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
非垃圾郵件的似然為:
(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 = 0while True: line = f.readline() if count == 0: count = count +1 continue if line: 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%以上就可以進行使用.
【1】想領取大數據知識可以關注我下方評論轉發後,留言「資料」。
【2】部分資料有時間限制,抓緊時間吧~、
感謝大家支持!