1.算法思想——基於概率的預測
貝葉斯決策論是概率框架下實施決策的基本方法。對分類任務來說,在所有相關概率都已知的情況下,貝葉斯決策論考慮如何基於這些概率和誤判損失來選擇最優的標記類別。
2. 理論基礎
2.1 貝葉斯定理
這個定理解決了現實生活中經常遇到的問題:已知某條件概率,如何得到兩個時間交換后的概率,也就是已知P(B∣A) 的情況下如何求得P(B∣A)
條件概率P(B∣A):事件B已經發生的情況下,事件A發生的概率。
基本求解公式為:P(A∣B) =
貝葉斯定理之所以有用,是因為在我們生活中經常遇到這種情況:我們很容易得到P(A∣B) P(A|B)P(A∣B),P(B∣A) P(B|A)P(B∣A)則很難直接得出,但我們更關心P(B∣A) ,貝葉斯定理則為我們打通從P(A∣B)獲得P(B∣A)的道路。
貝葉斯定理: P(B∣A) =
先驗概率:是指根據以往經驗和分析得到的概率.
后驗概率:事情已經發生,要求這件事情發生的原因是由某個因素引起的可能性的大小
實現代碼:
import math
import random
cla_all_num = 0
cla_num = {}
cla_tag_num = {}
landa = 0.6# 拉普拉斯修正值
def train(taglist, cla): # 訓練,每次插入一條數據
# 插入分類
global cla_all_num
cla_all_num += 1
if cla in cla_num: # 是否已存在該分類
cla_num[cla] += 1
else:
cla_num[cla] = 1
if cla not in cla_tag_num:
cla_tag_num[cla] = {} # 創建每個分類的標簽字典
# 插入標簽
tmp_tags = cla_tag_num[cla] # 淺拷貝,用作別名
for tag in taglist:
if tag in tmp_tags:
tmp_tags[tag] += 1
else:
tmp_tags[tag] = 1
def P_C(cla): # 計算分類 cla 的先驗概率
return cla_num[cla] / cla_all_num
def P_W_C( tag, cla): # 計算分類 cla 中標簽 tag 的后驗概率
tmp_tags = cla_tag_num[cla] # 淺拷貝,用作別名
if tag not in cla_tag_num[cla]:
return landa / (cla_num[cla] + len(tmp_tags) * landa) # 拉普拉斯修正
return (tmp_tags[tag] + landa) / (cla_num[cla] + len(tmp_tags) * landa)
def test( test_tags): # 測試
res = '' #結果
res_P = None
for cla in cla_num.keys():
log_P_W_C = 0
for tag in test_tags:
log_P_W_C += math.log(P_W_C(tag, cla),2)
tmp_P = log_P_W_C + math.log(P_C(cla),2) # P(w|Ci) * P(Ci)
if res_P is None:
res = cla
res_P = tmp_P
if tmp_P > res_P:
res = cla
res_P = tmp_P
return res,res_P
def create_MarriageData():
p0=['青綠','烏黑','淺白']
p1=['蜷縮','稍蜷','硬挺']
p2=['濁響','沉悶','清脆']
p3=['清晰','稍糊','模糊']
p4=['凹陷','稍凹','平坦']
p5=['硬滑','軟粘']
dataset = []#創建樣本
dataset.append(random.choice(p0))#每個樣本隨機選擇長相
dataset.append(random.choice(p1))#同理,隨機選擇性格
dataset.append(random.choice(p2))#同理
dataset.append(random.choice(p3))#同理
dataset.append(random.choice(p4))#同理
dataset.append(random.choice(p5))#同理
print("隨機產生西瓜為:",dataset)
return dataset
def beyesi():
# 訓練模型
data=[ ['青綠','蜷縮','濁響','清晰','凹陷','硬滑','是'],
['烏黑','蜷縮','沉悶','清晰','凹陷','硬滑','是'],
['烏黑','蜷縮','濁響','清晰','凹陷','硬滑','是'],
['青綠','蜷縮','沉悶','清晰','凹陷','硬滑','是'],
['淺白','蜷縮','濁響','清晰','凹陷','硬滑','是'],
['青綠','稍蜷','濁響','清晰','稍凹','軟粘','是'],
['烏黑','稍蜷','濁響','稍糊','稍凹','軟粘','是'],
['烏黑','稍蜷','濁響','清晰','稍凹','硬滑','是'],
['烏黑','稍蜷','沉悶','稍糊','稍凹','硬滑','否'],
['青綠','硬挺','清脆','清晰','平坦','軟粘','否'],
['淺白','硬挺','清脆','模糊','平坦','硬滑','否'],
['淺白','蜷縮','濁響','模糊','平坦','軟粘','否'],
['淺白','稍蜷','濁響','稍糊','凹陷','硬滑','否'],
['淺白','稍蜷','沉悶','稍糊','凹陷','硬滑','否'],
['烏黑','稍蜷','沉悶','稍糊','稍凹','軟粘','否'],
['淺白','蜷縮','濁響','模糊','平坦','硬滑','否'],
['青綠','蜷縮','沉悶','稍糊','稍凹','硬滑','否']]
for x in data:
train(x[0:6],x[-1])
# 測試模型
#for x in data:
# print('測試結果:', test(x[0:6]))
if __name__ == '__main__':
beyesi() #創建朴素貝葉斯分類
#單例測試模型
testcs=['青綠','蜷縮','濁響','清晰','凹陷','硬滑']
print("單例測試為:",testcs)
print('測試結果:', test(testcs))
#隨機測試模型
for i in range(1,20):
print('測試結果:', test(create_MarriageData()))
結果: