樸素貝葉斯是監督學習分類演算法
分類方法:比如已知乙個資料集由兩類資料(類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 ...