樸素貝葉斯

2022-07-19 02:33:12 字數 4932 閱讀 2949

樸素貝葉斯是監督學習分類演算法

分類方法:比如已知乙個資料集由兩類資料(類a,類b)組成,對於乙個資料x,如果x屬於a的概率大於x屬於b的概率,那麼x屬於a類。

如何計算相關概率:使用條件概率進行分類

條件概率

在事件b發生的條件下事件a發生的概率\(p(a|b)\)

\(p(a|b)=\frac\)

\(p(a \cap b)=p(a|b)\)

\(p(a \cap b)=p(b|a)\)

所以可得貝葉斯公式

\(p(a | b)=\frac\)

其中先驗概率p(a)後驗概率p(a|b)

所以通過貝葉斯公式求得\(p(x|a)\)與\(p(a|b)\)的值進行比較,因為公式中p(x)都是相同的,所以實際只需要分別計算\(p(a) p(x | a)\)和\(p(b) p(x | b)\)比較即可

樸素的含義

在此演算法中,是假定每乙個屬性是獨立的,所以對於\(p(w_|b)\)可由\(p(w_|b)p(w_|b)···p(w_|b)\)得到

樸素貝葉斯實現方式

一種是貝努利模型(只考慮出不出現),一種是多項式模型(考慮屬性出現的次數)

一篇貝葉斯演算法的推導文章

即將所有文章的詞都加在這個集合中為{love,it,dirty,not,ugly}

2、轉化為詞向量

如第一篇文章有2個love,1個it

[[2 1 0 0 0 ]

[0 1 1 0 1]

[0 0 0 1 1]]

類別向量為[a,b,b]

3、計算類別概率

p(a)=\(\frac\)p(b)=\(\frac\)

每乙個類中各詞在該類所佔的比例如第一行為\(p(w_|a)\)

[[\(\frac\)

\(\frac\) 0 0 0]

[0 \(\frac\)

\(\frac\)

\(\frac\)

\(\frac\)]]

4、進行判斷

對於第四篇也轉換為向量為

[1 0 0 0 0 ]

計算\(p(a) p(x | a)\)為\(\frac(\frac\times 1+0+0+0+0)=\frac\)

和\(p(b) p(x | b)\)為\(\frac(0\times1 +0+0+0+0)=0\)

比較大小所以是a類

以下是對垃圾郵件分類的程式例項,資料來自《機器學習專案實戰》第四章所附資源

import random

import numpy as np

import math

import re

# 用於統計所有的單詞,輸入從所有文件中提取的單詞,輸出這些文件的詞集

def wordlist(dataset):

# 字典的值不可重複,所以採用字典

wordset = set()

for i in dataset:

wordset = wordset | set(i)

return list(wordset)

# 對每一篇文件的詞,用於統計其是否在詞集中,若在詞集中次數加1,輸入每一篇文件的詞,輸出詞次數的向量

def signword(wordvec, dataset):

signvec = np.zeros(len(wordvec))

for word in dataset:

if word in wordvec:

signvec[wordvec.index(word)] += 1

return signvec

# 訓練函式,對於每一類,計算該類文件在所有文件中的比例(即每一類的概率),計算每一類的所有詞(即屬性)所佔該類詞集的比例(即已知這一類的情況下,該詞的概率)

# 輸入包含文件的乙個陣列,每一列代表乙個文件,輸入每乙個文件所對應的的屬性的陣列,返回每一類的所有詞所佔該類詞集的比例(以陣列形式輸出,每一行代表一類)和每一類的概率(以字典形式輸出,鍵為類名,值為比列)

def train(traindata, traincategory):

numdoc, numword = np.shape(traindata) # 得到陣列的行數和列數,其實分別代表文件的個數,和詞集所包含詞的個數

# 用於統計每個類的個數

classcount = {}

for key in traincategory:

classcount[key] = classcount.get(key, 0) + 1

# 用於計算每個類的概率

p_class = {}

for key in classcount:

p_class[key] = classcount[key] / len(traincategory)

p_num = np.ones((len(p_class), numword)) # 防止下溢位初始化時不用0

p_sum = np.ones(len(p_class)) + 1

# 生成乙個包含類名的列表

keys = list(p_class)

# 遍歷每乙個文件

for i in range(numdoc):

# 對每乙個文件,檢視是屬於哪乙個類

for j in range(len(p_class)):

if traincategory[i] == keys[j]:

# 用於統計,該類中每個詞的個數,對應的詞上加上對應的詞的個數

p_num[j] += traindata[i]

# 用於統計該類所有的詞數

p_sum[j] += sum(traindata[i])

break

p_sum = p_sum.repeat(numword).reshape(np.shape(p_num)) # 將其擴充套件為和p_num一樣的形狀,便於陣列間計算

return np.log(p_num / p_sum), p_class # 防止下溢位,採用log

# 分類函式,輸出測試資料和train()輸出的p和p_class,計算測試資料在每一類的概率,選擇概率最大的,返回對應的類名

def classfy(testdata, p, p_class):

keys = list(p_class)

classarrary = np.sum(testdata * p, axis=1)

classlist =

for i in range(len(p_class)):

return keys[classlist.index(max(classlist))]

# 用於提取文件的內容

def getdata(str):

# 去除任何非單詞字元

data = re.split('\w+', str)

return [word.lower() for word in data if len(word) > 0]

# 對50封郵件的分類測試

def traindata():

wordslist = # 用於存放詞集

doclist = # 用於存放每篇文件的每個詞,每一行代表一篇文件

classlist = # 用於,存放每篇文件所對應的類別

for i in range(1, 26):

str = getdata(

open(r'c:\users\desktop\我的檔案\機器學習實戰\machinelearninginaction\ch04\email\ham\%d.txt' % i,

encoding='utf8', errors='ignore').read()) # 對於一些識別不了的詞,用errors='ignore'忽略

wordslist.extend(str)

str = getdata(

open(r'c:\users\desktop\我的檔案\機器學習實戰\machinelearninginaction\ch04\email\spam\%d.txt' % i,

encoding='utf8', errors='ignore').read())

wordslist.extend(str)

wordvec = wordlist(wordslist)

trainset = list(range(50)) # 存放用於訓練的文件的在doclist中的序號

testset = # 存放用於測試的文件的在doclist中的序號

# 隨機選取測試文件序號

for i in range(10):

randindex = int(random.uniform(0, len(trainset)))

del (trainset[randindex])

# 進行訓練

traindata =

trainclass =

for doc in trainset:

p, p_class = train(np.array(traindata), np.array(trainclass))

# 進行測試

errorcount = 0

for doc in testset:

testwordvec = signword(wordvec, doclist[doc])

if classfy(np.array(testwordvec), p, p_class) != classlist[doc]:

errorcount += 1

# 輸出識別錯誤的概率

print(errorcount / len(testset))

traindata()

樸素貝葉斯

樸素貝葉斯演算法是一種基於概率統計的分類方法,它主要利用貝葉斯公式對樣本事件求概率,通過概率進行分類。以下先對貝葉斯公式做個了解。對於事件a b,若p b 0,則事件a在事件b發生的條件下發生的概率為 p a b p a b p b 將條件概率稍作轉化即可得到貝葉斯公式如下 p a b p b a ...

樸素貝葉斯

1.準備資料 從文字中構建詞向量 2.訓練演算法 從詞向量計算概率 3.測試演算法 儲存為 bayes.py 檔案 參考 coding utf 8 from numpy import 文字轉化為詞向量 def loaddataset postinglist my dog has flea probl...

樸素貝葉斯

機器學習是將資料轉化為決策面的過程 scikit learn縮寫為sklearn 訓練乙個分類器,學習之後 其處理的準確性 def nbaccuracy features train,labels train,features test,labels test from sklearn.bayes ...