溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于人工智能的貝葉斯分類算法

發(fā)布時間:2020-06-06 12:28:02 來源:網(wǎng)絡(luò) 閱讀:639 作者:nineteens 欄目:編程語言

  基于人工智能的貝葉斯分類算法

  貝爾斯算法的應(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%以上就可以進行使用.


向AI問一下細節(jié)

免責(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)容。

AI