亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python實(shí)現(xiàn)基于樸素貝葉斯的垃圾分類算法

 更新時(shí)間:2019年07月09日 11:13:43   作者:仁者樂(lè)山智者樂(lè)水  
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)基于樸素貝葉斯的垃圾分類算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、模型方法

       本工程采用的模型方法為樸素貝葉斯分類算法,它的核心算法思想基于概率論。我們稱之為“樸素”,是因?yàn)檎麄€(gè)形式化過(guò)程只做最原始、最簡(jiǎn)單的假設(shè)。樸素貝葉斯是貝葉斯決策理論的一部分,所以講述樸素貝葉斯之前有必要快速了解一下貝葉斯決策理論。假設(shè)現(xiàn)在我們有一個(gè)數(shù)據(jù)集,它由兩類數(shù)據(jù)組成,數(shù)據(jù)分布如下圖所示。

        我們現(xiàn)在用p1(x,y)表示數(shù)據(jù)點(diǎn)(x,y)屬于類別1(圖中用圓點(diǎn)表示的類別)的概率,用p2(x,y)表示數(shù)據(jù)點(diǎn)(x,y)屬于類別2(圖中用三角形表示的類別)的概率,那么對(duì)于一個(gè)新數(shù)據(jù)點(diǎn)(x,y),可以用下面的規(guī)則來(lái)判斷它的類別:

如果 p1(x,y) > p2(x,y),那么類別為1。

如果 p2(x,y) > p1(x,y),那么類別為2。

       也就是說(shuō),我們會(huì)選擇高概率對(duì)應(yīng)的類別。這就是貝葉斯決策理論的核心思想,即選擇具有最高概率的決策。

在本工程中我們可以使用條件概率來(lái)進(jìn)行分類。其條件概率公式如下:

       其中粗體w表示這是一個(gè)向量,它是有多個(gè)值組成。對(duì)于類別i表示分類的個(gè)數(shù),在本工程中i=0時(shí),c0表示非垃圾郵件。i=1時(shí),c1表示垃圾郵件。w展開為一個(gè)個(gè)獨(dú)立特征,那么就可以將上述概率寫作p(w0,w1,w2..wN|ci)。這里假設(shè)所有詞都互相獨(dú)立,該假設(shè)也稱作條件獨(dú)立性假設(shè),它意味著可以使用p(w0|ci)p(w1|ci)p(w2|ci)...p(wN|ci)來(lái)計(jì)算上述概率,這就極大地簡(jiǎn)化了計(jì)算的過(guò)程,這也是被稱為樸素貝葉斯的原因。在本工程中wj代表第i個(gè)單詞特征,而p(wj|ci)則代表了在垃圾郵件(或非垃圾郵件)中,第j個(gè)單詞出現(xiàn)的概率;而p(w|ci)則表示在垃圾郵件(或非垃圾郵件)中的全體向量特征(單詞向量特征)出現(xiàn)的概率;而p(ci| w)則表示在全體向量特征(單詞向量特征)下是垃圾郵件(或非垃圾郵件)的概率。本工程項(xiàng)目主要是計(jì)算p(ci|w);p(ci)則表示是垃圾郵件(或非垃圾郵件)的概率。

二、系統(tǒng)設(shè)計(jì)

數(shù)據(jù)的收集及保存

郵件的收集來(lái)源于網(wǎng)上,保存在email文件夾中。其中email分兩個(gè)子文件,一個(gè)為ham文件夾(保存非垃圾郵件),另一個(gè)為spam文件夾(保存垃圾郵件)。ham與spam中各保存25各郵件,保存格式為x.txt(x為1到25)。

訓(xùn)練集和測(cè)試集的選取

由于收集的郵件個(gè)數(shù)有限,故選取80%的郵件作為訓(xùn)練集,其方式為隨機(jī)選取。剩余20%郵件作為測(cè)試集。

特征向量構(gòu)建

特征向量的構(gòu)建分為兩種,一個(gè)為對(duì)訓(xùn)練集的特征向量構(gòu)建。一個(gè)為測(cè)試集的特征向量構(gòu)建。對(duì)于訓(xùn)練集特征向量只需要分為兩類,因?yàn)猷]件只分為垃圾郵件和非垃圾郵件。特征向量分為對(duì)訓(xùn)練集中所有垃圾郵件中構(gòu)成的特征向量(記做w)和訓(xùn)練集中所有非垃圾郵件構(gòu)成特征向量(記做w')。對(duì)于w的計(jì)算實(shí)際就是統(tǒng)計(jì)所有訓(xùn)練集中垃圾郵件中的每個(gè)單詞的出現(xiàn)情況,出現(xiàn)則次數(shù)加1。其計(jì)數(shù)初值為1,按照正常情況應(yīng)為0,因?yàn)橛玫臉闼刎惾~斯算法,假設(shè)所有詞都互相獨(dú)立 ,就有p(w|ci) = p(w0|ci)p(w1|ci)p(w2|ci)...p(wN|ci)。所以當(dāng)?shù)趇個(gè)單詞wi在其特征向量中沒(méi)有出現(xiàn),則有p(wi|ci) =0,這就導(dǎo)致了p(w|ci)導(dǎo)致結(jié)果的不正確性。所以我們索性將所有單詞默認(rèn)出現(xiàn)1遍,所以從1開始計(jì)數(shù)。對(duì)于w'的計(jì)算和w的計(jì)算方法相同,這里就不在贅述。

對(duì)于測(cè)試集的特征向量構(gòu)建就是對(duì)每個(gè)郵件中單詞出現(xiàn)的次數(shù)進(jìn)行統(tǒng)計(jì),其單詞表可以來(lái)源于50個(gè)郵件中的所有單詞。對(duì)于每一個(gè)郵件中單詞如果出現(xiàn)就加1,其計(jì)數(shù)初值為0。每個(gè)測(cè)試集的郵件都需構(gòu)建特征向量。其特征向量在python中可用列表表示。

構(gòu)建貝葉斯分類器

對(duì)于分類器的訓(xùn)練其目的訓(xùn)練三個(gè)參數(shù)為p1Vect(w中每個(gè)單詞出現(xiàn)的概率構(gòu)成的特征向量)、p0Vect(w'中每個(gè)單詞出現(xiàn)的概率構(gòu)成的特征向量)和pAbusive(訓(xùn)練集中垃圾郵件的概率)。對(duì)于p1Vect、p0Vect計(jì)算可能會(huì)造成下溢出,這 是 由 于 太 多 很 小 的 數(shù) 相 乘 造 成 的 。 當(dāng) 計(jì) 算 乘 積p(w0|ci)p(w1|ci)p(w2|ci)...p(wN|ci)時(shí),由于大部分因子都非常小,所以程序會(huì)下溢出或者得到不正確的答案。一種解決辦法是對(duì)乘積取自然對(duì)數(shù)。在代數(shù)中有l(wèi)n(a*b) = ln(a)+ln(b),于是通過(guò)求對(duì)數(shù)可以避免下溢出或者浮點(diǎn)數(shù)舍入導(dǎo)致的錯(cuò)誤。同時(shí),采用自然對(duì)數(shù)進(jìn)行處理不會(huì)有任何損失。圖1給出函數(shù)f(x)與ln(f(x))的曲線。檢查這兩條曲線,就會(huì)發(fā)現(xiàn)它們?cè)谙嗤瑓^(qū)域內(nèi)同時(shí)增加或者減少,并且在相同點(diǎn)上取到極值。它們的取值雖然不同,但不影響最終結(jié)果。

所以p1Vect = log(w/p1Denom),p0Vect = log(w'/p0Denom),其中p1Denom、p0Denom分別為垃圾郵件中單詞的總數(shù)和非垃圾郵件中單詞的總數(shù)。而pAbusive 就等于訓(xùn)練集中垃圾郵件總數(shù)與訓(xùn)練集中郵件總數(shù)之比。

測(cè)試集驗(yàn)證與評(píng)估

對(duì)于判斷是否為垃圾郵件,只需對(duì)每個(gè)郵件判斷p(c0|w)(不是垃圾郵件的概率)與p(c1|w)(是垃圾郵件的概率)。

q如果p(c0|w) > p(c1|w),那么該郵件為非垃圾郵件。

q如果 p(c0|w) < p(c1|w),那么該郵件為垃圾郵件。

       然而p(ci|w)(i=0或1)的計(jì)算則依賴于p(w|ci)與p(ci)的計(jì)算,p(w)無(wú)需計(jì)算。所以最終結(jié)果依賴于pi = p(w|ci)·p(ci)。由于p(w|ci)很小,可能向下溢出。所以我們?nèi)∫?0為底的對(duì)數(shù)得log(pi) = log(p(w|ci))+log(p(ci)),所以可得以下結(jié)論:

q如果log(p0) > log(p1),那么該郵件為非垃圾郵件。

q如果log(p0) < log(p1),那么該郵件為垃圾郵件。

其中p(w|ci)為在垃圾郵件(或非垃圾郵件)中的全體向量特征(單詞向量特征)出現(xiàn)的概率,p(ci)為訓(xùn)練集中垃圾郵件(或非垃圾郵件)的概率。

三、系統(tǒng)演示與實(shí)驗(yàn)結(jié)果分析對(duì)比

       由訓(xùn)練集(40個(gè))和測(cè)試集(個(gè))的樣本數(shù)目比較小,所以測(cè)試的分類結(jié)果正確性為90%-100%之間,如下圖所示:

        本工程只是對(duì)郵件進(jìn)行二分類,貝葉斯算法也可以處理多分類問(wèn)題,如新聞的分類,如分成軍事、體育、科技等等。當(dāng)然本工程只是對(duì)英文的垃圾郵件分類,但也可以對(duì)中文的垃圾郵件分類(可用python中的jieba的庫(kù)模塊進(jìn)行對(duì)中文分詞)。

四、代碼實(shí)現(xiàn)

#coding=UTF-8
import random
from numpy import *
 
#解析英文文本,并返回列表
def textParse(bigString):
 #將單詞以空格劃分
 listOfTokens = bigString.split()
 #去除單詞長(zhǎng)度小于2的無(wú)用單詞
 return [tok.lower() for tok in listOfTokens if len(tok)>2]
 
#去列表中重復(fù)元素,并以列表形式返回
def createVocaList(dataSet):
 vocabSet = set({})
 #去重復(fù)元素,取并集
 for document in dataSet:
 vocabSet = vocabSet | set(document)
 return list(vocabSet)
 
#統(tǒng)計(jì)每一文檔(或郵件)在單詞表中出現(xiàn)的次數(shù),并以列表形式返回
def setOfWordsToVec(vocabList,inputSet): 
 #創(chuàng)建0向量,其長(zhǎng)度為單詞量的總數(shù)
 returnVec = [0]*len(vocabList)
 #統(tǒng)計(jì)相應(yīng)的詞匯出現(xiàn)的數(shù)量
 for word in inputSet:
 if word in vocabList:
  returnVec[vocabList.index(word)] += 1
 return returnVec
 
#樸素貝葉斯分類器訓(xùn)練函數(shù)
def trainNB0(trainMatrix,trainCategory): 
 #獲取訓(xùn)練文檔數(shù)
 numTrainDocs = len(trainMatrix)
 #獲取每一行詞匯的數(shù)量
 numWords = len(trainMatrix[0])
 #侮辱性概率(計(jì)算p(Ci)),計(jì)算垃圾郵件的比率
 pAbusive = sum(trainCategory)/float(numTrainDocs)
 #統(tǒng)計(jì)非垃圾郵件中各單詞在詞數(shù)列表中出現(xiàn)的總數(shù)(向量形式)
 p0Num = ones(numWords)
 #統(tǒng)計(jì)垃圾郵件中各單詞在詞數(shù)列表中出現(xiàn)的總數(shù)(向量形式)
 p1Num = ones(numWords)
 #統(tǒng)計(jì)非垃圾郵件總單詞的總數(shù)(數(shù)值形式)
 p0Denom = 2.0
 #統(tǒng)計(jì)垃圾郵件總單詞的總數(shù)(數(shù)值形式)
 p1Denom = 2.0
 for i in range(numTrainDocs):
 #如果是垃圾郵件
 if trainCategory[i] == 1:
  p1Num += trainMatrix[i]
  p1Denom +=sum(trainMatrix[i])
 #如果是非垃圾郵件
 else:
  p0Num += trainMatrix[i]
  p0Denom +=sum(trainMatrix[i])
 #計(jì)算每個(gè)單詞在垃圾郵件出現(xiàn)的概率(向量形式)
 p1Vect = log(p1Num/p1Denom)
 #計(jì)算每個(gè)單詞在非垃圾郵件出現(xiàn)的概率(向量形式)
 p0Vect = log(p0Num/p0Denom)  
 return p0Vect,p1Vect,pAbusive
#樸素貝葉斯分類函數(shù)
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):
 p1 = sum(vec2Classify*p1Vec)+log(pClass1)
 p0 = sum(vec2Classify*p0Vec)+log(1.0 - pClass1)
 if p1 > p0:
 return 1
 else :
 return 0
#test
def spamtest():
 #導(dǎo)入并解析文本文件
 docList =[];classList=[];fullText = []
 for i in range(1,26):
 #讀取第i篇垃圾文件,并以列表形式返回
 wordList = textParse(open('email/spam/{0}.txt'.format(i)).read())
 #轉(zhuǎn)化成二維列表
 docList.append(wordList)
 #一維列表進(jìn)行追加
 fullText.extend(wordList)
 #標(biāo)記文檔為垃圾文檔
 classList.append(1)
 #讀取第i篇非垃圾文件,并以列表形式返回
 wordList = textParse(open('email/ham/{0}.txt'.format(i)).read())
 #轉(zhuǎn)化成二維列表
 docList.append(wordList)
 #一維列表進(jìn)行追加
 fullText.extend(wordList)
 #標(biāo)記文檔為非垃圾文檔
 classList.append(0)
 #去除重復(fù)的單詞元素
 vocabList = createVocaList(docList)
 #訓(xùn)練集,選40篇doc
 trainingSet = [x for x in range(50)]
 #測(cè)試集,選10篇doc
 testSet = []
 #選出10篇doc作測(cè)試集
 for i in range(10):
 randIndex = int(random.uniform(0,len(trainingSet)))
 testSet.append(trainingSet[randIndex])
 del trainingSet[randIndex]
 trainMat = [];trainClasses=[]
 #選出40篇doc作訓(xùn)練集
 for docIndex in trainingSet:
 trainMat.append(setOfWordsToVec(vocabList, docList[docIndex]))
 trainClasses.append(classList[docIndex])
 p0V,p1V,pSpam = trainNB0(array(trainMat), array(trainClasses))
 #對(duì)測(cè)試集分類
 errorCount = 0
 for docIndex in testSet:
 wordVector = setOfWordsToVec(vocabList,docList[docIndex])
 if classifyNB(array(wordVector), p0V, p1V, pSpam)!=classList[docIndex]:
  errorCount+=1
 print("錯(cuò)誤率為:{0}".format(float(errorCount)/len(testSet)))
spamtest()

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python中循環(huán)后使用list.append()數(shù)據(jù)被覆蓋問(wèn)題的解決

    Python中循環(huán)后使用list.append()數(shù)據(jù)被覆蓋問(wèn)題的解決

    這篇文章主要給大家介紹了關(guān)于Python中循環(huán)后使用list.append()數(shù)據(jù)被覆蓋問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • 使用python將微信image下.dat文件解密為.png的方法

    使用python將微信image下.dat文件解密為.png的方法

    這篇文章主要介紹了使用python將微信image下.dat文件解密為.png的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 詳解Python如何實(shí)現(xiàn)對(duì)比兩個(gè)Excel數(shù)據(jù)差異

    詳解Python如何實(shí)現(xiàn)對(duì)比兩個(gè)Excel數(shù)據(jù)差異

    這篇文章主要為大家詳細(xì)介紹了Python是如何實(shí)現(xiàn)對(duì)比兩個(gè)Excel數(shù)據(jù)差異的,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2022-12-12
  • Python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫的示例代碼

    Python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫的示例代碼

    本篇文章主要介紹了Python實(shí)現(xiàn)圖片轉(zhuǎn)字符畫的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Python 對(duì)Excel求和、合并居中的操作

    Python 對(duì)Excel求和、合并居中的操作

    這篇文章主要介紹了Python 對(duì)Excel求和、合并居中的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • pip安裝tensorflow的坑的解決

    pip安裝tensorflow的坑的解決

    這篇文章主要介紹了pip安裝tensorflow的坑的解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 在PyCharm中實(shí)現(xiàn)添加快捷模塊

    在PyCharm中實(shí)現(xiàn)添加快捷模塊

    今天小編就為大家分享一篇在PyCharm中實(shí)現(xiàn)添加快捷模塊,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • 解決python3 json數(shù)據(jù)包含中文的讀寫問(wèn)題

    解決python3 json數(shù)據(jù)包含中文的讀寫問(wèn)題

    這篇文章主要介紹了解決python3 json數(shù)據(jù)包含中文的讀寫問(wèn)題,需要的朋友可以參考下
    2021-05-05
  • python中if嵌套命令實(shí)例講解

    python中if嵌套命令實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于python中if嵌套命令實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-02-02
  • 使用Python發(fā)送Post請(qǐng)求以及解析響應(yīng)結(jié)果

    使用Python發(fā)送Post請(qǐng)求以及解析響應(yīng)結(jié)果

    發(fā)送post的請(qǐng)求參考例子很簡(jiǎn)單,實(shí)際遇到的情況卻是很復(fù)雜的,下面這篇文章主要給大家介紹了關(guān)于如何使用Python發(fā)送Post請(qǐng)求以及解析響應(yīng)結(jié)果的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06

最新評(píng)論