之所以稱之為「樸素」,是因為整個形式化過程只做最原始、最簡單的假設。
優缺點
- 優點:在資料較少的情況下仍然有效,可以處理多類別問題。
- 確定:對於輸入資料的準備方式比較敏感。
- 適用資料型別:標稱型資料。
入門示例
二維座標中,如果p1(x,y) > p2(x,y),那麼(x,y)屬於類別1,否則屬於類別2.
機器學習的乙個重要應用就是文件的自動分類。
樸素貝葉斯分類器中的乙個假設是,每個特徵同等重要。
p(ci|w) = p(w|ci)*p(ci)/p(w)
聯絡示例:p(gray|bucketb) = p(bucketb|gray)p(gray)/p(bucketb)
ci: 類別,侮辱性類別,或者非侮辱性類別;
w: 要鑑別的文件向量,唯一詞彙列表對比生成的文件向量;
from numpy import *
# 載入實驗樣本
defloaddataset
(): postinglist=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
['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] # 0:非侮辱;1:侮辱性;
return postinglist, classvec # 返回兩個集合
# 樣本去重
defcreatevocablist
(dataset):
vocabset = set() # 構造乙個空的集合
for document in dataset:
vocabset = vocabset | set(document)
return list(vocabset)
'''vocablist: 去重後的詞彙集合
inputset: 某個文件,被拆分成了詞彙集合
return: 文件向量,詞屬於樣本文件中的為1,否則為0
'''def
setofwords2vec
(vocablist, inputset):
returnvec = [0]*len(vocablist) # 初始化length長度向量
for word in inputset:
if word in vocablist:
returnvec[vocablist.index(word)] = 1
# 1輸入文件的詞出現在詞彙表裡,0表示未出現
# else: print("the word: %s is not in my vocabulary!" % word)
else:
print("###########################")
return returnvec
'''樸素貝葉斯分類器訓練函式
trainmatrix: 訓練集文件向量,多個文件,且經過了向量化
traincategory: 訓練集類別
return: 每個侮辱性的詞,在所有侮辱性的文件中的概率;
每個非侮辱性的詞,在所有非侮辱性的文件中的概率;
'''def
trainnb0
(trainmatrix, traincategory):
numtraindocs = len(trainmatrix) # 文件數
numwords = len(trainmatrix[0]) # 第乙個文件有多少詞
pabusive = sum(traincategory)/float(numtraindocs) # 侮辱性文件數量/文件數,即侮辱性文件概率
p0num = zeros(numwords) # 初始化0集合,非侮辱性文件向量總和
p1num = zeros(numwords) # 初始化0集合,侮辱性文件向量總和
p0denom = 0.0
# 初始化0,非侮辱文件中有多少詞包含在樣本集中
p1denom = 0.0
# 初始化0,侮辱文件中中有多少詞包含在樣本集中
for i in range(numtraindocs): # 遍歷每個文件
if traincategory[i] == 1: #如果該文件是侮辱性的
p1num += trainmatrix[i] # 文件加到p1num集合中
p1denom += sum(trainmatrix[i]) # 對文件中的1求和,有多少詞屬於樣本中的
else:
p0num += trainmatrix[i]
p0denom += sum(trainmatrix[i])
p1vect = p1num/p1denom #
p0vect = p0num/p0denom
return p0vect, p1vect, pabusive
defclassifynb
(vec2classify, p0vec, p1vec, pclass1):
p1 = sum(vec2classify * p1vec) + log(pclass1) # element-wise mult
p0 = sum(vec2classify * p0vec) + log(1.0 - pclass1)
if p1 > p0:
return
1else:
return
0def
domethod
(): listoposts, listclasses = loaddataset()
myvocablist = createvocablist(listoposts)
trainmat =
for postindoc in listoposts:
p0v, p1v, pab = trainnb0(array(trainmat), array(listclasses))
testentry = ['love', 'my', 'dalmation']
docs = setofwords2vec(myvocablist, testentry)
thisdoc = array(docs)
num = classifynb(thisdoc, p0v, p1v, pab)
print(num)
domethod()
利用貝葉斯分類器對文件進行分類時,要計算多個概率的乘積以獲得文件屬於某個類別的概率,如果其中乙個概率值為0,那麼最後的乘積也為0。為降低這種影響,可以將所有詞的出現數初始化為1,並將墳墓初始化為2。
另乙個問題是下溢位,這是由於太多很小的數相乘造成的。當計算乘積,由於大部分因子都很小,所以程式會下溢位或者得到不正確的答案,可以通過取自然對數的lnx的方法處理,會簡單些。
樸素貝葉斯 機器學習實戰
主要引用的是機器學習實戰中第四章的例子。該例子中將所有的詞當作乙個特徵。我們已知類別下相應特徵的概率,計算出乙個特徵下屬於不同類別的概率大小,然後選取較大的為此特徵的類別。import numpy as np def loaddataset postinglist my dog has flea p...
機器學習實戰之樸素貝葉斯
4.樸素貝葉斯的優缺點 優點 在資料較少的情況下仍然有效,可以處理多類別問題。缺點 對於輸入資料的準備方式較為敏感。適用資料型別 標稱型資料。5.使用python進行文字分類 5.1 準備資料 從文字中構建詞向量 我們將把文字看成單詞向量或者詞條向量。考慮出現在所有文件中的所有單詞,再決定將哪些詞納...
機器學習 樸素貝葉斯
樸素貝葉斯原理 1.貝葉斯公式 2.樸素貝葉斯的模型 3.後驗概率最大化的含義 4.樸素貝葉斯的引數估計 4.1.特徵是離散值 假設符合多項式分布 4.2.特徵是稀疏的離散值 假設符合伯努利分布 4.3.特徵是連續值 假設符合正態分佈 5.樸素貝葉斯演算法過程 6.樸素貝葉斯演算法小結 scikit...