訂閱
糾錯(cuò)
加入自媒體

基于樸素貝葉斯自動(dòng)過(guò)濾垃圾廣告

貝葉斯定理

貝葉斯定理是關(guān)于事件A和事件B的條件概率。先認(rèn)識(shí)一下這幾個(gè)符號(hào):

P(A|B):表示在事件B發(fā)生的情況下事件A發(fā)生的概率

P(B|A):表示在事件A發(fā)生的情況下事件B發(fā)生的概率

通常在已知P(A|B)的情況下,計(jì)算P(B|A)的值,此時(shí)P(A|B)可以稱(chēng)為先驗(yàn)概率,P(B|A)稱(chēng)為后驗(yàn)概率。

這個(gè)時(shí)候貝葉斯定理就登場(chǎng)啦:

通過(guò)這個(gè)定理我們就可以計(jì)算出P(B|A)的值。舉個(gè)栗子:

一座別墅在過(guò)去的 20 年里一共發(fā)生過(guò) 2 次被盜,別墅的主人有一條狗,狗平均每周晚上叫 3 次,在盜賊入侵時(shí)狗叫的概率被估計(jì)為 0.9,在狗叫的時(shí)候發(fā)生入侵的概率是多少?

我們假設(shè) A 事件為狗在晚上叫,B 為盜賊入侵,則以天為單位統(tǒng)計(jì),P(A) = 3/7,P(B) = 2/(20*365) = 2/7300,P(A|B) = 0.9,按照公式很容易得出結(jié)果:P(B|A) = 0.9*(2/7300) / (3/7) = 0.00058

貝葉斯定理延伸

其實(shí)到這里只是貝葉斯定理的簡(jiǎn)單版,下面來(lái)看看它的一般版。一般事件B的發(fā)生不止有一個(gè)影響因素,比如事件B為早上是否吃早餐,那么事件A1可以為幾點(diǎn)起床,A2表示為早上是否有課,A3天氣是否寒冷,...An食堂早餐賣(mài)到幾點(diǎn),這n個(gè)事件共同影響事件B是否吃早飯的發(fā)生,此時(shí)各事件的概率就發(fā)生了變化:

P(A)=P(A1,A2,A3,...An)

P(A|B)=P(A1,A2,A3,...An|B)

假設(shè)A1,A2,A3,...An都有兩種結(jié)果,那么一共有2^n個(gè)結(jié)果,對(duì)應(yīng)需要的樣本數(shù)也是呈指數(shù)增加,這顯然是不合實(shí)際的,這時(shí),就提出了半樸素貝葉斯和樸素貝葉斯。

這兩個(gè)定理都有樸素二字,這二字什么意思呢?白話(huà)一點(diǎn)就是簡(jiǎn)化的意思,將A1,A2,A3,...An這n個(gè)事件的關(guān)聯(lián)切斷,假設(shè)它們是相互獨(dú)立的,即P(A)=P(A1,A2,A3,...An)=P(A1)P(A2)P(A3)...P(An);

P(A|B)=P(A1,A2,A3,...An|B)=

P(A1|B)P(A2|B)P(A3|B)...P(An|B)

這么一樸素,整個(gè)過(guò)程簡(jiǎn)單了不止一點(diǎn)點(diǎn)。但是事件A1可以為幾點(diǎn)起床和事件A2表示為早上是否有課真的一點(diǎn)關(guān)聯(lián)都沒(méi)有嗎?肯定是有關(guān)聯(lián)的,將相關(guān)性很高的一些事件提出,P(A)=P(A1,A2,A3,...An)=

P(A1)P(A2)P(A3)...P(An)P(A1A2);既不忽略事件的相關(guān)性,又擁有樸素的特性,這就叫半樸素貝葉斯。

半樸素貝葉斯

樸素貝葉斯分類(lèi)的正式定義如下:

1、設(shè)

為一個(gè)待分類(lèi)項(xiàng),而每個(gè)a為x的一個(gè)特征屬性。

2、有類(lèi)別集合

3、計(jì)算

4、如果

基于屬性條件獨(dú)立性假設(shè),現(xiàn)在來(lái)計(jì)算P(y1|x),P(y2|x),...P(yn|x)。

對(duì)于所有類(lèi)別來(lái)說(shuō)P(x)是相同的,因此只需計(jì)算分子部分。

在實(shí)際計(jì)算時(shí),為了避免下溢(小數(shù)點(diǎn)位數(shù)過(guò)高),一般會(huì)對(duì)等式兩邊同時(shí)進(jìn)行Ln變形,將*變?yōu)椋贿@里ln為一個(gè)增函數(shù),因此可以保證不改變P(yn|x)的大小排序。

另一個(gè)需要注意的點(diǎn)是:樣本數(shù)是有限的,不可能包括所有的情形,這時(shí)會(huì)出現(xiàn)P(xn|yi)=0,但是這種情況不出現(xiàn)是不等價(jià)于不發(fā)生的,這是用到拉普拉斯修正進(jìn)行平滑:

P(xn|yi)=(N(結(jié)果yi發(fā)生的前提下xn發(fā)生的次數(shù))+1)/(結(jié)果yi發(fā)生的次數(shù)+屬性xn所有可能的取值)

數(shù)據(jù)預(yù)處理

上圖是這次要用到的原始數(shù)據(jù),一行代表一則廣告。ham代表有用的廣告,spam代表垃圾短信。預(yù)處理一共有三部:

第一步:將數(shù)據(jù)讀入進(jìn)來(lái)。

def read_txt():
  file = 'C:/Users/伊雅/Desktop/bayes.txt'
  with open(file, encoding='utf-8') as f:
      con = f.readlines()
  return con

第二步:廣告存到dataset中,分類(lèi)結(jié)果存儲(chǔ)到txt_class中,得到一個(gè)詞匯表將dataset中的廣告用于split為一個(gè)一個(gè)的單詞,并將長(zhǎng)度小于1的單詞去掉(a)

def create_word_list(con):
  reg = re.compile(r'W*')
  dataset = []
  wordlist = set([])
  txt_class = []
  for i in con[1:]:
      dataset.a(chǎn)ppend(re.split(reg, i)[1:])
      wordlist = wordlist | set(re.split(reg, i)[1:])
      if re.split(reg, i)[0]=='ham':#有用的郵件
          txt_class.a(chǎn)ppend(1)
      else:#垃圾郵件
          txt_class.a(chǎn)ppend(0)
  wordlist=[i for i in wordlist if len(i)>2]
  return dataset,wordlist,txt_class

第三步:對(duì)每一個(gè)廣告做循環(huán),通過(guò)函數(shù)words_vec輸入?yún)?shù)為每則廣告的單詞以及詞匯表wordlists,返回一個(gè)文檔向量,向量的每一個(gè)元素為0或1,分別表示詞匯表中的單詞在廣告次中是否出現(xiàn),如果出現(xiàn)該單詞的index則更新為1,否則則為0。

def words_vec(txt,wordlist):
  returnvec=[0]*len(wordlist)
  for word in txt:
      if word in wordlist:
          returnvec[list(wordlist).index(word)]=1
  return returnvec

經(jīng)過(guò)這三步把單詞文本轉(zhuǎn)化為了數(shù)學(xué)向量,大大簡(jiǎn)化了計(jì)算。

1  2  下一頁(yè)>  
聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

    掃碼關(guān)注公眾號(hào)
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯(cuò)
    x
    *文字標(biāo)題:
    *糾錯(cuò)內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

    粵公網(wǎng)安備 44030502002758號(hào)