先驗概率與后驗概率
先驗概率:對于某一個概率事件,我們都會有基于自己已有的知識,對于這個概率事件會分別以什么概率出現(xiàn)各種結(jié)果會有一個預(yù)先的估計,而這個估計并未考慮到任何相關(guān)因素。
對于分類數(shù)據(jù)來說,先驗概率就是取某一類的概率。
(基于自己已有的知識->已有的數(shù)據(jù))
(預(yù)先的估計->統(tǒng)計概率)
假如你考試沒及格,老師要求大家拿卷子回家給爸媽簽字,假如你考試沒及格過10次,你每次都用小本記下來后果:
- 被胖揍一頓:7次
- 被簡單地數(shù)落一下:2次
- 被溫情地鼓勵:1次
那么先驗概率:
- 被胖揍一頓:70%
- 被簡單地數(shù)落一下:20%
- 被溫情地鼓勵:10%
后驗概率:在先驗概率的基礎(chǔ)上加了一層“考慮”:結(jié)合我們已有的知識,將與待檢驗事件(即我們正在估計概率的隨機事件)相關(guān)的因素也考慮進去后,我們對隨機事件的概率的預(yù)估。
我的理解是,通過結(jié)果估計條件。就西瓜數(shù)據(jù)集來說,結(jié)果是好瓜還是壞瓜,條件是色澤,敲聲等等的屬性,所以后驗概率就是,我們已經(jīng)知道這個西瓜是好瓜了,在他是好瓜的前提下估計他的色澤時青綠的概率,即P(青綠|好瓜),用字符表示就是P(x | c)。
那么,落實到實際的問題當中,我們想獲得的核心結(jié)果其實也就是P(c|x),即在x數(shù)據(jù)集上,是好瓜的概率P(c=好瓜|x)和是壞瓜P(c=壞瓜|x)的概率,通過貝葉斯公式:
即可通過P(x | c)求得P(c?| x),但是,求P(x | c)并不容易,所以引出下面的樸素貝葉斯。
詳細分析后驗概率看這篇博文吧:
樸素貝葉斯分類器(Naive Bayesian Classifier)
重點:樸素貝葉斯
樸素貝葉斯方法是基于貝葉斯定理的一組有監(jiān)督學(xué)習算法
樸素->所有屬性相互獨立,就西瓜數(shù)據(jù)集來說,顏色與敲聲沒有任何關(guān)系。(實際情況下是有聯(lián)系的,但是為了簡化,假設(shè)他們沒關(guān)系)
公式:
文章來源地址http://www.zghlxwxcb.cn/news/detail-457975.html
?公式中的P(x)可以忽略。
因為這個公式最后求出來的是一個數(shù),比如西瓜數(shù)據(jù)集,我們最后求出的是P(c=好瓜 | X)=0.4
P(c=壞瓜 | X)=0.8,然后通過比較這兩個數(shù)的大小來判斷測試集是好瓜還是壞瓜。
P(x)在計算P(c=好瓜 | X)和P(c=壞瓜 | X)都有,而且相同。所以去掉P(x)并不影響
P(c=好瓜 | X)和P(c=壞瓜 | X)之間的大小關(guān)系。
分類準則:
思路:
具體分析還請看:樸素貝葉斯分類器(Naive Bayesian Classifier)
假設(shè)我們有了一個數(shù)據(jù)集D,那么p( c )的獲得其實也較為簡單:計算D中c的各個情況出現(xiàn)的頻率即可。(這里用到了大數(shù)定律:當訓(xùn)練集包含充足的獨立同分布樣本時,P( c )可通過各類樣本出現(xiàn)的頻率來進行估計。)
樸素貝葉斯+拉普拉斯修正實現(xiàn)代碼:
"""
利用打網(wǎng)球數(shù)據(jù)集PlayTenis構(gòu)建決策樹,該數(shù)據(jù)集的特性如下:
屬性包括天氣(outlook)、溫度(temperature)、濕度(humidity)、是否有風(windy),樣本個數(shù)為14。
標簽為今天是否去打網(wǎng)球(play)。
具體數(shù)據(jù)如下:
NO. Outlook temperature humidity windy play
1 sunny hot high FALSE no
2 sunny hot high TRUE no
3 overcast hot high FALSE yes
4 rainy mild high FALSE yes
5 rainy cool normal FALSE yes
6 rainy cool normal TRUE no
7 overcast cool normal TRUE yes
8 sunny mild high FALSE no
9 sunny cool normal FALSE yes
10 rainy mild normal FALSE yes
"""
# 讀入數(shù)據(jù)函數(shù) 返回正例,反例,總例,數(shù)據(jù)
def readFile():
f = open('D:\\PythonProject_Class\\test_Data\\PlayTennis.txt', 'r')
lk = 10
preData = [[] for i in range(lk)]
dict_PlusFeatures = {} # 保存屬性的名稱,并為求信息增益做準備,也就是把初值賦值為0
dict_NegativeFeatures = {} # 上一個保存的是正例,這個保存的的是反例
sum_Features = {}
for i in range(0, 4): # 把前幾行的文字描述跳過
s = f.readline()
s = f.readline() # 讀入屬性
# NO. Outlook temperature humidity windy play
# strip函數(shù)是去除這行的開頭和結(jié)尾的換行符和空格的
s = s.strip('\n')
s = s.strip(' ')
x = s.split(' ')
# 初始化字典
for i in range(1, len(x)): # 從1開始是要跳過NO.
if x[i] == 'play':
dict_PlusFeatures[x[i]] = 0
dict_NegativeFeatures[x[i]] = 0
sum_Features[x[i]] = 0
elif x[i] != '':
dict_PlusFeatures[x[i]] = {}
dict_NegativeFeatures[x[i]] = {}
sum_Features[x[i]] = {}
ls = [i for i in dict_PlusFeatures.keys()] # 提取字典中的特征名稱
ls.pop(len(ls) - 1) # 去掉play
# s=set()不能kidls=[s for i in range(len(ls))],這樣列表中的一個集合改變,其他的也會改變
# kidls = [set() for i in range(len(ls))] # 保存每個特征的屬性值,使用沒有重復(fù)元素的集合set
flag = 0 # 用于標記是正例還是反例
index = 0 # 用于指向 保存所有讀入數(shù)據(jù)的predata 的下標
for i in range(lk):
cnt = 0
s = f.readline() # 讀入屬性
s = s.strip('\n')
s = s.strip(' ')
x = s.split(' ')
if x[len(x) - 1] == 'no': # 首先處理是正例還是反例,同時統(tǒng)計正反例個數(shù)
flag = -1
dict_NegativeFeatures['play'] += 1
elif x[len(x) - 1] == 'yes':
flag = 1
dict_PlusFeatures['play'] += 1
sum_Features['play'] += 1
for j in range(2, len(x) - 1): # 跳過編號以及最后的正反例
if x[j] != '':
if flag == 1:
if x[j] not in dict_PlusFeatures[ls[cnt]].keys():
dict_PlusFeatures[ls[cnt]][x[j]] = 1
else:
dict_PlusFeatures[ls[cnt]][x[j]] += 1
elif flag == -1:
if x[j] not in dict_NegativeFeatures[ls[cnt]].keys():
dict_NegativeFeatures[ls[cnt]][x[j]] = 1
else:
dict_NegativeFeatures[ls[cnt]][x[j]] += 1
if x[j] not in sum_Features[ls[cnt]].keys():
sum_Features[ls[cnt]][x[j]] = 1
else:
sum_Features[ls[cnt]][x[j]] += 1
# kidls[cnt].add(x[j])
preData[index].append(x[j])
cnt += 1
preData[index].append(x[len(x) - 1])
index += 1
for i in dict_PlusFeatures.keys():
if i != 'play':
for j in dict_PlusFeatures[i].keys():
if j not in dict_NegativeFeatures[i].keys():
dict_NegativeFeatures[i][j] = 0
for i in dict_NegativeFeatures.keys():
if i != 'play':
for j in dict_NegativeFeatures[i].keys():
if j not in dict_PlusFeatures[i].keys():
dict_PlusFeatures[i][j] = 0
preData.insert(0, ls) # 在split中發(fā)現(xiàn)需要表頭
preData[0].append('play')
return dict_PlusFeatures, dict_NegativeFeatures, sum_Features, preData
def method(dict_PlusFeatures, dict_NegativeFeatures, sum_Features, preData):
dict_PlusFeatures['play'] = dict_PlusFeatures['play'] / sum_Features['play']
dict_NegativeFeatures['play'] = dict_NegativeFeatures['play'] / sum_Features['play']
for i in dict_PlusFeatures:
if i != 'play':
for j in dict_PlusFeatures[i]:
dict_PlusFeatures[i][j] = (dict_PlusFeatures[i][j] + 1) / (
dict_PlusFeatures['play'] + len(dict_PlusFeatures[i]))
for i in dict_NegativeFeatures:
if i != 'play':
for j in dict_NegativeFeatures[i]:
dict_NegativeFeatures[i][j] = (dict_NegativeFeatures[i][j] + 1) / (
dict_NegativeFeatures['play'] + len(dict_NegativeFeatures[i]))
for i in range(1, len(preData)):
ls = [dict_PlusFeatures['play'], dict_NegativeFeatures['play']]
for j in range(len(preData[0]) - 1):
ls[0] *= dict_PlusFeatures[preData[0][j]][preData[i][j]]
ls[1] *= dict_NegativeFeatures[preData[0][j]][preData[i][j]]
key = ls.index(max(ls))
if key == 0 and preData[i][-1] == 'yes':
print("數(shù)據(jù){}預(yù)測正確".format(i))
elif key == 1 and preData[i][-1] == 'no':
print("數(shù)據(jù){}預(yù)測正確".format(i))
else:
print("數(shù)據(jù){}預(yù)測錯誤".format(i))
if __name__ == '__main__':
dict_PlusFeatures, dict_NegativeFeatures, sum_Features, preData = readFile()
method(dict_PlusFeatures, dict_NegativeFeatures, sum_Features, preData)
1.什么是樸素貝葉斯分類器?
1.不同于其它分類器,樸素貝葉斯是一種基于概率理論的分類算法;
2.特征之間的條件獨立性假設(shè),顯然這種假設(shè)顯得“粗魯”而不符合實際,這也是名稱中“樸素”的由來。然而事實證明,樸素貝葉斯在有些領(lǐng)域很有用,比如垃圾郵件過濾;
3.總體上來說,樸素貝葉斯原理和實現(xiàn)都比較簡單,學(xué)習和預(yù)測的效率都很高,是一種經(jīng)典而常用的分類算法。文章來源:http://www.zghlxwxcb.cn/news/detail-457975.html
2.樸素貝葉斯的分類準則?
到了這里,關(guān)于機器學(xué)習期末復(fù)習 貝葉斯分類器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!