前言
貝葉斯決策是模式識(shí)別中最基礎(chǔ)的理論,是解決模式分類的一種基本統(tǒng)計(jì)途徑驼卖,是后續(xù)學(xué)習(xí)的基礎(chǔ)
- 本文為筆者學(xué)習(xí)過(guò)程的原創(chuàng)筆記丸冕,轉(zhuǎn)載請(qǐng)附本文鏈接及作者信息。
- 后附連續(xù)型數(shù)據(jù)的貝葉斯分類器python實(shí)現(xiàn)
- 有問(wèn)題歡迎在交流區(qū)探討學(xué)習(xí)除盏,QQ:761322725
- 碼字不易叉橱,好心人隨手點(diǎn)個(gè)贊??
總括:
貝葉斯決策論是解決模式分類問(wèn)題的一種基本統(tǒng)計(jì)途徑 。
出發(fā)點(diǎn)是利用概率決策與相應(yīng)代價(jià)之間的折中 者蠕。
(概率學(xué)派與頻率學(xué)派)
它做了如下假設(shè) - 決策問(wèn)題可以用概率形式來(lái)描述
- 所有有關(guān)的概率結(jié)構(gòu)均已知
原理講解
所用教材為機(jī)械工業(yè)出版社所譯《模式識(shí)別》窃祝,使用了魚分揀的例子,即二分類問(wèn)題
問(wèn)題的抽象描述如下
模式
通用的系統(tǒng)框架如下圖所示踱侣,實(shí)現(xiàn)從現(xiàn)實(shí)世界到符號(hào)世界的轉(zhuǎn)換粪小,完成最后的分類任務(wù)大磺。
分類系統(tǒng)構(gòu)成
規(guī)范化定義
最小錯(cuò)誤率決策
最小錯(cuò)誤率解釋
對(duì)貝葉斯公式再進(jìn)行分析如下
- 從最小錯(cuò)誤率的要求出發(fā),利用貝葉斯公式就能得出使錯(cuò)誤率最小的分類決策 稱之為
逞壁。
- 可知使 錯(cuò)誤率最小的決策就是
- 具體決策規(guī)則可以表示如下:
決策邊界
至于多類情況流济,同樣可以推廣利用
image.png
最小風(fēng)險(xiǎn)決策
- 很多場(chǎng)合 不同的錯(cuò)誤決策所造成的損失不同(癌癥誤判 、 魚分揀)
- 需要引入更一般的損失函數(shù)來(lái)替代錯(cuò)誤率
- 計(jì)算各種不同誤判的風(fēng)險(xiǎn) 采取總風(fēng)險(xiǎn)最小的決策 腌闯。
-
最小風(fēng)險(xiǎn)貝葉斯決策绳瘟,允許更多行動(dòng) ( 而不僅僅是類別判定,當(dāng)決策風(fēng)險(xiǎn)大于不決策時(shí) 可以拒絕做決策 (引申:三支決策)
image.png
分類器姿骏、判別函數(shù)與決策面
將分類模型表示進(jìn)一步形式化糖声,利用判別函數(shù)進(jìn)行表示定義如下:
正態(tài)分布下的貝葉斯決策
我們討論一個(gè)很常見(jiàn)的情況,在數(shù)據(jù)呈現(xiàn)正態(tài)分布下的貝葉斯決策如何計(jì)算分瘦。正態(tài)分布的相關(guān)知識(shí)點(diǎn)回顧如下:
則最小錯(cuò)誤率貝葉斯判別函數(shù)如下:
小結(jié)
以上即為貝葉斯決策的基本原理谴咸,原理簡(jiǎn)單易懂球恤,掌握住兩種不同思路的決策方法即可
代碼實(shí)現(xiàn)
數(shù)據(jù)說(shuō)明
使用鶯尾花標(biāo)準(zhǔn)數(shù)據(jù)(常用來(lái)坐分類實(shí)驗(yàn)demo),Iris_data網(wǎng)上都能下載到癌别,數(shù)據(jù)規(guī)格:
- 多分類問(wèn)題 150*5大小
- 各屬性值屬于連續(xù)型數(shù)據(jù)
- 數(shù)據(jù)分布為正態(tài)分布
具體算法實(shí)現(xiàn)流程
image.png
完整代碼
使用python編程實(shí)現(xiàn)响迂,面向?qū)ο缶幊痰木帉懛绞剑梢杂?xùn)練和預(yù)測(cè)渗勘;
模型參數(shù)存儲(chǔ)功能當(dāng)時(shí)比較急沒(méi)有實(shí)現(xiàn)沐绒。
"""
Author:Arthur_Pang
Time: 2019/09/28
Description: [貝葉斯分類算法實(shí)現(xiàn)]
"""
import pandas as pd
import numpy as np
import logging
import math
import json
from sklearn.model_selection import train_test_split
logging.basicConfig(format='%(asctime)s - %(levelname)s: %(message)s',
level=logging.DEBUG)
"""
class:貝葉斯分類器
功能:- 讀取加載數(shù)據(jù)
- 數(shù)據(jù)劃分
- 模型訓(xùn)練
- 模型預(yù)測(cè)
- 模型參數(shù)保存
"""
class Bayes_classfier:
def __init__(self,path):
# 模型數(shù)據(jù)集路徑
self.data_path=path
#模型參數(shù)記錄
self.params=dict()
'''
func:數(shù)據(jù)集讀取與訓(xùn)練測(cè)試集劃分
return:None
'''
def data_processing(self):
self.df=pd.read_csv(self.data_path,header=None)
logging.info('loading datasets,volume:{}'.format(self.df.shape))
#數(shù)據(jù)列名稱指定
self.df.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']
#特征與標(biāo)簽提取
#features=self.df[[x for x in self.df.columns if x not in ['species']]]
features=self.df
label=self.df['species']
# 訓(xùn)練集與測(cè)試集切分
self.X_train, self.X_valid, self.y_train, self.y_valid=train_test_split(features, label, test_size=0.25, random_state=300,stratify=label)
logging.info('split datasets旺坠,train_datasets:{},test_datasets:{}'.format(self.X_train.shape, self.X_valid.shape))
pass
'''
func: 模型訓(xùn)練過(guò)程乔遮,即計(jì)算貝葉斯各個(gè)參數(shù)
return :None
'''
def fit(self):
# 計(jì)算先驗(yàn)概率:
priori_prob=(self.y_train.value_counts()+1)/(self.y_train.shape[0]+3)
logging.info('計(jì)算訓(xùn)練集先驗(yàn)概率...')
#print(priori_prob)
# 記錄各模型參數(shù)的值用于預(yù)測(cè)
self.params['priori_prob']=priori_prob
# 計(jì)算各類均值mu,協(xié)方差矩陣的逆,協(xié)方差矩陣的行列式
mu_=dict()
sigma_inv=dict()
det_=dict()
logging.info('計(jì)算mu,sigma等矩陣運(yùn)算...')
for _label,groups in self.X_train.groupby(['species']):
groups=groups[[x for x in self.df.columns if x not in ['species']]]
#print(_label,groups.mean(axis=0))
mu_[_label]=groups.mean(axis=0)
sigma_=np.cov(groups.T, bias=True)
sigma_inv[_label]=np.linalg.inv(sigma_)
det_[_label]=np.linalg.det(sigma_)
self.params['class_mu']=mu_
self.params['class_sigma_inv']=sigma_inv
self.params['class_det']=det_
'''
func: 分類判別函數(shù),即利用代碼實(shí)現(xiàn)上述判別函數(shù)
return: 判別值
注: @ 為numpy矩陣乘法運(yùn)算
'''
def g(self,x, mu, sigma_inv, det, priori_prob):
#print(mu,sigma_inv)
return -0.5 * (x - mu).T @ sigma_inv @ (x - mu) - 0.5 * math.log(det) + math.log(priori_prob)
'''
func: 構(gòu)建判別函數(shù)用于預(yù)測(cè),對(duì)測(cè)試集中各類別進(jìn)行測(cè)試
return None
'''
def predict(self):
# 對(duì)各類進(jìn)行測(cè)試
for _label,test_group in self.X_valid.groupby(['species']):
logging.info('test the {},volume:{}'.format(_label,test_group.shape[0]))
test_feature=test_group[[x for x in self.df.columns if x not in ['species']]]
##
print(_label)
# 記錄測(cè)試結(jié)果是否正確
test_res=[]
for _,row in test_feature.iterrows():
#print(self.params['priori_prob'][_label])
score=dict()
# 計(jì)算各類別的得分情況
for _l in self.df['species'].unique():
score[_l]=self.g(np.array(row.values),
self.params['class_mu'][_l].values,
self.params['class_sigma_inv'][_l],
self.params['class_det'][_l],
self.params['priori_prob'][_l])
#print(score)
predict_res=max(score, key=score.get)
print('[測(cè)試]當(dāng)前預(yù)測(cè)類別:{}取刃,實(shí)際類別:{},{}'.format(predict_res,_label,predict_res==_label))
test_res.append(predict_res==_label)
print('{}類別測(cè)試準(zhǔn)確率:{}'.format(_label,test_res.count(True)/len(test_res)))
classfier=Bayes_classfier('./data/iris.data')
classfier.data_processing()
classfier.fit()
classfier.predict()
代碼輸出結(jié)果如下:
2019-09-28 16:04:26,719 - INFO: loading datasets蹋肮,volume:(150, 5)
2019-09-28 16:04:26,731 - INFO: split datasets,train_datasets:(112, 5),test_datasets:(38, 5)
2019-09-28 16:04:26,734 - INFO: 計(jì)算訓(xùn)練集先驗(yàn)概率...
2019-09-28 16:04:26,736 - INFO: 計(jì)算mu,sigma等矩陣運(yùn)算...
2019-09-28 16:04:26,748 - INFO: test the Iris-setosa,volume:12
2019-09-28 16:04:26,766 - INFO: test the Iris-versicolor,volume:13
2019-09-28 16:04:26,784 - INFO: test the Iris-virginica,volume:13
Iris-setosa
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-setosa璧疗,實(shí)際類別:Iris-setosa,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-setosa坯辩,實(shí)際類別:Iris-setosa,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-setosa,實(shí)際類別:Iris-setosa,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-setosa崩侠,實(shí)際類別:Iris-setosa,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-setosa漆魔,實(shí)際類別:Iris-setosa,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-setosa,實(shí)際類別:Iris-setosa,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-setosa,實(shí)際類別:Iris-setosa,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-setosa改抡,實(shí)際類別:Iris-setosa,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-setosa矢炼,實(shí)際類別:Iris-setosa,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-setosa,實(shí)際類別:Iris-setosa,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-setosa阿纤,實(shí)際類別:Iris-setosa,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-setosa句灌,實(shí)際類別:Iris-setosa,True
Iris-setosa類別測(cè)試準(zhǔn)確率:1.0
Iris-versicolor
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-versicolor,實(shí)際類別:Iris-versicolor,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-versicolor欠拾,實(shí)際類別:Iris-versicolor,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-versicolor胰锌,實(shí)際類別:Iris-versicolor,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-versicolor,實(shí)際類別:Iris-versicolor,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-virginica清蚀,實(shí)際類別:Iris-versicolor,False
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-versicolor匕荸,實(shí)際類別:Iris-versicolor,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-versicolor,實(shí)際類別:Iris-versicolor,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-versicolor枷邪,實(shí)際類別:Iris-versicolor,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-versicolor,實(shí)際類別:Iris-versicolor,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-versicolor诺凡,實(shí)際類別:Iris-versicolor,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-versicolor东揣,實(shí)際類別:Iris-versicolor,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-versicolor,實(shí)際類別:Iris-versicolor,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-versicolor腹泌,實(shí)際類別:Iris-versicolor,True
Iris-versicolor類別測(cè)試準(zhǔn)確率:0.9230769230769231
Iris-virginica
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-virginica嘶卧,實(shí)際類別:Iris-virginica,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-virginica,實(shí)際類別:Iris-virginica,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-virginica凉袱,實(shí)際類別:Iris-virginica,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-virginica芥吟,實(shí)際類別:Iris-virginica,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-virginica,實(shí)際類別:Iris-virginica,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-virginica专甩,實(shí)際類別:Iris-virginica,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-virginica钟鸵,實(shí)際類別:Iris-virginica,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-virginica,實(shí)際類別:Iris-virginica,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-virginica涤躲,實(shí)際類別:Iris-virginica,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-virginica棺耍,實(shí)際類別:Iris-virginica,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-virginica,實(shí)際類別:Iris-virginica,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-virginica种樱,實(shí)際類別:Iris-virginica,True
[測(cè)試]當(dāng)前預(yù)測(cè)類別:Iris-virginica蒙袍,實(shí)際類別:Iris-virginica,True
Iris-virginica類別測(cè)試準(zhǔn)確率:1.0
- 本文為筆者學(xué)習(xí)過(guò)程的原創(chuàng)筆記,轉(zhuǎn)載請(qǐng)附本文鏈接及作者信息嫩挤。
- 有問(wèn)題歡迎在交流區(qū)探討學(xué)習(xí)害幅,QQ:761322725
- 碼字不易,好心人隨手點(diǎn)個(gè)贊??