機(jī)器學(xué)習(xí)—樸素貝葉斯(Naive Bayes)

樸素貝葉斯概述

樸素貝葉斯是一種簡(jiǎn)單但功能驚人的預(yù)測(cè)建模算法驹沿。
該模型由兩種可以直接從訓(xùn)練數(shù)據(jù)中計(jì)算的概率組成: 1) 每個(gè)類的概率; 2) 給定每個(gè)x值后每個(gè)類的條件概率客税。 一旦計(jì)算出概率模型况褪,就可以用貝葉斯定理對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè)。當(dāng)你的數(shù)據(jù)是實(shí)值時(shí)更耻,通常假設(shè)一個(gè)高斯分布(鐘形曲線)测垛,這樣你就可以很容易地估計(jì)這些概率。

樸素貝葉斯(Naive Bayes)

樸素貝葉斯之所以稱“樸素”秧均,是因?yàn)樗僭O(shè)每個(gè)輸入變量是獨(dú)立的食侮。這對(duì)于真實(shí)數(shù)據(jù)來(lái)說(shuō)是一個(gè)很強(qiáng)的、不切實(shí)際的假設(shè)目胡,然而锯七,該技術(shù)對(duì)于大量復(fù)雜問(wèn)題非常有效。

舉個(gè)在 NLP (Natural Language Processing)的應(yīng)用

給一段文字誉己,返回情感分類眉尸,這段文字的態(tài)度是positive,還是negative巨双。



為了解決這個(gè)問(wèn)題噪猾,可以只看其中的一些單詞。



這段文字筑累,將僅由一些單詞和它們的計(jì)數(shù)代表袱蜡。

原始問(wèn)題是:給你一句話,它屬于哪一類慢宗,
通過(guò) bayes rules 變成一個(gè)比較簡(jiǎn)單容易求得的問(wèn)題坪蚁。


問(wèn)題變成,這一類中這句話出現(xiàn)的概率是多少镜沽,當(dāng)然敏晤,別忘了公式里的另外兩個(gè)概率。
栗子:?jiǎn)卧~ love 在 positive 的情況下出現(xiàn)的概率是 0.1缅茉,在 negative 的情況下出現(xiàn)的概率是 0.001茵典。


樸素貝葉斯分類算法案例

大體計(jì)算方法:
P(好評(píng) | 單詞1,單詞2宾舅,單詞3) = P(單詞1统阿,單詞2彩倚,單詞3 | 好評(píng)) * P(好評(píng)) / P(單詞1,單詞2扶平,單詞3)
因?yàn)榉帜付枷嗤耄灾挥帽容^分子即可--->P(單詞1,單詞2结澄,單詞3 | 好評(píng)) P(好評(píng))
每個(gè)單詞之間都是相互獨(dú)立的---->P(單詞1 | 好評(píng))P(單詞2 | 好評(píng))P(單詞3 | 好評(píng))*P(好評(píng))
P(單詞1 | 好評(píng)) = 單詞1在樣本好評(píng)中出現(xiàn)的總次數(shù)/樣本好評(píng)句子中總的單詞數(shù)
P(好評(píng)) = 樣本好評(píng)的條數(shù)/樣本的總條數(shù)

同理:
P(差評(píng) | 單詞1哥谷,單詞2,單詞3) = P(單詞1麻献,單詞2们妥,單詞3 | 差評(píng)) * P(差評(píng)) / P(單詞1,單詞2勉吻,單詞3)
因?yàn)榉帜付枷嗤嗌簦灾挥帽容^分子即可--->P(單詞1,單詞2齿桃,單詞3 | 差評(píng)) P(差評(píng))
每個(gè)單詞之間都是相互獨(dú)立的---->P(單詞1 | 差評(píng))P(單詞2 | 差評(píng))P(單詞3 | 差評(píng))*P(差評(píng))

#!/usr/bin/python
# coding=utf-8
from numpy import *

# 過(guò)濾網(wǎng)站的惡意留言  侮辱性:1     非侮辱性:0
# 創(chuàng)建一個(gè)實(shí)驗(yàn)樣本
def loadDataSet():
    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','ate','my','steak','how','to','stop','him'],
                   ['quit','buying','worthless','dog','food','stupid']]
    classVec = [0,1,0,1,0,1]
    return postingList, classVec

# 創(chuàng)建一個(gè)包含在所有文檔中出現(xiàn)的不重復(fù)詞的列表
def createVocabList(dataSet):
    vocabSet = set([])      # 創(chuàng)建一個(gè)空集
    for document in dataSet:
        vocabSet = vocabSet | set(document)   # 創(chuàng)建兩個(gè)集合的并集
    return list(vocabSet)

# 將文檔詞條轉(zhuǎn)換成詞向量
def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0]*len(vocabList)        # 創(chuàng)建一個(gè)其中所含元素都為0的向量
    for word in inputSet:
        if word in vocabList:
            # returnVec[vocabList.index(word)] = 1     # index函數(shù)在字符串里找到字符第一次出現(xiàn)的位置  詞集模型
            returnVec[vocabList.index(word)] += 1      # 文檔的詞袋模型    每個(gè)單詞可以出現(xiàn)多次
        else: print("the word: %s is not in my Vocabulary!" % word)
    return returnVec

# 樸素貝葉斯分類器訓(xùn)練函數(shù)   從詞向量計(jì)算概率
def trainNB0(trainMatrix, trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    # p0Num = zeros(numWords); p1Num = zeros(numWords)
    # p0Denom = 0.0; p1Denom = 0.0
    p0Num = ones(numWords);   # 避免一個(gè)概率值為0,最后的乘積也為0
    p1Num = ones(numWords);   # 用來(lái)統(tǒng)計(jì)兩類數(shù)據(jù)中惑惶,各詞的詞頻
    p0Denom = 2.0;  # 用于統(tǒng)計(jì)0類中的總數(shù)
    p1Denom = 2.0  # 用于統(tǒng)計(jì)1類中的總數(shù)
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
            # p1Vect = p1Num / p1Denom
            # p0Vect = p0Num / p0Denom
    p1Vect = log(p1Num / p1Denom)    # 在類1中,每個(gè)次的發(fā)生概率
    p0Vect = log(p0Num / p0Denom)      # 避免下溢出或者浮點(diǎn)數(shù)舍入導(dǎo)致的錯(cuò)誤   下溢出是由太多很小的數(shù)相乘得到的
    return p0Vect, p1Vect, pAbusive

# 樸素貝葉斯分類器
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify*p1Vec) + log(pClass1)
    p0 = sum(vec2Classify*p0Vec) + log(1.0-pClass1)
    if p1 > p0:
        return 1
    else:
        return 0

def testingNB():
    listOPosts, listClasses = loadDataSet()
    myVocabList = createVocabList(listOPosts)
    trainMat = []
    for postinDoc in listOPosts:
        trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
    p0V, p1V, pAb = trainNB0(array(trainMat), array(listClasses))
    testEntry = ['love','my','dalmation']
    thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
    print(testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb))
    testEntry = ['stupid','garbage']
    thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
    print(testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb))

# 調(diào)用測(cè)試方法----------------------------------------------------------------------
testingNB()

運(yùn)行結(jié)果:


樸素貝葉斯算法小結(jié)

樸素貝葉斯算法的主要原理基本已經(jīng)做了總結(jié)短纵,這里對(duì)樸素貝葉斯的優(yōu)缺點(diǎn)做一個(gè)總結(jié)带污。

樸素貝葉斯的主要優(yōu)點(diǎn)有

  • 1)樸素貝葉斯模型發(fā)源于古典數(shù)學(xué)理論,有穩(wěn)定的分類效率香到。
  • 2)對(duì)小規(guī)模的數(shù)據(jù)表現(xiàn)很好鱼冀,能個(gè)處理多分類任務(wù),適合增量式訓(xùn)練悠就,尤其是數(shù)據(jù)量超出內(nèi)存時(shí)千绪,我們可以一批批的去增量訓(xùn)練。
  • 3)對(duì)缺失數(shù)據(jù)不太敏感理卑,算法也比較簡(jiǎn)單翘紊,常用于文本分類蔽氨。

樸素貝葉斯的主要缺點(diǎn)有

  • 1) 理論上藐唠,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。但是實(shí)際上并非總是如此鹉究,這是因?yàn)闃闼刎惾~斯模型給定輸出類別的情況下,假設(shè)屬性之間相互獨(dú)立宇立,這個(gè)假設(shè)在實(shí)際應(yīng)用中往往是不成立的,在屬性個(gè)數(shù)比較多或者屬性之間相關(guān)性較大時(shí)自赔,分類效果不好妈嘹。而在屬性相關(guān)性較小時(shí),樸素貝葉斯性能最為良好绍妨。對(duì)于這一點(diǎn)润脸,有半樸素貝葉斯之類的算法通過(guò)考慮部分關(guān)聯(lián)性適度改進(jìn)柬脸。
  • 2)需要知道先驗(yàn)概率,且先驗(yàn)概率很多時(shí)候取決于假設(shè)毙驯,假設(shè)的模型可以有很多種倒堕,因此在某些時(shí)候會(huì)由于假設(shè)的先驗(yàn)?zāi)P偷脑驅(qū)е骂A(yù)測(cè)效果不佳。
  • 3)由于我們是通過(guò)先驗(yàn)和數(shù)據(jù)來(lái)決定后驗(yàn)的概率從而決定分類爆价,所以分類決策存在一定的錯(cuò)誤率垦巴。
  • 4)對(duì)輸入數(shù)據(jù)的表達(dá)形式很敏感。

以上就是樸素貝葉斯算法的一個(gè)總結(jié)铭段,希望可以幫到朋友們骤宣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市序愚,隨后出現(xiàn)的幾起案子憔披,更是在濱河造成了極大的恐慌,老刑警劉巖展运,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件活逆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡拗胜,警方通過(guò)查閱死者的電腦和手機(jī)蔗候,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)埂软,“玉大人锈遥,你說(shuō)我怎么就攤上這事】迸希” “怎么了所灸?”我有些...
    開(kāi)封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)炫七。 經(jīng)常有香客問(wèn)我爬立,道長(zhǎng),這世上最難降的妖魔是什么万哪? 我笑而不...
    開(kāi)封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任侠驯,我火速辦了婚禮,結(jié)果婚禮上奕巍,老公的妹妹穿的比我還像新娘吟策。我一直安慰自己,他們只是感情好的止,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布檩坚。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匾委。 梳的紋絲不亂的頭發(fā)上拖叙,一...
    開(kāi)封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音赂乐,去河邊找鬼憋沿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沪猴,可吹牛的內(nèi)容都是我干的辐啄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼运嗜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼壶辜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起担租,我...
    開(kāi)封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤砸民,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后奋救,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體岭参,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年尝艘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了演侯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡背亥,死狀恐怖秒际,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狡汉,我是刑警寧澤娄徊,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站盾戴,受9級(jí)特大地震影響寄锐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尖啡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一橄仆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧可婶,春花似錦沿癞、人聲如沸援雇。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至具温,卻和暖如春蚕涤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铣猩。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工揖铜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人达皿。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓天吓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親峦椰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子龄寞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344