欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python編程之基于概率論的分類方法:樸素貝葉斯

 更新時(shí)間:2017年11月11日 16:24:34   作者:imze5z  
這篇文章主要介紹了Python編程之基于概率論的分類方法:樸素貝葉斯,簡(jiǎn)單介紹了其概述,貝葉斯理論和條件概率,以及樸素貝葉斯的原理等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。

概率論啊概率論,差不多忘完了。

基于概率論的分類方法:樸素貝葉斯

1. 概述

貝葉斯分類是一類分類算法的總稱,這類算法均以貝葉斯定理為基礎(chǔ),故統(tǒng)稱為貝葉斯分類。本章首先介紹貝葉斯分類算法的基礎(chǔ)——貝葉斯定理。最后,我們通過實(shí)例來討論貝葉斯分類的中最簡(jiǎn)單的一種: 樸素貝葉斯分類。

2. 貝葉斯理論 & 條件概率

2.1 貝葉斯理論

我們現(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ī)則來判斷它的類別:

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

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

2.1.2 條件概率

如果你對(duì) p(x,y|c1) 符號(hào)很熟悉,那么可以跳過本小節(jié)。

有一個(gè)裝了 7 塊石頭的罐子,其中 3 塊是白色的,4 塊是黑色的。如果從罐子中隨機(jī)取出一塊石頭,那么是白色石頭的可能性是多少?由于取石頭有 7 種可能,其中 3 種為白色,所以取出白色石頭的概率為 3/7 。那么取到黑色石頭的概率又是多少呢?很顯然,是 4/7 。我們使用 P(white) 來表示取到白色石頭的概率,其概率值可以通過白色石頭數(shù)目除以總的石頭數(shù)目來得到。

如果這 7 塊石頭如下圖所示,放在兩個(gè)桶中,那么上述概率應(yīng)該如何計(jì)算?

計(jì)算 P(white) 或者 P(black) ,如果事先我們知道石頭所在桶的信息是會(huì)改變結(jié)果的。這就是所謂的條件概率(conditional probablity)。假定計(jì)算的是從 B 桶取到白色石頭的概率,這個(gè)概率可以記作 P(white|bucketB) ,我們稱之為“在已知石頭出自 B 桶的條件下,取出白色石頭的概率”。很容易得到,P(white|bucketA) 值為 2/4 ,P(white|bucketB) 的值為 1/3 。

條件概率的計(jì)算公式如下:

P(white|bucketB) = P(white and bucketB) / P(bucketB)

首先,我們用 B 桶中白色石頭的個(gè)數(shù)除以兩個(gè)桶中總的石頭數(shù),得到 P(white and bucketB) = 1/7 .其次,由于 B 桶中有 3 塊石頭,而總石頭數(shù)為 7 ,于是 P(bucketB) 就等于 3/7 。于是又 P(white|bucketB) = P(white and bucketB) / P(bucketB) = (1/7) / (3/7) = 1/3 。

另外一種有效計(jì)算條件概率的方法稱為貝葉斯準(zhǔn)則。貝葉斯準(zhǔn)則告訴我們?nèi)绾谓粨Q條件概率中的條件與結(jié)果,即如果已知 P(x|c),要求 P(c|x),那么可以使用下面的計(jì)算方法:

使用條件概率來分類

上面我們提到貝葉斯決策理論要求計(jì)算兩個(gè)概率 p1(x, y) 和 p2(x, y):

如果 p1(x, y) > p2(x, y), 那么屬于類別 1;
如果 p2(x, y) > p1(X, y), 那么屬于類別 2.

這并不是貝葉斯決策理論的所有內(nèi)容。使用 p1() 和 p2() 只是為了盡可能簡(jiǎn)化描述,而真正需要計(jì)算和比較的是 p(c1|x, y) 和 p(c2|x, y) .這些符號(hào)所代表的具體意義是: 給定某個(gè)由 x、y 表示的數(shù)據(jù)點(diǎn),那么該數(shù)據(jù)點(diǎn)來自類別 c1 的概率是多少?數(shù)據(jù)點(diǎn)來自類別 c2 的概率又是多少?注意這些概率與概率 p(x, y|c1) 并不一樣,不過可以使用貝葉斯準(zhǔn)則來交換概率中條件與結(jié)果。具體地,應(yīng)用貝葉斯準(zhǔn)則得到:

使用上面這些定義,可以定義貝葉斯分類準(zhǔn)則為:

如果 P(c1|x, y) > P(c2|x, y), 那么屬于類別 c1;
如果 P(c2|x, y) > P(c1|x, y), 那么屬于類別 c2.

在文檔分類中,整個(gè)文檔(如一封電子郵件)是實(shí)例,而電子郵件中的某些元素則構(gòu)成特征。我們可以觀察文檔中出現(xiàn)的詞,并把每個(gè)詞作為一個(gè)特征,而每個(gè)詞的出現(xiàn)或者不出現(xiàn)作為該特征的值,這樣得到的特征數(shù)目就會(huì)跟詞匯表中的詞的數(shù)目一樣多。

我們假設(shè)特征之間 相互獨(dú)立 。所謂 獨(dú)立(independence) 指的是統(tǒng)計(jì)意義上的獨(dú)立,即一個(gè)特征或者單詞出現(xiàn)的可能性與它和其他單詞相鄰沒有關(guān)系,比如說,“我們”中的“我”和“們”出現(xiàn)的概率與這兩個(gè)字相鄰沒有任何關(guān)系。這個(gè)假設(shè)正是樸素貝葉斯分類器中 樸素(naive) 一詞的含義。樸素貝葉斯分類器中的另一個(gè)假設(shè)是,每個(gè)特征同等重要。

Note: 樸素貝葉斯分類器通常有兩種實(shí)現(xiàn)方式: 一種基于伯努利模型實(shí)現(xiàn),一種基于多項(xiàng)式模型實(shí)現(xiàn)。這里采用前一種實(shí)現(xiàn)方式。該實(shí)現(xiàn)方式中并不考慮詞在文檔中出現(xiàn)的次數(shù),只考慮出不出現(xiàn),因此在這個(gè)意義上相當(dāng)于假設(shè)詞是等權(quán)重的。

2.2 樸素貝葉斯場(chǎng)景

機(jī)器學(xué)習(xí)的一個(gè)重要應(yīng)用就是文檔的自動(dòng)分類。

在文檔分類中,整個(gè)文檔(如一封電子郵件)是實(shí)例,而電子郵件中的某些元素則構(gòu)成特征。我們可以觀察文檔中出現(xiàn)的詞,并把每個(gè)詞作為一個(gè)特征,而每個(gè)詞的出現(xiàn)或者不出現(xiàn)作為該特征的值,這樣得到的特征數(shù)目就會(huì)跟詞匯表中的詞的數(shù)目一樣多。

樸素貝葉斯是上面介紹的貝葉斯分類器的一個(gè)擴(kuò)展,是用于文檔分類的常用算法。下面我們會(huì)進(jìn)行一些樸素貝葉斯分類的實(shí)踐項(xiàng)目。

2.3 樸素貝葉斯 原理

樸素貝葉斯 工作原理

提取所有文檔中的詞條并進(jìn)行去重
獲取文檔的所有類別
計(jì)算每個(gè)類別中的文檔數(shù)目
對(duì)每篇訓(xùn)練文檔:

對(duì)每個(gè)類別:
如果詞條出現(xiàn)在文檔中-->增加該詞條的計(jì)數(shù)值(for循環(huán)或者矩陣相加)
增加所有詞條的計(jì)數(shù)值(此類別下詞條總數(shù))
對(duì)每個(gè)類別:

對(duì)每個(gè)詞條:
將該詞條的數(shù)目除以總詞條數(shù)目得到的條件概率(P(詞條|類別))
返回該文檔屬于每個(gè)類別的條件概率(P(類別|文檔的所有詞條))

2.4 樸素貝葉斯開發(fā)流程

收集數(shù)據(jù): 可以使用任何方法。

準(zhǔn)備數(shù)據(jù): 需要數(shù)值型或者布爾型數(shù)據(jù)。

分析數(shù)據(jù): 有大量特征時(shí),繪制特征作用不大,此時(shí)使用直方圖效果更好。

訓(xùn)練算法: 計(jì)算不同的獨(dú)立特征的條件概率。

測(cè)試算法: 計(jì)算錯(cuò)誤率。

使用算法: 一個(gè)常見的樸素貝葉斯應(yīng)用是文檔分類??梢栽谌我獾姆诸悎?chǎng)景中使用樸素貝葉斯分類器,不一定非要是文本。

2.5 樸素貝葉斯算法特點(diǎn)

優(yōu)點(diǎn): 在數(shù)據(jù)較少的情況下仍然有效,可以處理多類別問題。
缺點(diǎn): 對(duì)于輸入數(shù)據(jù)的準(zhǔn)備方式較為敏感。
適用數(shù)據(jù)類型: 標(biāo)稱型數(shù)據(jù)。

2.6 樸素貝葉斯 項(xiàng)目案例

2.6.1 項(xiàng)目案例1

屏蔽社區(qū)留言板的侮辱性言論

2.6.1.1 項(xiàng)目概述

構(gòu)建一個(gè)快速過濾器來屏蔽在線社區(qū)留言板上的侮辱性言論。如果某條留言使用了負(fù)面或者侮辱性的語(yǔ)言,那么就將該留言標(biāo)識(shí)為內(nèi)容不當(dāng)。對(duì)此問題建立兩個(gè)類別: 侮辱類和非侮辱類,使用 1 和 0 分別表示。

2.6.1.2 開發(fā)流程

收集數(shù)據(jù): 可以使用任何方法

準(zhǔn)備數(shù)據(jù): 從文本中構(gòu)建詞向量

分析數(shù)據(jù): 檢查詞條確保解析的正確性

訓(xùn)練算法: 從詞向量計(jì)算概率

測(cè)試算法: 根據(jù)現(xiàn)實(shí)情況修改分類器

使用算法: 對(duì)社區(qū)留言板言論進(jìn)行分類

收集數(shù)據(jù): 可以使用任何方法

2.6.1.3 構(gòu)造詞表

def loadDataSet():
  """
  創(chuàng)建數(shù)據(jù)集
  :return: 單詞列表postingList, 所屬類別classVec
  """
  postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], #[0,0,1,1,1......]
          ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
          ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
          ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
          ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
          ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
  classVec = [0, 1, 0, 1, 0, 1] # 1 is abusive, 0 not
  return postingList, classVec

2.6.1.4 準(zhǔn)備數(shù)據(jù): 從文本中構(gòu)建詞向量

def createVocabList(dataSet):
  """
  獲取所有單詞的集合
  :param dataSet: 數(shù)據(jù)集
  :return: 所有單詞的集合(即不含重復(fù)元素的單詞列表)
  """
  vocabSet = set([]) # create empty set
  for document in dataSet:
    # 操作符 | 用于求兩個(gè)集合的并集
    vocabSet = vocabSet | set(document) # union of the two sets
  return list(vocabSet)
 
 
def setOfWords2Vec(vocabList, inputSet):
  """
  遍歷查看該單詞是否出現(xiàn),出現(xiàn)該單詞則將該單詞置1
  :param vocabList: 所有單詞集合列表
  :param inputSet: 輸入數(shù)據(jù)集
  :return: 匹配列表[0,1,0,1...],其中 1與0 表示詞匯表中的單詞是否出現(xiàn)在輸入的數(shù)據(jù)集中
  """
  # 創(chuàng)建一個(gè)和詞匯表等長(zhǎng)的向量,并將其元素都設(shè)置為0
  returnVec = [0] * len(vocabList)# [0,0......]
  # 遍歷文檔中的所有單詞,如果出現(xiàn)了詞匯表中的單詞,則將輸出的文檔向量中的對(duì)應(yīng)值設(shè)為1
  for word in inputSet:
    if word in vocabList:
      returnVec[vocabList.index(word)] = 1
    else:
      print "the word: %s is not in my Vocabulary!" % word
  return returnVec

2.6.1.5 分析數(shù)據(jù): 檢查詞條確保解析的正確性

檢查函數(shù)執(zhí)行情況,檢查詞表,不出現(xiàn)重復(fù)單詞,需要的話,可以對(duì)其進(jìn)行排序。

>>> listOPosts, listClasses = bayes.loadDataSet()
>>> myVocabList = bayes.createVocabList(listOPosts)
>>> myVocabList
['cute', 'love', 'help', 'garbage', 'quit', 'I', 'problems', 'is', 'park',
'stop', 'flea', 'dalmation', 'licks', 'food', 'not', 'him', 'buying', 'posting', 'has', 'worthless', 'ate', 'to', 'maybe', 'please', 'dog', 'how',
'stupid', 'so', 'take', 'mr', 'steak', 'my']

檢查函數(shù)有效性。例如:myVocabList 中索引為 2 的元素是什么單詞?應(yīng)該是是 help 。該單詞在第一篇文檔中出現(xiàn)了,現(xiàn)在檢查一下看看它是否出現(xiàn)在第四篇文檔中。

>>> bayes.setOfWords2Vec(myVocabList, listOPosts[0])
[0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1]
 
>>> bayes.setOfWords2Vec(myVocabList, listOPosts[3])
[0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]

2.6.1.6 訓(xùn)練算法: 從詞向量計(jì)算概率

現(xiàn)在已經(jīng)知道了一個(gè)詞是否出現(xiàn)在一篇文檔中,也知道該文檔所屬的類別。接下來我們重寫貝葉斯準(zhǔn)則,將之前的 x, y 替換為 w. 粗體的 w 表示這是一個(gè)向量,即它由多個(gè)值組成。在這個(gè)例子中,數(shù)值個(gè)數(shù)與詞匯表中的詞個(gè)數(shù)相同。

我們使用上述公式,對(duì)每個(gè)類計(jì)算該值,然后比較這兩個(gè)概率值的大小。

首先可以通過類別 i (侮辱性留言或者非侮辱性留言)中的文檔數(shù)除以總的文檔數(shù)來計(jì)算概率 p(ci) 。接下來計(jì)算 p(w | ci) ,這里就要用到樸素貝葉斯假設(shè)。如果將 w 展開為一個(gè)個(gè)獨(dú)立特征,那么就可以將上述概率寫作 p(w0, w1, w2…wn | ci) 。這里假設(shè)所有詞都互相獨(dú)立,該假設(shè)也稱作條件獨(dú)立性假設(shè)(例如 A 和 B 兩個(gè)人拋骰子,概率是互不影響的,也就是相互獨(dú)立的,A 拋 2點(diǎn)的同時(shí) B 拋 3 點(diǎn)的概率就是 1/6 * 1/6),它意味著可以使用 p(w0 | ci)p(w1 | ci)p(w2 | ci)…p(wn | ci) 來計(jì)算上述概率,這樣就極大地簡(jiǎn)化了計(jì)算的過程。

2.6.1.7 樸素貝葉斯分類器訓(xùn)練函數(shù)

def _trainNB0(trainMatrix, trainCategory):
  """
  訓(xùn)練數(shù)據(jù)原版
  :param trainMatrix: 文件單詞矩陣 [[1,0,1,1,1....],[],[]...]
  :param trainCategory: 文件對(duì)應(yīng)的類別[0,1,1,0....],列表長(zhǎng)度等于單詞矩陣數(shù),其中的1代表對(duì)應(yīng)的文件是侮辱性文件,0代表不是侮辱性矩陣
  :return:
  """
  # 文件數(shù)
  numTrainDocs = len(trainMatrix)
  # 單詞數(shù)
  numWords = len(trainMatrix[0])
  # 侮辱性文件的出現(xiàn)概率,即trainCategory中所有的1的個(gè)數(shù),
  # 代表的就是多少個(gè)侮辱性文件,與文件的總數(shù)相除就得到了侮辱性文件的出現(xiàn)概率
  pAbusive = sum(trainCategory) / float(numTrainDocs)
  # 構(gòu)造單詞出現(xiàn)次數(shù)列表
  p0Num = zeros(numWords) # [0,0,0,.....]
  p1Num = zeros(numWords) # [0,0,0,.....]
 
  # 整個(gè)數(shù)據(jù)集單詞出現(xiàn)總數(shù)
  p0Denom = 0.0
  p1Denom = 0.0
  for i in range(numTrainDocs):
    # 是否是侮辱性文件
    if trainCategory[i] == 1:
      # 如果是侮辱性文件,對(duì)侮辱性文件的向量進(jìn)行加和
      p1Num += trainMatrix[i] #[0,1,1,....] + [0,1,1,....]->[0,2,2,...]
      # 對(duì)向量中的所有元素進(jìn)行求和,也就是計(jì)算所有侮辱性文件中出現(xiàn)的單詞總數(shù)
      p1Denom += sum(trainMatrix[i])
    else:
      p0Num += trainMatrix[i]
      p0Denom += sum(trainMatrix[i])
  # 類別1,即侮辱性文檔的[P(F1|C1),P(F2|C1),P(F3|C1),P(F4|C1),P(F5|C1)....]列表
  # 即 在1類別下,每個(gè)單詞出現(xiàn)的概率
  p1Vect = p1Num / p1Denom# [1,2,3,5]/90->[1/90,...]
  # 類別0,即正常文檔的[P(F1|C0),P(F2|C0),P(F3|C0),P(F4|C0),P(F5|C0)....]列表
  # 即 在0類別下,每個(gè)單詞出現(xiàn)的概率
  p0Vect = p0Num / p0Denom
  return p0Vect, p1Vect, pAbusive

總結(jié)

以上就是本文關(guān)于Python編程之基于概率論的分類方法:樸素貝葉斯的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以參閱本站:Python內(nèi)存管理方式和垃圾回收算法解析python基礎(chǔ)練習(xí)之幾個(gè)簡(jiǎn)單的游戲、python使用鄰接矩陣構(gòu)造圖代碼示例等,有什么問題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。感謝朋友們對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Python的Flask框架中集成CKeditor富文本編輯器的教程

    Python的Flask框架中集成CKeditor富文本編輯器的教程

    在用Flask搭建網(wǎng)站時(shí)的后臺(tái)文章編輯器可以使用CKeditor,CKeditor所支持的文本樣式較多且開源,這里我們就來看一下Python的Flask框架中集成CKeditor富文本編輯器的教程
    2016-06-06
  • 簡(jiǎn)單利用conda安裝tensorflow-gpu=2.2.0的過程及問題解決

    簡(jiǎn)單利用conda安裝tensorflow-gpu=2.2.0的過程及問題解決

    這篇文章主要介紹了簡(jiǎn)單利用conda安裝tensorflow-gpu=2.2.0,本文給大家詳細(xì)分享問題記錄及錯(cuò)誤問題解決方案,需要的朋友可以參考下
    2023-01-01
  • Python中Numpy包的安裝與使用方法簡(jiǎn)明教程

    Python中Numpy包的安裝與使用方法簡(jiǎn)明教程

    這篇文章主要介紹了Python中Numpy包的安裝與使用方法,結(jié)合簡(jiǎn)單實(shí)例形式分析了Python使用pip命令在線與離線whl包安裝,以及使用numpy打印隨機(jī)數(shù)矩陣的操作技巧,需要的朋友可以參考下
    2018-07-07
  • python正則表達(dá)式完成車牌號(hào)檢驗(yàn)的代碼實(shí)例

    python正則表達(dá)式完成車牌號(hào)檢驗(yàn)的代碼實(shí)例

    這篇文章主要給大家介紹了關(guān)于python正則表達(dá)式完成車牌號(hào)檢驗(yàn)的相關(guān)資料,在Python中正則表達(dá)式是一種用于匹配和操作字符串的強(qiáng)大工具,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • 詳解pycharm連接不上mysql數(shù)據(jù)庫(kù)的解決辦法

    詳解pycharm連接不上mysql數(shù)據(jù)庫(kù)的解決辦法

    這篇文章主要介紹了詳解pycharm連接不上mysql數(shù)據(jù)庫(kù)的解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 利用python如何在前程無(wú)憂高效投遞簡(jiǎn)歷

    利用python如何在前程無(wú)憂高效投遞簡(jiǎn)歷

    這篇文章主要給大家介紹了關(guān)于利用python如何在前程無(wú)憂高效投遞簡(jiǎn)歷的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • python中decimal模塊的具體使用

    python中decimal模塊的具體使用

    本文主要介紹了python中decimal模塊的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Django中常遇到的錯(cuò)誤問題

    Django中常遇到的錯(cuò)誤問題

    在Django開發(fā)中,設(shè)置DEBUG=False時(shí)需要配置ALLOWED_HOSTS以防止報(bào)錯(cuò),此外,如果django-admin.py命令找不到,需添加Django的安裝路徑到系統(tǒng)環(huán)境變量,此文還提供了一些常見Django錯(cuò)誤的解決方法,如數(shù)據(jù)庫(kù)添加中文報(bào)錯(cuò)、信號(hào)無(wú)法觸發(fā)等問題
    2024-09-09
  • python使用PyQt5的簡(jiǎn)單方法

    python使用PyQt5的簡(jiǎn)單方法

    這篇文章主要介紹了python使用PyQt5的簡(jiǎn)單方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • 基于PyQt5制作一個(gè)windows通知管理器

    基于PyQt5制作一個(gè)windows通知管理器

    python框架win10toast可以用來做windows的消息通知功能,通過設(shè)定通知的間隔時(shí)間來實(shí)現(xiàn)一些事件通知的功能。本文將利用win10toast這一框架制作一個(gè)windows通知管理器,感興趣的可以參考一下
    2022-02-02

最新評(píng)論