貝葉斯原理
貝葉斯為了解決一個叫“逆向概率”問題寫了一篇文章逃贝,嘗試解答在沒有太多可靠證據(jù)的情況下,怎樣做出更符合數(shù)學邏輯的推測
“逆向概率”是相對“正向概率”而言
正向概率抚芦,比較容易理解荞膘,比如我們已經(jīng)知道袋子里面有N 個球,不是黑球就是白球壤靶,其中M個是黑球,那么把手伸進去摸一個球惊搏,就能知道摸出黑球的概率是多少 => 這種情況往往是上帝視角贮乳,即了解了事情的全貌再做判斷
逆向概率,貝葉斯則從實際場景出發(fā)恬惯,提了一個問題:如果我們事先不知道袋子里面黑球和白球的比例向拆,而是通過我們摸出來的球的顏色,能判斷出袋子里面黑白球的比例么酪耳?
貝葉斯原理:
影響了接下來近200年的統(tǒng)計學理論
建立在主觀判斷的基礎(chǔ)上:在我們不了解所有客觀事實的情況下浓恳,同樣可以先估計一個值
先驗概率,通過經(jīng)驗來判斷事情發(fā)生的概率
后驗概率碗暗,就是發(fā)生結(jié)果之后颈将,推測原因的概率
條件概率,事件A 在另外一個事件B已經(jīng)發(fā)生條件下的發(fā)生概率言疗,表示為P(A|B)
似然函數(shù)晴圾,把概率模型的訓練過程理解為求參數(shù)估計的過程
比如,一個硬幣在10次拋落中正面均朝上 => 那么這個硬幣是均勻的可能性是多少噪奄?這里硬幣均勻就是個參數(shù)死姚,似然函數(shù)就是用來衡量這個模型的參數(shù)
經(jīng)過推導,貝葉斯推理告訴我們后驗概率是與先驗概率和似然函數(shù)成正比得勤篮,即
Thinking:假設(shè)有一種病叫做“貝葉死”都毒,它的發(fā)病率是萬分之一,即10000 人中會有1個人得病⌒鸾鳎現(xiàn)有一種測試可以檢驗一個人是否得病的準確率是99.9%温鸽,誤報率(假陽)是0.1%
那么,如果一個人被查出來患有“葉貝死”,實際上患有的可能性有多大涤垫?
查出患有“貝葉死”的準確率是99.9%姑尺,是不是實際上患“貝葉死”的概率也是99.9%?)
在10000個人中蝠猬,還存在0.1%的誤查的情況切蟋,也就是10個人沒有患病但是被診斷成陽性。當然10000個人中榆芦,也確實存在一個患有貝葉死的人柄粹,他有99.9%的概率被檢查出來
可以粗算下,患病的這個人實際上是這11個人里面的一員匆绣,即實際患病比例是1/11≈9%
貝葉斯原理就是求解后驗概率驻右,假設(shè):A 表示事件 “測出為陽性”, B1 表示“患有貝葉死”, B2 表示“沒有患貝葉死”
患有貝葉死的情況下,測出為陽性的概率為P(A|B1)=99.9%
沒有患貝葉死崎淳,但測出為陽性的概率為P(A|B2)=0.1%
患有貝葉死的概率為?P(B1)=0.01%
沒有患貝葉死的概率P(B2)=99.99%
那么我們檢測出來為陽性堪夭,而且是貝葉死的概率P(B1,A)=P(B1)*P(A|B1)=0.01%*99.9%=0.00999% ≈0.01%
P(B1,A)代表的是聯(lián)合概率拣凹,同樣我們可以求得P(B2,A)=P(B2)*P(A|B2)=99.99%*0.1%=0.09999% ≈0.1%
檢查為陽性的情況下森爽,患有貝葉死的概率,即P(B1|A)
檢查出是陽性的條件下嚣镜,但沒有患有貝葉死的概率為
0.01%+0.1%均出現(xiàn)在了P(B1|A)和P(B2|A)的計算中作為分母爬迟,稱之為論據(jù)因子,也相當于一個權(quán)值因子
我們可以總結(jié)出貝葉斯公式
從而我們可以得到通用的貝葉斯公式
樸素貝葉斯:
一種簡單但極為強大的預測建模算法
假設(shè)每個輸入變量是獨立的菊匿。這是一個強硬的假設(shè)付呕,實際情況并不一定,但是這項技術(shù)對于絕大部分的復雜問題仍然非常有效
樸素貝葉斯模型由兩種類型的概率組成:
每個類別的概率P(Cj)
每個屬性的條件概率P(Ai|Cj)
什么是類別概率:
假設(shè)我有7個棋子捧请,其中3個是白色的凡涩,4個是黑色的
那么棋子是白色的概率就是3/7棒搜,黑色的概率就是4/7 => 這個是類別概率
什么是條件概率:
假設(shè)我把這7個棋子放到了兩個盒子里疹蛉,其中盒子A里面有2個白棋,2個黑棋力麸;盒子B里面有1個白棋可款,2個黑棋
那么在盒子A中抓到白棋的概率就是1/2,抓到黑棋的概率也是1/2克蚂,這個就是條件概率闺鲸,也就是在某個條件(比如在盒子A中)下的概率
訓練樸素貝葉斯模型的過程:
在樸素貝葉斯中,我們要統(tǒng)計的是屬性的條件概率埃叭,也就是假設(shè)取出來的是白色的棋子摸恍,那么它屬于盒子A的概率是2/3
Step1:先給出訓練數(shù)據(jù),以及這些數(shù)據(jù)對應的分類
Step2,計算類別概率和條件概率
Step3立镶,使用概率模型(基于貝葉斯原理)對新數(shù)據(jù)進行預測
樸素貝葉斯分類(離散值):
如何根據(jù)身高壁袄,體重,鞋碼媚媒,判斷是否為男女嗜逻,比如一個新的數(shù)據(jù):身高“高”、體重“中”缭召,鞋碼“中” => 男 or 女栈顷?
求在A1、A2嵌巷、A3屬性下萄凤,Cj的概率
因為一共有2個類別,所以我們只需要求得P(C1|A1A2A3)和P(C2|A1A2A3)的概率即可搪哪,然后比較下哪個分類的可能性大蛙卤,就是哪個分類結(jié)果
分別求下這些條件下的概率:
P(A1|C1)=1/2, P(A2|C1)=1/2, P(A3|C1)=1/4
P(A1|C2)=0, P(A2|C2)=1/2, P(A3|C2)=1/2
所以P(A1A2A3|C1)=1/16, P(A1A2A3|C2)=0
因為P(A1A2A3|C1)P(C1)>P(A1A2A3|C2)P(C2),所以應該是C1類別噩死,即男性
樸素貝葉斯分類(連續(xù)值):
身高180颤难、體重120,鞋碼41已维,請問該人是男是女呢
可以假設(shè)男性和女性的身高行嗤、體重、鞋碼都是正態(tài)分布垛耳,通過樣本計算出均值和方差栅屏,也就是得到正態(tài)分布的密度函數(shù)。有了密度函數(shù)堂鲜,就可以把值代入栈雳,算出某一點的值
比如,男性的身高是均值179.5缔莲、標準差為3.697的正態(tài)分布哥纫。所以男性的身高為180的概率為0.1069
同理可以計算得出男性體重為120的概率為0.000382324,男性鞋碼為41號的概率為0.120304111
P(A1A2A3|C1)=P(A1|C1)P(A2|C1)P(A3|C1)=0.1069*0.000382324*0.120304111=4.9169e-6
P(A1A2A3|C2)=P(A1|C2)P(A2|C2)P(A3|C2)=0.00000147489*0.015354144*0.120306074=2.7244e-9
很明顯這組數(shù)據(jù)分類為男的概率大于分類為女的概率
求標準差和方差的方法
Excel中的NORMDIST函數(shù):
NORMDIST(x,mean,standard_dev,cumulative)
x:正態(tài)分布中痴奏,需要計算的數(shù)值蛀骇;
Mean:正態(tài)分布的平均值;
Standard_dev:正態(tài)分布的標準差读拆;
Cumulative:取值為邏輯值擅憔,即False或True,決定了函數(shù)的形式當為True時檐晕,函數(shù)結(jié)果為累積分布
當為False時暑诸,函數(shù)結(jié)果為概率密度
NORMDIST(180,179.5,3.697,0)=0.1069
Python中的概率密度:
stats.norm.pdf(x, mu, sigma)
返回參數(shù)為 和?
? 的正態(tài)分布密度函數(shù)在x處的值
from scipy import stats
mu = 179.5
sigma = 3.697
x = 180
prob = stats.norm.pdf(x, mu, sigma)
print(prob)
樸素貝葉斯分類:
常用于文本分類,文本過濾、情感預測个榕、推薦系統(tǒng)等啦逆,尤其是對于英文等語言來說,分類效果很好
準備階段笛洛,需要確定特征屬性夏志,屬性值以及l(fā)abel => 訓練集
訓練階段,輸入是特征屬性和訓練樣本苛让,輸出是分類器沟蔑,主要工作是計算每個類別在訓練樣本中的出現(xiàn)頻率及每個特征屬性劃分對每個類別的條件概率
應用階段,使用分類器對新數(shù)據(jù)進行分類
三種分布方式
sklearn工具使用:
from sklearn.naive_bayes import GaussianNB
高斯樸素貝葉斯:特征變量是連續(xù)變量狱杰,符合高斯分布(正太分布)瘦材,比如說人的身高,物體的長度
GaussianNB(priors=None) #模型創(chuàng)建
priors仿畸,先驗概率大小食棕,如果沒有給定,模型則根據(jù)樣本數(shù)據(jù)自己計算(利用極大似然法)
查看模型對象的屬性:
class_prior_:每個樣本的概率
class_count_:每個類別的樣本數(shù)量
theta_:每個類別中每個特征的均值
sigma_:每個類別中每個特征的方差
from sklearn.naive_bayes import MultinomialNB
多項式樸素貝葉斯:特征變量是離散變量错沽,符合多項分布簿晓,在文檔分類中特征變量體現(xiàn)在一個單詞出現(xiàn)的次數(shù),或者是單詞的TF-IDF值等
MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
alpha:先驗平滑因子憔儿,默認等于1谒臼,當?shù)扔?時表示拉普拉斯平滑
fit_prior:是否去學習類的先驗概率蜈缤,默認是True
class_prior:各個類別的先驗概率底哥,如果沒有指定奶陈,則模型會根據(jù)數(shù)據(jù)自動學習吃粒, 每個類別的先驗概率相同,即類別數(shù)N分之一
模型對象的屬性:
class_count_: 訓練樣本中各類別對應的樣本數(shù)
feature_count_: 每個類別中各個特征出現(xiàn)的次數(shù)
from sklearn.naive_bayes import BernoulliNB
伯努利樸素貝葉斯:特征變量是布爾變量,符合0/1分布,在文檔分類中特征是單詞是否出現(xiàn)
BernoulliNB(alpha=1.0, fit_prior=True, class_prior=None)
alpha:平滑因子冀自,與多項式中的alpha一致
fit_prior:是否去學習類的先驗概率,默認是True
class_prior:各個類別的先驗概率,如果沒有指定含末,則模型會根據(jù)數(shù)據(jù)自動學習, 每個類別的先驗概率相同,即類別數(shù)N分之一
模型對象的屬性:
class_count_: 訓練樣本中各類別對應的樣本數(shù)
feature_count_: 每個類別中各個特征出現(xiàn)的次數(shù)
代碼
# MNIST手寫數(shù)字分類(多種分類方法)
# 分割數(shù)據(jù)务豺,將25%的數(shù)據(jù)作為測試集,其余作為訓練集
train_x, test_x, train_y, test_y = train_test_split(data, digits.target, test_size=0.25, random_state=33)
# 創(chuàng)建LR分類器
model = LogisticRegression()
model.fit(train_x, train_y)
predict_y=model.predict(test_x)
print('LR準確率: %0.4lf' % accuracy_score(predict_y, test_y))
# 創(chuàng)建GaussianNB分類器
model = GaussianNB()
model.fit(train_x, train_y)
predict_y=model.predict(test_x)
print('GaussianNB準確率: %0.4lf' % accuracy_score(predict_y, test_y))
# 創(chuàng)建MultinomialNB分類器
model = MultinomialNB()
model.fit(train_x, train_y)
predict_y=model.predict(test_x)
print('MultinomialNB準確率: %0.4lf' % accuracy_score(predict_y, test_y))
# 創(chuàng)建BernoulliNB分類器
model = BernoulliNB()
model.fit(train_x, train_y)
predict_y=model.predict(test_x)
print('BernoulliNB準確率: %0.4lf' % accuracy_score(predict_y, test_y))
根據(jù)訓練的結(jié)果選擇最接近的方案