1. 程式人生 > >Bayesian(貝葉斯)

Bayesian(貝葉斯)

樸素貝葉斯原理:

這裡寫圖片描述

雖然決策樹抽象出了規則,方便了人的理解,但是嚴格按照決策樹來判斷新朋友能否成為好朋友感覺很困難,這個可能效能夠把握嗎?比如我和TA有80%的可能成為好朋友。又或者能將我的朋友們分為“三六九等”嗎?即,多分類問題。今天總結–和決策樹一樣被最為廣泛應用的樸素貝葉斯模型。

先上貝葉斯定理:

P(X|Y)=P(X,Y)P(Y)
P(Y|X)=P(X,Y)P(X)
由條件概率很容易看出:P(Y|X)=P(X|Y)P(Y)P(X)
更一般的寫法為:P(Yi|X)=P(X|Yi)P(Yi)iP(X|Y=Yi)P(Yi)

從貝葉斯定理出發,很容易想到基於它來估計後驗概率P(Y|X)。但是P(X|Y)是所有屬性上的聯合概率,難以從有限的資料集中直擊估計,為此“樸素”貝葉斯採用了條件獨立性假設:假設所有屬性相互獨立。此時有:

P(X,Y)=P(X)P(Y)
貝葉斯可重寫為:
hnb(x)=argmaxCkP(Y)i=1nP(Xi|Y),n
PYPXi|Y那麼由此可以做一個很重要的文字分類的簡單模型了。

演算法實現:(Python)

from numpy import *
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 def createVocabList(dataSet): vocabSet = set([]) for document in dataSet: vocabSet = vocabSet | set(document) #集合的並集,目的是使詞不重複 return list(vocabSet) def setOfWords2Vec(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 my Vocabulary!" % word) return returnVec def bagOfWords2VecMN(vocabList, inputSet):#詞袋模型,改進函式setOfWords2Vec。出現多次的詞可能有某種意味。 returnVec = [0]*len(vocabList) for word in inputSet: if word in vocabList: returnVec[vocabList.index(word)] += 1 return returnVec def trainNB0(trainMatrix,trainCategory):#文件矩陣和標籤。概率 numTrainDocs = len(trainMatrix) numWords = len(trainMatrix[0]) pAbusive = sum(trainCategory)/float(numTrainDocs) p0Num = ones(numWords); p1Num = ones(numWords) p0Denom = 2.0; p1Denom = 2.0#初始化為2 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 = log(p1Num/p1Denom) p0Vect = log(p0Num/p0Denom) #用了log防止很多小數相乘而導致下溢或者出現不正確的答案。 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,'類別是 ',classifyNB(thisDoc,p0V,p1V,pAb)) testEntry = ['stupid', 'garbage'] thisDoc = array(setOfWords2Vec(myVocabList, testEntry)) print (testEntry,'類別是 ',classifyNB(thisDoc,p0V,p1V,pAb)) testingNB()

>
[‘love’, ‘my’, ‘dalmation’] 類別是 0
[‘stupid’, ‘garbage’] 類別是 1

同樣的,我們來探討一下出現問題

有些概率怎麼為0了?Laplace校準。
由於某些屬性在訓練集中可能沒有與某個類別同時出現過,那麼計算時P(a|y)=0,這顯然不太合理,結果的準確自然也是大大降低的。為了避免這種現象出現,所以引入了Laplace校準,即+1(通常取1),當然為了保證概率相等,分母應對應初始化為2(這裡因為是2類,所以加2,如果是k類就需要加k,術語上叫做laplace光滑, 分母加k的原因是使之滿足全概率公式)。至於+1之後的影響在資料集很大的情況下可以忽略。(即使貝葉斯在小規模資料集表現更好,但相較之下“1”還是微不足道的)

所有特徵出現概率都很低?稀疏資料問題。
如果離散的資料很稀疏時,可以假設x符合伯努利分佈以便於計算(在scikit-learn中有GaussianNB(高斯分佈,適用連續值),MultinomialNB(多項式分佈,適用離散值)和BernoulliNB(伯努利分佈)三種實現。)。

非離散值怎麼辦?引數估計問題。
當特徵為連續值時,通過極大似然(maximum likelihood,ML)求期望和方差就行了。

“樸素”是什麼?為什麼要“樸素”?達不到樸素怎麼辦?貝葉斯的變體。
“樸素”是樸素貝葉斯演算法的核心,即基於假設特徵之間相互獨立。設這個前提的目的是為了避免組合爆炸,樣本稀疏問題等問題。而在實際中這個假設往往不成立,從而導致分類效果受影響。
改進方法有很多,從特徵間的關係來考慮的話,可以對特徵進行分組使組內關聯而組間獨立;刪除部分重合或者依賴性強的“冗餘”特徵;對某些特徵加權(APNBC(根據效果會對權重進行二次加權調整),WNB(基於特徵重要性)等);基於互資訊的INB,即每個條件屬性對屬性的重要度採用互資訊度量(統計獨立關係)。
也可以直接降低“樸素”的門檻,產生了半樸素貝葉斯分類器(semi_naive Bayes classifiers,SNBC)。它的基本想法是適當的考慮一部分屬性間的相互依賴資訊,從而既不完全聯合概率計算,又不至於徹底忽略比較強的屬性依賴關係,它折中了樸素貝葉斯和貝葉斯網路,限制網路的結構複雜程度,重點在於如何聚集依賴關係較大的屬性,其中最直接的方法就是假設所有的屬性都歸於同一個屬性“超父”,然後通過交叉驗證來確定超父屬性,由此形成了SPODE方法(Super_Parent ODE)。以特徵之間的條件互資訊作為權值構建完全圖,再根據該完全圖再構建一個最大帶權生成樹來挑選的TAN方法(Tree Augmented naive Bayes), 其中的條件互資訊為:

I(xi,xj|y)=xi,xj;yYP(xi,xj|y)logP(xi,xj|y)P(xi|y)P(xj|y)最後可以用Boosting和Bagging技術,或者整合其他演算法,諸如SVM,遺傳演算法等來進一步提高效能,比如對每個屬性構建SPODE,並將結果整合起來作為最終結果的平均一依賴性評估演算法(Averaged One_Dependent Estimator,AODE)。

這裡寫圖片描述

貝葉斯信念網(Bayesian network),它藉助有向無環圖(Directed Acyclic Graph,DAG)來刻畫屬性間的依賴關係,並使用條件概率(Conditional Probability Table,CPT)來描述屬性的聯合概率分佈。(其每個結點代表一個隨機變數,而每條弧代表一個概率依賴。)
這裡寫圖片描述

求在貝葉斯信念網中對應於屬性集D的任意元組的聯合概率將變為:

P(

相關推薦

Bayesian

樸素貝葉斯原理: 雖然決策樹抽象出了規則,方便了人的理解,但是嚴格按照決策樹來判斷新朋友能否成為好朋友感覺很困難,這個可能效能夠把握嗎?比如我和TA有80%的可能成為好朋友。又或者能將我的朋友們分為“三六九等”嗎?即,多分類問題。今天總結–和決策樹一樣被最

自動機器學習超引數調整優化

【導讀】機器學習中,調參是一項繁瑣但至關重要的任務,因為它很大程度上影響了演算法的效能。手動調參十分耗時,網格和隨機搜尋不需要人力,但需要很長的執行時間。因此,誕生了許多自動調整超引數的方法。貝葉斯優化是一種用模型找到函式最小值方法,已經應用於機器學習問題中的超引數搜尋,這種方法效能好,同時比隨機搜尋省時。此

機器學習2:Naive Bayes樸素

參考:https://blog.csdn.net/syoya1997/article/details/78618885貝葉斯模型的講解 貝葉斯模型 ,二分類中展開為 P(H) – 已知的先驗概率 P(H|E) – 我們想求的後驗概率,即在B事件發生後對於事件A概率的評估

最大似然估計和最大後驗概率估計引數估計

舉個例子:偷盜的故事,三個村莊,五個人偷。 村子被不同小偷偷的概率:P(村子|小偷1)、P(村子|小偷2)、P(村子|小偷3) 小偷1的能力:P(偷盜能力)=P(村子1|小偷1)+P(村子2|小偷1)+P(村子3|小偷1)+P(村子4|小偷1)+P(村子5|小偷1) 小

機器學習----分類器決策論和極大似然估計

貝葉斯決策論 貝葉斯決策論(Bayesian decision theory)是概率框架下實施決策的基本方法。在所有相關概率都已知的理想情況下,貝葉斯決策論考慮如何基於這些概率和誤判斷來選擇最優的類別標記。 假設有N種可能的類別標記,即Y={c1,c2,.

【轉載】引數估計(Parameter Estimation):頻率學派最大似然估計MLE、最大後驗估計MAP學派估計BPE

基礎 頻率學派與貝葉斯學派 最大似然估計(Maximum likelihood estimation,MLE) 最大後驗估計(maximum a posteriori estimation,MAP) 貝葉斯估計(Bayesian parameter estimation,BPE) 經典引數估計方

Naive Bayes樸素

Naive Bayes Bayes’ theorem(貝葉斯法則) 在概率論和統計學中,Bayes’ theorem(貝葉斯法則)根據事件的先驗知識描述事件的概率。貝葉斯法則表示式如下所示: P(A|B)=P(B|A)P(A)P(B)(1)(1)P

【Kaggle筆記】新聞文字分類樸素

樸素貝葉斯模型適用場景 海量文字分類任務 假設資料特徵與目標之間存線上性關係 資料集 sklearn 中的 fetch_20newsgroups 程式碼 # -*- c

周志華 《機器學習》之 第七章分類器概念總結

貝葉斯分類器是利用概率的知識完成資料的分類任務,在機器學習中使用貝葉斯決策論實施決策的基本方法也是在概率的框架下進行的,它是考慮如何基於這些概率和誤判損失來選擇最優的類別標記。 1、貝葉斯決策論 條件風險:假設有N種可能的類別標記,Y={c1,c2,c3

機器學習,K-means,ROC,AUC)

決策 曲線 輸入數據 初始 分享 是否 ensemble 並不是 線性不可分 申明:因為看的這個課老師講的有點亂,課程也有的章節少那麽幾小節。所以對一些東西沒理解透徹,而且有些亂。 所以,望理解,等以後學的更深刻了再回來修改。 1.ROC與AOC ROC與AUC

[PRML] Bayesian Learning 學習方法

問題引入   在上一篇部落格[PRML] Point Estimation 點估計 的最後,難搞的富翁提了一個無厘頭的問題,他固執地認為,圖釘頭朝上和屁股朝上的概率和拋硬幣一樣是五五開。儘管我們很好地用理論闡述了為什麼圖釘頭朝上的概率是3/5,但富翁還是要我們

樸素Naive Bayesian

tar 不可 https 獲得 現實 叠代 結構 步驟 無法 一、貝葉斯定理 機器學習所要實現的均是通過有限的訓練樣本盡可能的準確估計出後驗概率,也就是所說的結果情況。大題分為判別式模型和生成式模型。 1. 判別式模型:直接通過建模P(結果|特征)的方式來預測結果,典型代

線性迴歸Bayesian Linear Regression

關於引數估計    在很多機器學習或資料探勘的問題中,我們面對的只有資料,但資料中潛在的概率密度函式我們是不知道的,我們需要用資料將概率密度分佈估計出來。想要確定資料對應的概率密度分佈,我們需要確定兩個東西:①概率密度函式的形式;②概率密度函式的引數。   

概率圖模型PGMBayesian network初探

1. 從貝葉斯方法(思想)說起 - 我對世界的看法隨世界變化而隨時變化 用一句話概括貝葉斯方法創始人Thomas Bayes的觀點就是:任何時候,我對世界總有一個主觀的先驗判斷,但是這個判斷會隨著世界的真實變化而隨機修正,我對世界永遠保持開放的態度。 1763年,民間科學家Thomas Bayes發表

筆記斯坦福機器學習第六講--樸素

span || -h 沒有 height 單純 去除 變量 logistic 本講內容 1. Naive Bayes(樸素貝葉斯) 2.Event models(樸素貝葉斯的事件模型) 3.Neural network (神經網絡) 4.Support vector mac

基於的樸素的文本分類附完整代碼(spark/java

ava -s for 轉換成 模型保存 ext js rgs cti txt 本文主要包括以下內容: 1)模型訓練數據生成(demo) 2 ) 模型訓練(spark+java),數據存儲在hdfs上 3)預測數據生成(demo) 4)使用生成的模型進行文本分類。 一

Knowledge Tracing -- 基於的學生知識點追蹤BKT

mod 所有 strong tor mode 領域 我們 med ability 目前,教育領域通過引入人工智能的技術,使得在線的教學系統成為了智能教學系統(ITS),ITS不同與以往的MOOC形式的課程。ITS能夠個性化的為學生制定有效的 學習路徑,通過根據

利用樸素Navie Bayes進行垃圾郵件分類

判斷 ase create numpy water 向量 not in imp img 貝葉斯公式描寫敘述的是一組條件概率之間相互轉化的關系。 在機器學習中。貝葉斯公式能夠應用在分類問題上。這篇文章是基於自己的學習所整理。並利用一個垃圾郵件分類的樣例來加深對於理論的理解

vs頻率派:武功到底哪家強?| 說人話的統計學·協和八

定義 這一 tps cbc 出發 上一條 習慣 做出 而已 回我們初次見識了統計學理論中的“獨孤九劍”——貝葉斯統計學(戳這裏回顧),它的起源便是大名鼎鼎的貝葉斯定理。 整個貝葉斯統計學的精髓可以用貝葉斯定理這一條式子來概括: 我們做數據分析,絕大多數情況下希望得到的是關於

機器學習系列——樸素分類器

表示 -h line log ima 條件 code 樸素貝葉斯 spa 貝葉斯定理: 其中: 表示事件B已經發生的前提下,事件A發生的概率,叫做事件B發生下事件A的條件概率。其基本求解公式為:。 機器學習系列——樸素貝葉斯分類器(二)