from numpy import *
def loaddataset():
# 詞條切分後的文件集合,列表每一行代表乙個文件
postinglist = [['my', 'dog', 'has', 'flea', 'please'],
['not', 'take', 'him', 'to', 'dog', 'stupid'],
['my', 'is', 'cute', 'love', 'him'],
['stop', 'posting', 'stupid', 'worthless', 'garbage'],
['my', 'licks', 'my', 'to', 'stop', 'him'],
['quit', 'worthless', 'dog', 'stupid']]
# 由人工標註的每篇文件的類標籤
classvec = [0, 1, 0, 1, 0, 1]
return postinglist, classvec
# 統計所有文件**現的詞條列表
def createvocablist(dataset):
# 新建乙個存放詞條的集合
vocabset = set()
# 遍歷文件集合中的每一篇文件
for document in dataset:
# 將文件列表轉為集合的形式,保證每個詞條的唯一性
# 然後與vocabset取並集,向vocabset中新增沒有出現
# 的新的詞條
vocabset = vocabset | set(document)
# 再將集合轉化為列表,便於接下來的處理
return list(vocabset)
# 根據詞條列表中的詞條是否在文件**現(出現1,未出現0),將文件轉化為詞條向量
def setofwords2vec(vocabset, inputset):
# 新建乙個長度為vocabset的列表,並且各維度元素初始化為0
returnvec = [0] * len(vocabset)
# 遍歷文件中的每乙個詞條
for word in inputset:
# 如果詞條在詞條列表**現
if word in vocabset:
# 通過列表獲取當前word的索引(下標)
# 將詞條向量中的對應下標的項由0改為1
returnvec[vocabset.index(word)] += 1
else:
print('the word: %s is not in my vocabulary! ' % 'word')
# 返回inputet轉化後的詞條向量
return returnvec
# 訓練演算法,從詞向量計算概率p(w0|ci)...及p(ci)
# @trainmatrix:由每篇文件的詞條向量組成的文件矩陣
# @traincategory:每篇文件的類標籤組成的向量
def trainnb0(trainmatrix, traincategory):
# 獲取文件矩陣中文件的數目
numtraindocs = len(trainmatrix) # 6
# 獲取詞條向量的長度
numwords = len(trainmatrix[0]) # 19
# 所有文件中屬於類1所佔的比例p(c=1)
pabusive = sum(traincategory) / float(numtraindocs) # 3/6=0.5,先驗
# 建立乙個長度為詞條向量等長的列表
p0num = zeros(numwords)
p1num = zeros(numwords)
p0denom = 0.0
p1denom = 0.0
# 遍歷每一篇文件的詞條向量
for i in range(numtraindocs):
# 如果該詞條向量對應的標籤為1
if traincategory[i] == 1:
# 統計所有類別為1的詞條向量中各個詞條出現的次數
p1num += trainmatrix[i]
# 統計類別為1的詞條向量**現的所有詞條的總數
# 即統計類1所有文件**現單詞的數目
p1denom += sum(trainmatrix[i])
else:
# 統計所有類別為0的詞條向量中各個詞條出現的次數
p0num += trainmatrix[i]
# 統計類別為0的詞條向量**現的所有詞條的總數
# 即統計類0所有文件**現單詞的數目
p0denom += sum(trainmatrix[i])
# 利用numpy陣列計算p(wi|c1)
p1vect = p1num / p1denom # 為避免下溢位問題,後面會改為log()
# 利用numpy陣列計算p(wi|c0)
p0vect = p0num / p0denom # 為避免下溢位問題,後面會改為log()
return p0vect, p1vect, pabusive
# 樸素貝葉斯分類函式
# @vec2classify:待測試分類的詞條向量
# @p0vec:類別0所有文件中各個詞條出現的頻數p(wi|c0)
# @p0vec:類別1所有文件中各個詞條出現的頻數p(wi|c1)
# @pclass1:類別為1的文件佔文件總數比例
def classifynb(vec2classify, p0vec, p1vec, pclass1):
# 根據樸素貝葉斯分類函式分別計算待分類文件屬於類1和類0的概率
print(vec2classify)
p1 = sum(vec2classify * p1vec) + log(pclass1)
p0 = sum(vec2classify * p0vec) + log(1.0 - pclass1)
if p1 > p0:
return 1
else:
return 0
# 分類測試整體函式
# 由資料集獲取文件矩陣和類標籤向量
allfile, fileclasses = loaddataset()
# 統計所有文件**現的詞條,存入詞條列表
vocabset = createvocablist(allfile)
# 建立新的列表
trainmat =
for singlefile in allfile:
# 將每篇文件利用words2vec函式轉為詞條向量,存入文件矩陣中
# 將文件矩陣和類標籤向量轉為numpy的陣列形式,方便接下來的概率計算
# 呼叫訓練函式,得到相應概率值
p0v, p1v, pab = trainnb0(array(trainmat), array(fileclasses))
# 測試文件
testentry = ['love', 'my', 'cute']
# 將測試文件轉為詞條向量,並轉為numpy陣列的形式
thisdoc = array(setofwords2vec(vocabset, testentry))
# 利用貝葉斯分類函式對測試文件進行分類並列印
print(testentry, 'classified as:', classifynb(thisdoc, p0v, p1v, pab))
# 第二個測試文件
testentry1 = ['stupid', 'garbage']
# 同樣轉為詞條向量,並轉為numpy陣列的形式
thisdoc1 = array(setofwords2vec(vocabset, testentry1))
print(testentry1, 'classified as:', classifynb(thisdoc1, p0v, p1v, pab))
貝葉斯分類
貝葉斯分類 有意義區分和無意義區分 既然要區分兩種點那麼兩種點必然有區別,當區分有區別的點時說是有意義區分。而完全區分那種一模一樣的點則是無意義區分。所以我們所討論的都是有意義的區分。完全區分和不完全區分 貝葉斯分類器是一種概率上的區分,而假如兩種點一種是黑的一種是白的那不需要用貝葉斯分類器區分,因...
貝葉斯分類
樸素貝葉斯模型是一組非常簡單快速的分類演算法,通常適用於維度非常高的資料集,因為執行速度快,而且可調引數少,因此非常適合為分類問題提供快速粗糙的基本方案。貝葉斯分類 樸素貝葉斯分類器建立在貝葉斯分類方法上,其數學基礎是貝葉斯定理,乙個描述統計計量條件概率關係的公式。在貝葉斯分類中,我們希望確定乙個具...
樸素貝葉斯分類
1 貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。2 樸素貝葉斯的思想基礎是這樣的 對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別。通俗來說,就好比這麼個道理,你在街上看到乙個黑人,我問你你猜這哥們 來的,...