摘要:基于概率論的分類方法樸素貝葉斯概述貝葉斯分類是一類分類算法的總稱,這類算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。另外一種有效計算條件概率的方法稱為貝葉斯準則。可以在任意的分類場景中使用樸素貝葉斯分類器,不一定非要是文本。
基于概率論的分類方法:樸素貝葉斯 1. 概述
貝葉斯分類是一類分類算法的總稱,這類算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。本章首先介紹貝葉斯分類算法的基礎——貝葉斯定理。最后,我們通過實例來討論貝葉斯分類的中最簡單的一種: 樸素貝葉斯分類。
2. 貝葉斯理論 & 條件概率 2.1 貝葉斯理論我們現在有一個數據集,它由兩類數據組成,數據分布如下圖所示:
我們現在用 p1(x,y) 表示數據點 (x,y) 屬于類別 1(圖中用圓點表示的類別)的概率,用 p2(x,y) 表示數據點 (x,y) 屬于類別 2(圖中三角形表示的類別)的概率,那么對于一個新數據點 (x,y),可以用下面的規則來判斷它的類別:
如果 p1(x,y) > p2(x,y) ,那么類別為1 如果 p2(x,y) > p1(x,y) ,那么類別為2
也就是說,我們會選擇高概率對應的類別。這就是貝葉斯決策理論的核心思想,即選擇具有最高概率的決策。
2.1.2 條件概率如果你對 p(x,y|c1) 符號很熟悉,那么可以跳過本小節。
有一個裝了 7 塊石頭的罐子,其中 3 塊是白色的,4 塊是黑色的。如果從罐子中隨機取出一塊石頭,那么是白色石頭的可能性是多少?由于取石頭有 7 種可能,其中 3 種為白色,所以取出白色石頭的概率為 3/7 。那么取到黑色石頭的概率又是多少呢?很顯然,是 4/7 。我們使用 P(white) 來表示取到白色石頭的概率,其概率值可以通過白色石頭數目除以總的石頭數目來得到。
如果這 7 塊石頭如下圖所示,放在兩個桶中,那么上述概率應該如何計算?
計算 P(white) 或者 P(black) ,如果事先我們知道石頭所在桶的信息是會改變結果的。這就是所謂的條件概率(conditional probablity)。假定計算的是從 B 桶取到白色石頭的概率,這個概率可以記作 P(white|bucketB) ,我們稱之為“在已知石頭出自 B 桶的條件下,取出白色石頭的概率”。很容易得到,P(white|bucketA) 值為 2/4 ,P(white|bucketB) 的值為 1/3 。
條件概率的計算公式如下:
P(white|bucketB) = P(white and bucketB) / P(bucketB)
首先,我們用 B 桶中白色石頭的個數除以兩個桶中總的石頭數,得到 P(white and bucketB) = 1/7 .其次,由于 B 桶中有 3 塊石頭,而總石頭數為 7 ,于是 P(bucketB) 就等于 3/7 。于是又 P(white|bucketB) = P(white and bucketB) / P(bucketB) = (1/7) / (3/7) = 1/3 。
另外一種有效計算條件概率的方法稱為貝葉斯準則。貝葉斯準則告訴我們如何交換條件概率中的條件與結果,即如果已知 P(x|c),要求 P(c|x),那么可以使用下面的計算方法:
使用條件概率來分類
上面我們提到貝葉斯決策理論要求計算兩個概率 p1(x, y) 和 p2(x, y):
如果 p1(x, y) > p2(x, y), 那么屬于類別 1; 如果 p2(x, y) > p1(X, y), 那么屬于類別 2.
這并不是貝葉斯決策理論的所有內容。使用 p1() 和 p2() 只是為了盡可能簡化描述,而真正需要計算和比較的是 p(c1|x, y) 和 p(c2|x, y) .這些符號所代表的具體意義是: 給定某個由 x、y 表示的數據點,那么該數據點來自類別 c1 的概率是多少?數據點來自類別 c2 的概率又是多少?注意這些概率與概率 p(x, y|c1) 并不一樣,不過可以使用貝葉斯準則來交換概率中條件與結果。具體地,應用貝葉斯準則得到:
使用上面這些定義,可以定義貝葉斯分類準則為:
如果 P(c1|x, y) > P(c2|x, y), 那么屬于類別 c1; 如果 P(c2|x, y) > P(c1|x, y), 那么屬于類別 c2.
在文檔分類中,整個文檔(如一封電子郵件)是實例,而電子郵件中的某些元素則構成特征。我們可以觀察文檔中出現的詞,并把每個詞作為一個特征,而每個詞的出現或者不出現作為該特征的值,這樣得到的特征數目就會跟詞匯表中的詞的數目一樣多。
我們假設特征之間 相互獨立 。所謂 獨立(independence) 指的是統計意義上的獨立,即一個特征或者單詞出現的可能性與它和其他單詞相鄰沒有關系,比如說,“我們”中的“我”和“們”出現的概率與這兩個字相鄰沒有任何關系。這個假設正是樸素貝葉斯分類器中 樸素(naive) 一詞的含義。樸素貝葉斯分類器中的另一個假設是,每個特征同等重要。
Note: 樸素貝葉斯分類器通常有兩種實現方式: 一種基于伯努利模型實現,一種基于多項式模型實現。這里采用前一種實現方式。該實現方式中并不考慮詞在文檔中出現的次數,只考慮出不出現,因此在這個意義上相當于假設詞是等權重的。
2.2 樸素貝葉斯 場景機器學習的一個重要應用就是文檔的自動分類。
在文檔分類中,整個文檔(如一封電子郵件)是實例,而電子郵件中的某些元素則構成特征。我們可以觀察文檔中出現的詞,并把每個詞作為一個特征,而每個詞的出現或者不出現作為該特征的值,這樣得到的特征數目就會跟詞匯表中的詞的數目一樣多。
樸素貝葉斯是上面介紹的貝葉斯分類器的一個擴展,是用于文檔分類的常用算法。下面我們會進行一些樸素貝葉斯分類的實踐項目。
2.3 樸素貝葉斯 原理 樸素貝葉斯 工作原理提取所有文檔中的詞條并進行去重
獲取文檔的所有類別
計算每個類別中的文檔數目
對每篇訓練文檔:
對每個類別: 如果詞條出現在文檔中-->增加該詞條的計數值(for循環或者矩陣相加) 增加所有詞條的計數值(此類別下詞條總數)
對每個類別:
對每個詞條: 將該詞條的數目除以總詞條數目得到的條件概率(P(詞條|類別))
返回該文檔屬于每個類別的條件概率(P(類別|文檔的所有詞條))
2.4 樸素貝葉斯 開發流程收集數據: 可以使用任何方法。
準備數據: 需要數值型或者布爾型數據。
分析數據: 有大量特征時,繪制特征作用不大,此時使用直方圖效果更好。
訓練算法: 計算不同的獨立特征的條件概率。
測試算法: 計算錯誤率。
使用算法: 一個常見的樸素貝葉斯應用是文檔分類。可以在任意的分類場景中使用樸素貝葉斯分類器,不一定非要是文本。
2.5 樸素貝葉斯 算法特點優點: 在數據較少的情況下仍然有效,可以處理多類別問題。
缺點: 對于輸入數據的準備方式較為敏感。
適用數據類型: 標稱型數據。
屏蔽社區留言板的侮辱性言論
2.6.1.1 項目概述構建一個快速過濾器來屏蔽在線社區留言板上的侮辱性言論。如果某條留言使用了負面或者侮辱性的語言,那么就將該留言標識為內容不當。對此問題建立兩個類別: 侮辱類和非侮辱類,使用 1 和 0 分別表示。
2.6.1.2 開發流程收集數據: 可以使用任何方法
準備數據: 從文本中構建詞向量
分析數據: 檢查詞條確保解析的正確性
訓練算法: 從詞向量計算概率
測試算法: 根據現實情況修改分類器
使用算法: 對社區留言板言論進行分類
收集數據: 可以使用任何方法
2.6.1.3 構造詞表def loadDataSet(): """ 創建數據集 :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, classVec2.6.1.4 準備數據: 從文本中構建詞向量
def createVocabList(dataSet): """ 獲取所有單詞的集合 :param dataSet: 數據集 :return: 所有單詞的集合(即不含重復元素的單詞列表) """ vocabSet = set([]) # create empty set for document in dataSet: # 操作符 | 用于求兩個集合的并集 vocabSet = vocabSet | set(document) # union of the two sets return list(vocabSet) def setOfWords2Vec(vocabList, inputSet): """ 遍歷查看該單詞是否出現,出現該單詞則將該單詞置1 :param vocabList: 所有單詞集合列表 :param inputSet: 輸入數據集 :return: 匹配列表[0,1,0,1...],其中 1與0 表示詞匯表中的單詞是否出現在輸入的數據集中 """ # 創建一個和詞匯表等長的向量,并將其元素都設置為0 returnVec = [0] * len(vocabList)# [0,0......] # 遍歷文檔中的所有單詞,如果出現了詞匯表中的單詞,則將輸出的文檔向量中的對應值設為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 returnVec2.6.1.5 分析數據: 檢查詞條確保解析的正確性
檢查函數執行情況,檢查詞表,不出現重復單詞,需要的話,可以對其進行排序。
>>> 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"]
檢查函數有效性。例如:myVocabList 中索引為 2 的元素是什么單詞?應該是是 help 。該單詞在第一篇文檔中出現了,現在檢查一下看看它是否出現在第四篇文檔中。
>>> 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, y 替換為 w. 粗體的 w 表示這是一個向量,即它由多個值組成。在這個例子中,數值個數與詞匯表中的詞個數相同。
我們使用上述公式,對每個類計算該值,然后比較這兩個概率值的大小。
首先可以通過類別 i (侮辱性留言或者非侮辱性留言)中的文檔數除以總的文檔數來計算概率 p(ci) 。接下來計算 p(w | ci) ,這里就要用到樸素貝葉斯假設。如果將 w 展開為一個個獨立特征,那么就可以將上述概率寫作 p(w0, w1, w2...wn | ci) 。這里假設所有詞都互相獨立,該假設也稱作條件獨立性假設(例如 A 和 B 兩個人拋骰子,概率是互不影響的,也就是相互獨立的,A 拋 2點的同時 B 拋 3 點的概率就是 1/6 * 1/6),它意味著可以使用 p(w0 | ci)p(w1 | ci)p(w2 | ci)...p(wn | ci) 來計算上述概率,這樣就極大地簡化了計算的過程。
2.6.1.7 樸素貝葉斯分類器訓練函數def _trainNB0(trainMatrix, trainCategory): """ 訓練數據原版 :param trainMatrix: 文件單詞矩陣 [[1,0,1,1,1....],[],[]...] :param trainCategory: 文件對應的類別[0,1,1,0....],列表長度等于單詞矩陣數,其中的1代表對應的文件是侮辱性文件,0代表不是侮辱性矩陣 :return: """ # 文件數 numTrainDocs = len(trainMatrix) # 單詞數 numWords = len(trainMatrix[0]) # 侮辱性文件的出現概率,即trainCategory中所有的1的個數, # 代表的就是多少個侮辱性文件,與文件的總數相除就得到了侮辱性文件的出現概率 pAbusive = sum(trainCategory) / float(numTrainDocs) # 構造單詞出現次數列表 p0Num = zeros(numWords) # [0,0,0,.....] p1Num = zeros(numWords) # [0,0,0,.....] # 整個數據集單詞出現總數 p0Denom = 0.0 p1Denom = 0.0 for i in range(numTrainDocs): # 是否是侮辱性文件 if trainCategory[i] == 1: # 如果是侮辱性文件,對侮辱性文件的向量進行加和 p1Num += trainMatrix[i] #[0,1,1,....] + [0,1,1,....]->[0,2,2,...] # 對向量中的所有元素進行求和,也就是計算所有侮辱性文件中出現的單詞總數 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類別下,每個單詞出現的概率 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類別下,每個單詞出現的概率 p0Vect = p0Num / p0Denom return p0Vect, p1Vect, pAbusive2.6.1.8 測試算法: 根據現實情況修改分類器
http://www.cnblogs.com/apache...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40858.html
摘要:在決策理論中,貝葉斯推斷與主觀概率密切相關,通常被稱為貝葉斯概率。特征分布的假設被稱為樸素貝葉斯分類器的事件模型。多項式樸素貝葉斯對于一個多項分布事件模型,樣本表示了一個特定事件出現的頻率,由多項分布產生,其中,表示事件發生的頻率。 Code: https://github.com/tmac1997/u... Naive Bayes Bayes theorem(貝葉斯法則) 在概率論和...
摘要:貝葉斯是基于概率論的分類方法,通過概率的方式來描述對象劃分到某個分類的可能性。對象有多個屬性假設各個屬性之間是相互獨立的,求解在出現的條件下各個類別出現的概率,選擇最大的作為的分類,通過這種方法構造的分類算法稱為樸素貝葉斯。 貝葉斯是基于概率論的分類方法,通過概率的方式來描述對象劃分到某個分類的可能性。對象X有多個屬性$$X={a_{1}, a_{2}, a_{3}, ... , a_...
閱讀 4412·2021-11-19 09:59
閱讀 3329·2021-10-12 10:12
閱讀 2641·2021-09-22 15:25
閱讀 3336·2019-08-30 15:55
閱讀 1192·2019-08-29 11:27
閱讀 1472·2019-08-28 18:06
閱讀 2742·2019-08-26 13:41
閱讀 2562·2019-08-26 13:41