0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于概率的常見的分類方法--樸素貝葉斯

算法&編程學(xué)院 ? 來源:網(wǎng)絡(luò)整理 ? 2018-02-03 14:37 ? 次閱讀

今天介紹機(jī)器學(xué)習(xí)中一種基于概率的常見的分類方法,樸素貝葉斯,之前介紹的KNN, decision tree 等方法是一種 hard decision,因?yàn)檫@些分類器的輸出只有0 或者 1,樸素貝葉斯方法輸出的是某一類的概率,其取值范圍在 0-1 之間,樸素貝葉斯在做文本分類,或者說垃圾郵件識別的時候非常有效。

樸素貝葉斯就是基于我們常用的貝葉斯定理:

假設(shè)我們要處理一個二分類問題: c1,c2,給定一個樣本,比如說是一封郵件,可以用向量 x 來表示,郵件就是一個文本,而文本是由單詞構(gòu)成的,所以 x 其實(shí)包含了這封郵件里出現(xiàn)的單詞的信息,我們要求的就是,給定樣本 x ,我們需要判斷這個樣本是屬于 c1 還是屬于 c2,當(dāng)然,我們可以用概率表示為:

這個就是我們常見的后驗(yàn)概率。根據(jù)貝葉斯定理,我們可以得到:

機(jī)器學(xué)習(xí):樸素貝葉斯--python

這就是我們說的樸素貝葉斯,接下來的就是各種統(tǒng)計了。

我們給出一個利用樸素貝葉斯做文本分類的例子:

首先建立一個數(shù)據(jù)庫:

def Load_dataset():

postingList=[[‘my’, ‘dog’, ‘has’, ‘flea’, \

‘problems’, ‘help’, ‘please’],

[‘maybe’, ‘not’, ‘take’, ‘him’, \

‘to’, ‘dog’, ‘park’, ‘stupid’],

[‘my’, ‘dalmation’, ‘is’, ‘so’, ‘cute’, \

‘I’, ‘love’, ‘him’],

[‘stop’, ‘posting’, ‘stupid’, ‘worthless’, ‘garbage’],

[‘mr’, ‘licks’, ‘a(chǎn)te’, ‘my’, ‘steak’, ‘how’,\

‘to’, ‘stop’, ‘him’],

[‘quit’, ‘buying’, ‘worthless’, ‘dog’, ‘food’, ‘stupid’]]

classVec = [0, 1, 0, 1, 0, 1]

return postingList, classVec

接下來,我們建立一個字典庫,保證每一個單詞在這個字典庫里都有一個位置索引,一般來說,字典庫的大小,就是我們樣本的維度大小:

def Create_vocablist(dataset):

vocabSet = set([])

for document in dataset :

vocabSet = vocabSet | set(document)

return list(vocabSet)

我們可以將樣本轉(zhuǎn)成向量:一種方法是只統(tǒng)計該單詞是否出現(xiàn),另外一種是可以統(tǒng)計該單詞出現(xiàn)的次數(shù)。

def Word2Vec(vocabList, inputSet):

returnVec = [0] * len(vocabList)

for word in inputSet :

if word in vocabList :

returnVec[vocabList.index(word)] = 1

else:

print (“the word %s is not in the vocabulary” % word)

return returnVec

def BoW_Vec(vocabList, inputSet):

returnVec = [0] * len(vocabList)

for word in inputSet :

if word in vocabList :

returnVec[vocabList.index(word)] += 1

else:

print (“the word %s is not in the vocabulary” % word)

return returnVec

接下來,我們建立分類器:這里需要注意的是,由于概率都是 0-1 之間的數(shù),連續(xù)的相乘,會讓最終結(jié)果趨于0,所以我們可以把概率相乘轉(zhuǎn)到對數(shù)域的相加:

def Train_NB(trainMat, trainClass) :

Num_doc = len(trainMat)

Num_word = len(trainMat[0])

P_1 = sum(trainClass) / float(Num_doc)

P0_num = np.zeros(Num_word) + 1

P1_num = np.zeros(Num_word) + 1

P0_deno = 2.0

P1_deno = 2.0

for i in range(Num_doc):

if trainClass[i] == 1:

P1_num += trainMat[i]

P1_deno +=sum(trainMat[i])

else:

P0_num += trainMat[i]

P0_deno += sum(trainMat[i])

P1_vec = np.log(P1_num / P1_deno)

P0_vec = np.log(P0_num / P0_deno)

return P_1, P1_vec, P0_vec

def Classify_NB(testVec, P0_vec, P1_vec, P1):

p1 = sum(testVec * P1_vec) + math.log(P1)

p0 = sum(testVec * P0_vec) + math.log(1-P1)

if p1 》 p0:

return 1

else:

return 0

def Text_parse(longstring):

import re

regEx = re.compile(r‘\W*’)

Listoftokens = regEx.split(longstring)

return [tok.lower() for tok in Listoftokens if len(tok)》0]

# return Listoftokens

這里給出簡單的測試:

test_string = ‘This book is the best book on Python or M.L.\

I have ever laid eyes upon.’

wordList = Text_parse(test_string)

Mydata, classVec = Load_dataset()

‘’‘

Doc_list = []

Full_list = []

for i in range (len(Mydata)):

Doc_list.append(Mydata[i])

Full_list.extend(Mydata[i])

’‘’

Vocablist = Create_vocablist(Mydata)

Wordvec = Word2Vec(Vocablist, Mydata[0])

trainMat = []

for doc in Mydata:

trainMat.append(Word2Vec(Vocablist, doc))

P_1, P1_vec, P0_vec = Train_NB(trainMat, classVec)

print Mydata

print classVec

print wordList

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 機(jī)器學(xué)習(xí)

    關(guān)注

    66

    文章

    8418

    瀏覽量

    132628
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84682
收藏 人收藏

    評論

    相關(guān)推薦

    非常通俗的樸素算法(Naive Bayes)

    樸素算法(Naive Bayes)閱讀目錄一、病人分類的例子二、樸素貝葉斯
    發(fā)表于 10-08 10:14

    機(jī)器學(xué)習(xí)的樸素講解

    秦剛剛的機(jī)器學(xué)習(xí)成長之路之樸素
    發(fā)表于 05-15 14:41

    樸素法的優(yōu)缺點(diǎn)

    樸素法(1) 之 基礎(chǔ)概念
    發(fā)表于 08-05 11:32

    樸素法的惡意留言過濾

    樸素法(2) 之 惡意留言過濾
    發(fā)表于 08-26 14:40

    常用的分類方法樸素

    統(tǒng)計學(xué)習(xí)方法樸素
    發(fā)表于 11-05 09:24

    樸素算法的理解

    我對樸素算法的理解
    發(fā)表于 05-15 14:13

    機(jī)器學(xué)習(xí)之樸素應(yīng)用教程

    今天介紹機(jī)器學(xué)習(xí)中一種基于概率常見分類方法樸素
    發(fā)表于 11-25 12:49 ?1386次閱讀
    機(jī)器學(xué)習(xí)之<b class='flag-5'>樸素</b><b class='flag-5'>貝</b><b class='flag-5'>葉</b><b class='flag-5'>斯</b>應(yīng)用教程

    樸素算法的后延概率最大化的認(rèn)識與理解

    樸素法是基于貝葉斯定理與特征條件獨(dú)立假設(shè)的分類方法。最為廣泛的兩種
    發(fā)表于 11-30 17:11 ?3322次閱讀
    <b class='flag-5'>樸素</b><b class='flag-5'>貝</b><b class='flag-5'>葉</b><b class='flag-5'>斯</b>算法的后延<b class='flag-5'>概率</b>最大化的認(rèn)識與理解

    分類算法及其實(shí)現(xiàn)

     算法描述及實(shí)現(xiàn)根據(jù)樸素公式,每個測試樣
    發(fā)表于 02-02 15:54 ?7447次閱讀
    <b class='flag-5'>貝</b><b class='flag-5'>葉</b><b class='flag-5'>斯</b><b class='flag-5'>分類</b>算法及其實(shí)現(xiàn)

    樸素NB經(jīng)典案例

    分類算法是統(tǒng)計學(xué)的一種分類方法,其分類原理就是
    發(fā)表于 02-28 10:17 ?2次下載

    機(jī)器學(xué)習(xí)之樸素

    學(xué)習(xí)過概率的人一定知道貝葉斯定理,在信息領(lǐng)域內(nèi)有著無與倫比的地位。算法是基于貝葉斯定理的一類算法,主要用來解決分類和回歸問題。人工智能
    發(fā)表于 05-29 09:01 ?894次閱讀

    樸素算法詳細(xì)總結(jié)

    樸素法是基于貝葉斯定理與特征條件獨(dú)立假設(shè)的分類方法,是經(jīng)典的機(jī)器學(xué)習(xí)算法之一,處理很多問題
    的頭像 發(fā)表于 07-01 08:37 ?3.5w次閱讀
    <b class='flag-5'>樸素</b><b class='flag-5'>貝</b><b class='flag-5'>葉</b><b class='flag-5'>斯</b>算法詳細(xì)總結(jié)

    帶你入門常見的機(jī)器學(xué)習(xí)分類算法——邏輯回歸、樸素、KNN、SVM、決策樹

    樸素方法是一組基于貝葉斯定理的監(jiān)督學(xué)習(xí)算法,在給定類變量值的情況下,樸素假設(shè)每對特征之間存
    的頭像 發(fā)表于 05-06 09:29 ?1w次閱讀

    樸素分類 樸素算法的優(yōu)點(diǎn)

    。 雖然這個簡化方式在一定程度上降低了分類算法的分類效果,但是在實(shí)際的應(yīng)用場景中,極大地簡化了
    的頭像 發(fā)表于 10-02 17:14 ?9329次閱讀

    使用樸素和GPU進(jìn)行更快的文本分類

    樸素( NB )是一種簡單但功能強(qiáng)大的概率分類技術(shù),具有良好的并行性,可以擴(kuò)展到大規(guī)模數(shù)據(jù)
    的頭像 發(fā)表于 10-10 14:50 ?1325次閱讀
    使用<b class='flag-5'>樸素</b><b class='flag-5'>貝</b><b class='flag-5'>葉</b><b class='flag-5'>斯</b>和GPU進(jìn)行更快的文本<b class='flag-5'>分類</b>