貝葉斯用於文件分類

2021-09-29 05:03:26 字數 3941 閱讀 3526

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 樸素貝葉斯的思想基礎是這樣的 對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別。通俗來說,就好比這麼個道理,你在街上看到乙個黑人,我問你你猜這哥們 來的,...