樸素貝葉斯 基於sklearn的實現

2021-09-29 14:01:27 字數 3555 閱讀 2062

由於自己太懶,不想看太長的**,所以我就呼叫的sklearn庫的樸素貝葉斯類,資料集選擇的是這個部落格中自己構造的資料集,該部落格自己實現了樸素貝葉斯類,想自己編寫乙個樸素貝葉斯函式的讀者可以參考這個部落格。

下面是用sklearn庫實現樸素貝葉斯分類:

from functools import

reduce

import numpy as np

from sklearn.*****_bayes import gaussiannb

defloaddataset()

:"""構造資料集"""

wordslist =[[

'週六'

,'公司'

,'一起'

,'聚餐'

,'時間'],

['優惠'

,'返利'

,'打折'

,'優惠'

,'金融'

,'理財'],

['喜歡'

,'機器學習'

,'一起'

,'研究'

,'歡迎'

,'貝葉斯'

,'演算法'

,'公式'],

['公司'

,'發票'

,'稅點'

,'優惠'

,'增值稅'

,'打折'],

['北京'

,'今天'

,'霧霾'

,'不宜'

,'外出'

,'時間'

,'在家'

,'討論'

,'學習'],

['招聘'

,'兼職'

,'日薪'

,'保險'

,'返利']]

classvec =[0

,1,0

,1,0

,1]return wordslist, classvec

defdoc2veclist

(doclist)

:"""將資料集合並"""

a =list

(reduce

(lambda x, y:

set(x)

|set

(y), doclist)

)# 相同的詞合併成為乙個詞,最終的結果是乙個列表,裡面沒有重複的詞

# reduce()方法:以本題為例,函式是set(x)|set(y),則要迭代的從doclist中取出兩個詞進行函式計算

return a

allwordsvec = doc2veclist(doclist)

# 形成乙個沒有重複的詞的詞彙表

print

(allwordsvec)

# ['研究', '增值稅', '在家', '不宜', '兼職', '外出', '貝葉斯', '喜歡', '週六', '發票', '今天', '稅點', '公司', '一起', '保險', '演算法', '日薪', '公式', '北京', '理財', '打折', '霧霾', '招聘', '金融', '時間', '歡迎', '討論', '返利', '機器學習', '聚餐', '優惠', '學習']

defword2vec

(veclist, inputwords)

:"""詞袋模型"""

resultvec =[0

]*len(veclist)

for word in inputwords:

if word in veclist:

resultvec[veclist.index(word)]+=

1else

:print

('沒有發現此單詞'

)return np.array(resultvec)

# 將上面形成的詞彙表轉換成數字,以第乙個資料為例,['週六', '公司', '一起', '聚餐', '時間'],

#『週六』出現在詞彙表的第9個位置,所以詞彙表的第9個位置記為1,

#同理,『公司』,『一起』,『聚餐』,『時間』出現的位置都記為1,其餘位置記為0,

#最終形式是[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 1, 0, 0, 0, 0, 1, 0, 0]

trainmat =

list

(map

(lambda x: word2vec(allwordsvec, x)

, doclist)

)print

(trainmat)

# [array([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,

#0, 0, 1, 0, 0, 0, 0, 1, 0, 0]), array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,

#0, 1, 0, 0, 0, 1, 0, 0, 2, 0]), array([1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0,

#0, 0, 0, 1, 0, 0, 1, 0, 0, 0]), array([0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,

# 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]), array([0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1,

#0, 0, 1, 0, 1, 0, 0, 0, 0, 1]), array([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0,

#1, 0, 0, 0, 0, 1, 0, 0, 0, 0])]

# 由於特徵都是列表形式,所以要轉換成矩陣的形式

classvec = np.array(classvec)

print

(classvec.shape)

# (6,) 標籤是一維

trainmat = np.array(trainmat)

print

(trainmat.shape)

# (6, 32) 特徵是二維

clf = gaussiannb(

)

clf.fit(trainmat, classvec)

# 訓練模型

testwords =

['公司'

,'聚餐'

,'討論'

,'貝葉斯'

]# 測試資料

testvec = word2vec(allwordsvec, testwords)

# 轉換成詞袋模型

testvec = np.array(testvec)

testvec = np.expand_dims(testvec, axis=0)

# 把特徵轉換為二維,shape=(1,32)

clf.predict(testvec)

# 輸出0,分類正確

Sklearn實現樸素貝葉斯

sklearn 實現樸素貝葉斯 在scikit learn中,一共有3個樸素貝葉斯的分類演算法類。分別是gaussiannb,multinomialnb和bernoullinb。其中gaussiannb就是先驗為高斯分布的樸素貝葉斯,multinomialnb就是先驗為多項式分布的樸素貝葉斯,而be...

Sklearn實現樸素貝葉斯

sklearn 實現樸素貝葉斯 在scikit learn中,一共有3個樸素貝葉斯的分類演算法類。分別是gaussiannb,multinomialnb和bernoullinb。其中gaussiannb就是先驗為高斯分布的樸素貝葉斯,multinomialnb就是先驗為多項式分布的樸素貝葉斯,而be...

樸素貝葉斯基礎概念 例項

假設乙個鎮里有60 男性和40 女性。女性穿褲子的人數和穿裙子的人數一樣,所有男性都穿褲子 正常男性都穿褲子 乙個人在遠處隨機看到了乙個穿褲子的人,這個人是男生還是女生?為什麼?a 數女性事件,b 是穿的是褲子的事件 p a 是看到是女性的概率,在這裡是40 p a 是看到是男性的概率,在這裡是60...