1. 樸素貝葉斯分類演算法預測具有屬性的人是否買電腦python
它是一種基於貝葉斯定理的分類技術,具有預測者之間的獨立性假設。簡單地說,樸素貝葉斯分類器假定類中的特定特徵的存在與任何其他特徵的存在無關。例如,水果如果是紅色的、圓的、直徑約3英寸的,那麼久可以被認為是一個蘋果。即使這些特徵彼此依賴或存在其他特徵,樸素貝葉斯分類器將考慮所有這些屬性來獨立地區分這種水果是蘋果的概率。
樸素貝葉斯模型易於建立,特別適用於非常大的數據集。雖然簡單,但樸素貝葉斯是已知的高性能甚至高度復雜的分類方法。
Bayes定理為P(C)、P(X)和P(X,C)的後驗概率p(C* x)的計算提供了一種途徑。請看下面的方程式:
機器學習演算法:樸素貝葉斯|python與r語言代碼實現
在這里,
P(C x)是給定(屬性)的類(目標)的後驗概率。
P(C)是類的先驗概率。
P(x,c)是預測給定類的概率。
P(x)是預測器的先驗概率。
例子:讓我們用一個例子來理解它。下面我有一個訓練數據集的天氣和相應的目標變數「玩」。現在,我們需要根據天氣情況來判斷玩家是否想玩。讓我們按照下面的步驟來執行它。
步驟1:將數據集轉換為頻率表
步驟二:通過發現陰暗概率=0.29和概率為0.64的概率來創建似然表。
機器學習演算法:樸素貝葉斯|python與r語言代碼實現
步驟三:使用樸素貝葉斯方程計算每個類的後驗概率。具有最高後驗概率的類是預測的結果。
問題:如果天氣晴朗,玩家會想玩,這個說法是正確的嗎?
我們可以用上面討論的方法求解它,所以P(Yes | Sunny) = P( Sunny | Yes) * P(Yes) / P (Sunny)
這里我們有P (Sunny |Yes) = 3/9 = 0.33, P(Sunny) = 5/14 = 0.36, P( Yes)= 9/14 = 0.64 得出, P (Yes | Sunny) = 0.33 * 0.64 / 0.36 = 0.60,具有較高的概率。
樸素貝葉斯使用類似的方法來預測基於不同屬性的不同類別的概率。該演算法主要用於文本分類,存在多類問題。
2. 樸素貝葉斯(Naive Bayes)演算法
樸素貝葉斯演算法屬於分類演算法。發源於古典數學理論,對缺失數據不太敏感,有穩定的分類效率,模型所需估計的參數很少,演算法比較簡單。
樸素貝葉斯演算法 , 貝葉斯 是說明這個演算法和貝葉斯定理有聯系,而 樸素 是因為處理實際的需要,做了一個簡化—— 假設每個特徵之間是獨立的 (如果研究的對象互相之間的影響很強,計算概率時考慮的問題非常復雜,做了獨立假設,就可以分解後進行研究),這是這個演算法模型與貝葉斯定理的區別。
將 x 作為特徵,y 作為類別,那公式左邊的 P(yi|x)就是說在知道特徵 x 的情況下,計算這個特徵屬於 yi 類的可能性大小。通過比較找出這個可能性的值最大的屬於哪一類,就將特徵 x 歸為這一類。
第3步的計算就是整個關鍵所在,計算依據是上面的貝葉斯公式。
對於每一個類的概率計算,公式右邊的分母的 P(x)都是相同的,所以可以不計算(我們只是對最終結果進行比較,不影響)。
P(yi)也稱為先驗概率,是 x 屬於 yi 類的一個概率,這個是通過歷史信息得到的(在程序實現的時候,歷史信息或者說先驗信息就是我們的訓練數據集),我們通過對訓練樣本數據進行統計,分別算出 x 屬於 y1,y2,...,yn 類的概率是多少,這個是比較容易得到的。
所以,主要是求 P(x|yi)= P(a1,a2,...,am|yi)
這個時候對於貝葉斯模型的 樸素 的獨立性假設就發揮作用了(綜合的計算變成了獨立計算後的綜合,簡化模型,極大地減少了計算的復雜程度):
P(a1,a2,...,am|yi) = P(a1|yi)P(a2|yi)...P(am|yi)
所以計算想要得到的東西如下:
一個程序簡例
3. 樸素貝葉斯演算法
貝葉斯演算法是由英國數學家托馬斯·貝葉斯提出的,這個演算法的提出是為了解決「逆向概率」的問題。首先我們先來解釋下正向概率與逆向概率的含義:
正向概率 :假設一個箱子里有5個黃色球和5個白色球,隨機從箱子里拿出一個球,請問取出的是黃球的概率是多少?很容易計算P(黃球)= N(黃球)/N(黃球)+ N(白球) = 5/5+5 = 1/2。
逆向概率 :起初我們並不知道箱子里有多少個球,我們依次從箱子里取出10個球,發現這個10個球中有7個白球,3個黃球,那麼我們會根據我們觀察到的結果去推測箱子里白球與黃球的分布比例大概是7:3,但是我們無法推測出箱子里的球的個數。
貝葉斯演算法是一種基於概率統計的機器學習演算法,它會計算出每種情況發生的概率,然後對其進行分類,貝葉斯演算法經常用於文本分類問題和垃圾郵件過濾問題。假設有一篇新聞報道news report,我們使用貝葉斯演算法來判斷它們的類別,結果如下:
p(politics|news) = 0.2
p(entertainment|news) = 0.4
p(sports|news) = 0.7
因為p(sports|news)的概率最大,所以我們判斷這篇新聞報道為體育類報道。「|」左邊為要判斷的類別,右邊是我們給定的文章。
貝葉斯公式推導
接下來,我們將通過一個例子來推導貝葉斯公式。在一所學校里,男生和女生的比例分別是60%和40%,男生全部穿長褲,女生一半穿長褲,一半穿裙子。現迎面走來一個同學,你只能看清他(她)穿的是長褲,而無法分辨出他(她)的性別,請問他(她)是女生的概率?
下面我們逐步計算這個問題:
假設學校里的學生總數為N。
男生人數:N * P(boys),女生人數:N * P(girls)。
穿長褲的男生人數:N * P(boys) * P(pants|boys),其中P(pants|boys)是條件概率的表達形式,意思是男生中穿長褲的概率。因為男生都穿長褲,所以N * P(boys) * P(pants|boys) = 60% * N。
穿長褲的女生的人數:N * P(girs) * P(pants|girls) = 0.2 * N。
穿長褲的總人數:N * P(boys) * P(pants|boys) + N * P(girs) * P(pants|girls)
穿長褲的同學是女生的概率:P(girl|pants) = N * P(girs) * P(pants|girls) / N * P(boys) * P(pants|boys) + N * P(girs) * P(pants|girls) = P(girs)*P(pants|girls) / P(pants),分母用P(pants)表示穿長褲的概率。
最終結果:P(girl | pants) = P(pants | girl) * P(girl) / P(pants)
其中:P(girl)我們稱為先驗概率,是已知值,在這個例子中P(girl) = 40%。先驗概率:根據以往的經驗和分析得到的結果,先驗概率和其他條件的影響不受樣本影響。
P(girl | pants)我們稱為後驗概率,根據觀察到的結果,去反推是女生的概率。
貝葉斯數學表達式
貝葉斯演算法在垃圾郵件過濾中的應用
給定一封郵件,判定它是否屬於垃圾郵件?用D 來表示這封郵件,注意D 由N 個單片語成。我們用h+ 來表示垃圾郵件,h-表示正常郵件。
有貝葉斯公式可得:
P(h+ | D) = P(D | h+) * P(h+) / P(D)
P(h- | D) = P(D | h-) * P(h-) / P(D)
其中P(h+),P(h-)為先驗概率,假如我們有1000封郵件,其中有50封是垃圾郵件,其他都是正常郵件,那麼P(h+),P(h-)的概率就是已知的。兩個式子的分母都是P(D),所以P(D)對於最終結果的比較是沒有影響的。接下來就是要求P(D | h+),P(D | h-)垃圾郵件中或正常郵件中是郵件D的概率。
我們都知道一封郵件是由許多詞構成的,所以我們將P(D | h+)的表達式轉化為P(d1,d2,d3......dn | h+),就是看垃圾郵件中出現d1,d2...dn這些詞的概率是多少。
P(d1,d2,d3......dn | h+) = P(d1 | h+) * P(d2 |d1,h+) * P(d3 |d1,d2,h+) ...
這個式子計算起來非常困難,所以在這里我們做一個假設,假設每個詞都是獨立的並且互不影響,那麼這個式子就可以表示為:
P(d1,d2,d3......dn | h+) = P(d1 | h+) * P(d2 | h+) * P(d3 | h+) ...P(dn | h+)
P(h+ | D) = {P(d1 | h+) * P(d2 | h+) * P(d3 | h+) ...P(dn | h+)}* P(h+) / P(D)
上述這個式子我們就稱為樸素貝葉斯公式,樸素貝葉斯公式是對貝葉斯公式的簡化,它建立在每個條子互相獨立的基礎上。
在現實生活中,我們寫的每一句話中詞與詞之間肯定是有相互聯系,如果沒有聯系,那麼這句話是讀不通的。那麼為什麼樸素貝葉斯能夠在計算中使用,首先是計算簡單,其次對最終結果的影響非常小。
參考資料
1.唐宇迪,《機器學習與數據分析實戰》課程。
2.Peter,《機器學習實戰》。
4. 數據挖掘-樸素貝葉斯演算法
樸素貝葉斯演算法,主要用於對相互獨立的屬性的類變數的分類預測。(各個屬性/特徵之間完全沒有關系,叫做相互獨立,事實上這很難存在,但是這個方法依然比較有效。)
大學的概率論里一般都學過這個貝葉斯定理,簡單闡述如下:
若事件 , ,…構成一個事件且都有正概率,則對任意一個事件Y,有如下公式成立:則有
如果X表示特徵/屬性,Y表示類變數,如果類變數和屬性之間的關系不確定,那麼X和Y可以視作隨機變數,則 為Y的後驗概率, 為Y的先驗概率。
以圖為例:
我們需要根據身高、體重、鞋碼判斷是男是女,則Y就是性別,X就是(身高、體重、鞋碼)這一組特徵。如果我們要先算是男的概率,則先驗概率就是 ,而後驗概率則是我們未來將要輸入的一組特徵已知的情況下,Y=男的概率(要預測的分類的概率),這樣的話,根據貝葉斯定理,我們就可以用 來求出 ,這就是貝葉斯定理在預測中的應用。
假設Y變數取y值時概率為P(Y=y),X中的各個特徵相互獨立,則有公式如下:
其中每個特徵集X包含d個特徵。
根據公式,對比上面的圖來說,如果性別是男的時候,身高是高,體重是重,鞋碼為大的概率就等於
有了這個公式,結合之前的貝葉斯公式,就能得到給定一組特徵值的情況下, 這組特徵屬於什麼樣的類別的概率公式:
其中的X代表一組特徵, 代表一組中的一個。
對於所有的Y來說,P(X)時固定的,因此只要找出使分子 最大的類別就可以判斷預測的類別了。
的概率分為兩種情況來區別,一種是對分類特徵的概率確定,一種是連續特徵的概率確定。
接下來借用《數據挖掘導論》上的例子來說明概率確定的方式。
對於分類的特徵,可以首先找到訓練集中為y值的個數,然後根據不同的特徵類型占這些個數中的比例作為分類特徵的概率。
例如上表中求不拖欠貸款的情況下,有房的人數就是 ,不拖欠貸款的有7個,其中有房的是3個。以此類推可以求出婚姻狀況的條件概率。
年收入是連續特徵,需要區分對待。
根據上述演算法,如果要求沒有拖欠貸款情況下,年收入是120K的概率,就是
如果要預測測試記錄 X =(有房=否,婚姻狀況=已婚,年收入=120K)這個樣本是否可能拖欠貸款,則需要計算兩個概率: 和
則有:
由於 是不變的(對於Y=是和Y=否),則只考慮上面的分子即可,那麼拋開P(X)不看,則有:
其中7/10就是P(Y=否),α是P(X)
同理可得P(Y=是|X) = 1 * 0 * 1.2e-1 = 0.
這樣一比較,那麼分類就是否。
看這個例子中,如果有一個特徵的條件概率是0,那麼整體的概率就是0,從而後驗概率也一定是0,那麼如果訓練集樣本太少,這種方法就不是很准確了。
如果當訓練集樣本個數比特徵還少的時候,就無法分類某些測試集了,因此引入 m估計(m-estimate) 來估計條件概率,公式如下:
其中,n是類 中的樣本總數, 是類 中取 的樣本數, 是稱為等價樣本大小的參數, 是用戶指定的參數,p可以看作在類 中觀察特徵值 的先驗概率。等價樣本大小決定先驗概率 和觀測概率 之間的平衡。
引入m估計的根本原因是樣本數量過小。所以為了避免此問題,最好的方法是等效的擴大樣本的數量,即在為觀察樣本添加m個等效的樣本,所以要在該類別中增加的等效的類別的數量就是等效樣本數m乘以先驗估計p。
在之前的例子中,設m=3,p=1/3(m可以設置為特徵數量,p則是倒數)。則:
從而可以重新計算 。從而解決了某個條件概率為0的問題。
面對相互獨立的特徵比較適用,如果有相關的特徵,則會降低其性能。
5. python scikit-learn 有什麼演算法
1,前言
很久不發文章,主要是Copy別人的總感覺有些不爽,所以整理些干貨,希望相互學習吧。不啰嗦,進入主題吧,本文主要時說的為樸素貝葉斯分類演算法。與邏輯回歸,決策樹一樣,是較為廣泛使用的有監督分類演算法,簡單且易於理解(號稱十大數據挖掘演算法中最簡單的演算法)。但其在處理文本分類,郵件分類,拼寫糾錯,中文分詞,統計機器翻譯等自然語言處理范疇較為廣泛使用,或許主要得益於基於概率理論,本文主要為小編從理論理解到實踐的過程記錄。
2,公式推斷
一些貝葉斯定理預習知識:我們知道當事件A和事件B獨立時,P(AB)=P(A)(B),但如果事件不獨立,則P(AB)=P(A)P(B|A)。為兩件事件同時發生時的一般公式,即無論事件A和B是否獨立。當然也可以寫成P(AB)=P(B)P(A|B),表示若要兩件事同事發生,則需要事件B發生後,事件A也要發生。
由上可知,P(A)P(B|A)= P(B)P(A|B)
推出P(B|A)=
其中P(B)為先驗概率,P(B|A)為B的後驗概率,P(A|B)為A的後驗概率(在這里也為似然值),P(A)為A的先驗概率(在這也為歸一化常量)。
由上推導可知,其實樸素貝葉斯法就是在貝葉斯定理基礎上,加上特徵條件獨立假設,對特定輸入的X(樣本,包含N個特徵),求出後驗概率最大值時的類標簽Y(如是否為垃圾郵件),理解起來比邏輯回歸要簡單多,有木有,這也是本演算法優點之一,當然運行起來由於得益於特徵獨立假設,運行速度也更快。
8. Python代碼
# -*-coding: utf-8 -*-
importtime
fromsklearn import metrics
fromsklearn.naive_bayes import GaussianNB
fromsklearn.naive_bayes import MultinomialNB
fromsklearn.naive_bayes import BernoulliNB
fromsklearn.neighbors import KNeighborsClassifier
fromsklearn.linear_model import LogisticRegression
fromsklearn.ensemble import RandomForestClassifier
fromsklearn import tree
fromsklearn.ensemble import GradientBoostingClassifier
fromsklearn.svm import SVC
importnumpy as np
importurllib
# urlwith dataset
url ="-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data"
#download the file
raw_data= urllib.request.urlopen(url)
#load the CSV file as a numpy matrix
dataset= np.loadtxt(raw_data, delimiter=",")
#separate the data from the target attributes
X =dataset[:,0:7]
#X=preprocessing.MinMaxScaler().fit_transform(x)
#print(X)
y =dataset[:,8]
print(" 調用scikit的樸素貝葉斯演算法包GaussianNB ")
model= GaussianNB()
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的樸素貝葉斯演算法包MultinomialNB ")
model= MultinomialNB(alpha=1)
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的樸素貝葉斯演算法包BernoulliNB ")
model= BernoulliNB(alpha=1,binarize=0.0)
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的KNeighborsClassifier ")
model= KNeighborsClassifier()
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的LogisticRegression(penalty='l2')")
model= LogisticRegression(penalty='l2')
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的RandomForestClassifier(n_estimators=8) ")
model= RandomForestClassifier(n_estimators=8)
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的tree.DecisionTreeClassifier()")
model= tree.DecisionTreeClassifier()
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的GradientBoostingClassifier(n_estimators=200) ")
model= GradientBoostingClassifier(n_estimators=200)
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
print(" 調用scikit的SVC(kernel='rbf', probability=True) ")
model= SVC(kernel='rbf', probability=True)
start_time= time.time()
model.fit(X,y)
print('training took %fs!' % (time.time() - start_time))
print(model)
expected= y
predicted= model.predict(X)
print(metrics.classification_report(expected,predicted))
print(metrics.confusion_matrix(expected,predicted))
"""
# 預處理代碼集錦
importpandas as pd
df=pd.DataFrame(dataset)
print(df.head(3))
print(df.describe())##描述性分析
print(df.corr())##各特徵相關性分析
##計算每行每列數據的缺失值個數
defnum_missing(x):
return sum(x.isnull())
print("Missing values per column:")
print(df.apply(num_missing, axis=0)) #axis=0代表函數應用於每一列
print(" Missing values per row:")
print(df.apply(num_missing, axis=1).head()) #axis=1代表函數應用於每一行"""
6. 貝葉斯網路,看完這篇我終於理解了(附代碼)!
概率圖模型是用圖來表示變數概率依賴關系的理論,結合概率論與圖論的知識,利用圖來表示與模型有關的變數的聯合概率分布。由圖靈獎獲得者Pearl開發出來。
如果用一個詞來形容概率圖模型(Probabilistic Graphical Model)的話,那就是「優雅」。對於一個實際問題,我們希望能夠挖掘隱含在數據中的知識。概率圖模型構建了這樣一幅圖,用觀測結點表示觀測到的數據,用隱含結點表示潛在的知識,用邊來描述知識與數據的相互關系, 最後基於這樣的關系圖獲得一個概率分布 ,非常「優雅」地解決了問題。
概率圖中的節點分為隱含節點和觀測節點,邊分為有向邊和無向邊。從概率論的角度,節點對應於隨機變數,邊對應於隨機變數的依賴或相關關系,其中 有向邊表示單向的依賴,無向邊表示相互依賴關系 。
概率圖模型分為 貝葉斯網路(Bayesian Network)和馬爾可夫網路(Markov Network) 兩大類。貝葉斯網路可以用一個有向圖結構表示,馬爾可夫網路可以表 示成一個無向圖的網路結構。更詳細地說,概率圖模型包括了樸素貝葉斯模型、最大熵模型、隱馬爾可夫模型、條件隨機場、主題模型等,在機器學習的諸多場景中都有著廣泛的應用。
長久以來,人們對一件事情發生或不發生的概率,只有固定的0和1,即要麼發生,要麼不發生,從來不會去考慮某件事情發生的概率有多大,不發生的概率又是多大。而且概率雖然未知,但最起碼是一個確定的值。比如如果問那時的人們一個問題:「有一個袋子,裡面裝著若干個白球和黑球,請問從袋子中取得白球的概率是多少?」他們會想都不用想,會立馬告訴你,取出白球的概率就是1/2,要麼取到白球,要麼取不到白球,即θ只能有一個值,而且不論你取了多少次,取得白球的 概率θ始終都是1/2 ,即不隨觀察結果X 的變化而變化。
這種 頻率派 的觀點長期統治著人們的觀念,直到後來一個名叫Thomas Bayes的人物出現。
托馬斯·貝葉斯Thomas Bayes(1702-1763)在世時,並不為當時的人們所熟知,很少發表論文或出版著作,與當時學術界的人溝通交流也很少,用現在的話來說,貝葉斯就是活生生一民間學術「屌絲」,可這個「屌絲」最終發表了一篇名為「An essay towards solving a problem in the doctrine of chances」,翻譯過來則是:機遇理論中一個問題的解。你可能覺得我要說:這篇論文的發表隨機產生轟動效應,從而奠定貝葉斯在學術史上的地位。
這篇論文可以用上面的例子來說明,「有一個袋子,裡面裝著若干個白球和黑球,請問從袋子中取得白球的概率θ是多少?」貝葉斯認為取得白球的概率是個不確定的值,因為其中含有機遇的成分。比如,一個朋友創業,你明明知道創業的結果就兩種,即要麼成功要麼失敗,但你依然會忍不住去估計他創業成功的幾率有多大?你如果對他為人比較了解,而且有方法、思路清晰、有毅力、且能團結周圍的人,你會不由自主的估計他創業成功的幾率可能在80%以上。這種不同於最開始的「非黑即白、非0即1」的思考方式,便是 貝葉斯式的思考方式。
先簡單總結下頻率派與貝葉斯派各自不同的思考方式:
貝葉斯派既然把看做是一個隨機變數,所以要計算的分布,便得事先知道的無條件分布,即在有樣本之前(或觀察到X之前),有著怎樣的分布呢?
比如往檯球桌上扔一個球,這個球落會落在何處呢?如果是不偏不倚的把球拋出去,那麼此球落在檯球桌上的任一位置都有著相同的機會,即球落在檯球桌上某一位置的概率服從均勻分布。這種在實驗之前定下的屬於基本前提性質的分布稱為 先驗分布,或著無條件分布 。
其中,先驗信息一般來源於經驗跟歷史資料。比如林丹跟某選手對決,解說一般會根據林丹歷次比賽的成績對此次比賽的勝負做個大致的判斷。再比如,某工廠每天都要對產品進行質檢,以評估產品的不合格率θ,經過一段時間後便會積累大量的歷史資料,這些歷史資料便是先驗知識,有了這些先驗知識,便在決定對一個產品是否需要每天質檢時便有了依據,如果以往的歷史資料顯示,某產品的不合格率只有0.01%,便可視為信得過產品或免檢產品,只每月抽檢一兩次,從而省去大量的人力物力。
而 後驗分布 π(θ|X)一般也認為是在給定樣本X的情況下的θ條件分布,而使π(θ|X)達到最大的值θMD稱為 最大後驗估計 ,類似於經典統計學中的 極大似然估計 。
綜合起來看,則好比是人類剛開始時對大自然只有少得可憐的先驗知識,但隨著不斷觀察、實驗獲得更多的樣本、結果,使得人們對自然界的規律摸得越來越透徹。所以,貝葉斯方法既符合人們日常生活的思考方式,也符合人們認識自然的規律,經過不斷的發展,最終占據統計學領域的半壁江山,與經典統計學分庭抗禮。
條件概率 (又稱後驗概率)就是事件A在另外一個事件B已經發生條件下的發生概率。條件概率表示為P(A|B),讀作「在B條件下A的概率」。
比如上圖,在同一個樣本空間Ω中的事件或者子集A與B,如果隨機從Ω中選出的一個元素屬於B,那麼這個隨機選擇的元素還屬於A的概率就定義為在B的前提下A的條件概率:
聯合概率:
邊緣概率(先驗概率):P(A)或者P(B)
貝葉斯網路(Bayesian network),又稱信念網路(Belief Network),或有向無環圖模型(directed acyclic graphical model),是一種概率圖模型,於1985年由Judea Pearl首先提出。它是一種模擬人類推理過程中因果關系的不確定性處理模型,其網路拓樸結構是一個有向無環圖(DAG)。
貝葉斯網路的有向無環圖中的節點表示隨機變數
它們可以是可觀察到的變數,或隱變數、未知參數等。認為有因果關系(或非條件獨立)的變數或命題則用箭頭來連接。若兩個節點間以一個單箭頭連接在一起,表示其中一個節點是「因(parents)」,另一個是「果(children)」,兩節點就會產生一個條件概率值。
例如,假設節點E直接影響到節點H,即E→H,則用從E指向H的箭頭建立結點E到結點H的有向弧(E,H),權值(即連接強度)用條件概率P(H|E)來表示,如下圖所示:
簡言之,把某個研究系統中涉及的隨機變數,根據是否條件獨立繪制在一個有向圖中,就形成了貝葉斯網路。其主要用來描述隨機變數之間的條件依賴,用圈表示隨機變數(random variables),用箭頭表示條件依賴(conditional dependencies)。
此外,對於任意的隨機變數,其聯合概率可由各自的局部條件概率分布相乘而得出:
1. head-to-head
依上圖,所以有:P(a,b,c) = P(a) P(b) P(c|a,b)成立,即在c未知的條件下,a、b被阻斷(blocked),是獨立的,稱之為head-to-head條件獨立。
2. tail-to-tail
考慮c未知,跟c已知這兩種情況:
3. head-to-tail
還是分c未知跟c已知這兩種情況:
wikipedia上是這樣定義因子圖的:將一個具有多變數的全局函數因子分解,得到幾個局部函數的乘積,以此為基礎得到的一個雙向圖叫做因子圖(Factor Graph)。
通俗來講,所謂因子圖就是對函數進行因子分解得到的 一種概率圖 。一般內含兩種節點:變數節點和函數節點。我們知道,一個全局函數通過因式分解能夠分解為多個局部函數的乘積,這些局部函數和對應的變數關系就體現在因子圖上。
舉個例子,現在有一個全局函數,其因式分解方程為:
其中fA,fB,fC,fD,fE為各函數,表示變數之間的關系,可以是條件概率也可以是其他關系。其對應的因子圖為:
在概率圖中,求某個變數的邊緣分布是常見的問題。這問題有很多求解方法,其中之一就是把貝葉斯網路或馬爾科夫隨機場轉換成因子圖,然後用sum-proct演算法求解。換言之,基於因子圖可以用 sum-proct 演算法 高效的求各個變數的邊緣分布。
詳細的sum-proct演算法過程,請查看博文: 從貝葉斯方法談到貝葉斯網路
樸素貝葉斯(Naive Bayesian)是經典的機器學習演算法之一,也是為數不多的基於概率論的分類演算法。樸素貝葉斯原理簡單,也很容易實現,多用於文本分類,比如垃圾郵件過濾。**樸素貝葉斯可以看做是貝葉斯網路的特殊情況:即該網路中無邊,各個節點都是獨立的。 **
樸素貝葉斯樸素在哪裡呢? —— 兩個假設 :
貝葉斯公式如下:
下面以一個例子來解釋樸素貝葉斯,給定數據如下:
現在給我們的問題是,如果一對男女朋友,男生想女生求婚,男生的四個特點分別是不帥,性格不好,身高矮,不上進,請你判斷一下女生是嫁還是不嫁?
這是一個典型的分類問題,轉為數學問題就是比較p(嫁|(不帥、性格不好、身高矮、不上進))與p(不嫁|(不帥、性格不好、身高矮、不上進))的概率,誰的概率大,我就能給出嫁或者不嫁的答案!這里我們聯繫到樸素貝葉斯公式:
我們需要求p(嫁|(不帥、性格不好、身高矮、不上進),這是我們不知道的,但是通過樸素貝葉斯公式可以轉化為好求的三個量,這三個變數都能通過統計的方法求得。
等等,為什麼這個成立呢?學過概率論的同學可能有感覺了,這個等式成立的條件需要特徵之間相互獨立吧!對的!這也就是為什麼樸素貝葉斯分類有樸素一詞的來源,樸素貝葉斯演算法是假設各個特徵之間相互獨立,那麼這個等式就成立了!
但是為什麼需要假設特徵之間相互獨立呢?
根據上面倆個原因,樸素貝葉斯法對條件概率分布做了條件獨立性的假設,由於這是一個較強的假設,樸素貝葉斯也由此得名!這一假設使得樸素貝葉斯法變得簡單,但有時會犧牲一定的分類准確率。
樸素貝葉斯優點 :
樸素貝葉斯缺點 :
理論上,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。但是實際上並非總是如此,這是因為樸素貝葉斯模型假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,在屬性個數比較多或者屬性之間相關性較大時,分類效果不好。
樸素貝葉斯模型(Naive Bayesian Model)的 樸素(Naive)的含義是"很簡單很天真" 地假設樣本特徵彼此獨立. 這個假設現實中基本上不存在, 但特徵相關性很小的實際情況還是很多的, 所以這個模型仍然能夠工作得很好。
新聞分類 GitHub: 點擊進入
【 機器學習通俗易懂系列文章 】
從貝葉斯方法談到貝葉斯網路
7. 分類演算法 - 樸素貝葉斯演算法
相信很多同學在高中或者大學的時候都學過貝葉斯原理,即條件原理。
現分別有 A、B 兩個容器,在容器 A 里分別有 7 個紅球和 3 個白球,在容器 B 里有 1 個紅球和 9 個白球,現已知從這兩個容器里任意抽出了一個紅球,問這個球來自容器 A 的概率是多少?
假設已經抽出紅球為事件 B,選中容器 A 為事件 A,則有:P(B) = 8/20,P(A) = 1/2,P(B|A) = 7/10,按照公式,則有:P(A|B) = (7/10)*(1/2) / (8/20) = 0.875
之所以稱為樸素貝葉斯, 是因為它假設每個輸入變數是獨立的。 現實生活中這種情況基本不滿足,但是這項技術對於絕大部分的復雜問題仍然非常有效。
樸素貝葉斯模型由兩種類型的概率組成:
1、每個類別的概率P(Cj);
2、每個屬性的條件概率P(Ai|Cj)。
為了訓練樸素貝葉斯模型,我們需要先給出訓練數據,以及這些數據對應的分類。那麼上面這兩個概率,也就是類別概率和條件概率。他們都可以從給出的訓練數據中計算出來。一旦計算出來,概率模型就可以使用貝葉斯原理對新數據進行預測。
貝葉斯原理、貝葉斯分類和樸素貝葉斯這三者之間是有區別的
貝葉斯原理是最大的概念,它解決了概率論中「逆向概率」的問題,在這個理論基礎上,人們設計出了貝葉斯分類器,樸素貝葉斯分類是貝葉斯分類器中的一種,也是最簡單,最常用的分類器。樸素貝葉斯之所以樸素是因為它假設屬性是相互獨立的,因此對實際情況有所約束, 如果屬性之間存在關聯,分類准確率會降低。
(1) 演算法邏輯簡單,易於實現
(2)分類過程中時空開銷小(假設特徵相互獨立,只會涉及到二維存儲)
(1)理論上,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率。但是實際上並非總是如此,這是因為樸素貝葉斯模型假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,在屬性個數比較多或者屬性之間相關性較大時,分類效果不好。
(2)在屬性相關性較小時,樸素貝葉斯性能最為良好。對於這一點,有半樸素貝葉斯之類的演算法通過考慮部分關聯性適度改進。
庫有3種演算法:GaussianNB、MultinomialNB和BernoulliNB。
這三個類適用的分類場景各不相同,主要根據數據類型來進行模型的選擇。一般來說,如果樣本特徵的分布大部分是連續值,使用GaussianNB會比較好。如果如果樣本特徵的分大部分是多元離散值,使用MultinomialNB比較合適。而如果樣本特徵是二元離散值或者很稀疏的多元離散值,應該使用BernoulliNB。