模式識(shí)別課程(一):貝葉斯決策及python實(shí)現(xiàn) 鶯尾花分類

前言

貝葉斯決策是模式識(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ī)范化定義
后驗(yàn)概率是后續(xù)的關(guān)鍵,理解為當(dāng)下數(shù)據(jù)為的條件下探膊,標(biāo)簽為的概率杠愧。

最小錯(cuò)誤率決策


最小錯(cuò)誤率解釋

對(duì)貝葉斯公式再進(jìn)行分析如下

  • 從最小錯(cuò)誤率的要求出發(fā),利用貝葉斯公式就能得出使錯(cuò)誤率最小的分類決策 稱之為\color{red}{最小錯(cuò)誤率貝葉斯決策} 逞壁。
  • 可知使 錯(cuò)誤率最小的決策就是 \color{red}{使后驗(yàn)概率最大的決策}
  • 具體決策規(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
    相應(yīng)決策過(guò)程如下:

分類器姿骏、判別函數(shù)與決策面

將分類模型表示進(jìn)一步形式化糖声,利用判別函數(shù)進(jìn)行表示定義如下:

貝葉斯分類器的判別函數(shù)如下

正態(tài)分布下的貝葉斯決策

我們討論一個(gè)很常見(jiàn)的情況,在數(shù)據(jù)呈現(xiàn)正態(tài)分布下的貝葉斯決策如何計(jì)算分瘦。正態(tài)分布的相關(guān)知識(shí)點(diǎn)回顧如下:


則最小錯(cuò)誤率貝葉斯判別函數(shù)如下:
上式是實(shí)際計(jì)算的關(guān)鍵蘸泻,當(dāng)取特殊值時(shí),上式有不同的簡(jiǎn)化形式嘲玫,在此不予討論

小結(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è)贊??
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載岂昭,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者以现。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子叼风,更是在濱河造成了極大的恐慌取董,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件无宿,死亡現(xiàn)場(chǎng)離奇詭異茵汰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)孽鸡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門蹂午,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人彬碱,你說(shuō)我怎么就攤上這事豆胸。” “怎么了巷疼?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵晚胡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我嚼沿,道長(zhǎng)估盘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任骡尽,我火速辦了婚禮遣妥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘攀细。我一直安慰自己箫踩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布谭贪。 她就那樣靜靜地躺著境钟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪故河。 梳的紋絲不亂的頭發(fā)上吱韭,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音鱼的,去河邊找鬼理盆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凑阶,可吹牛的內(nèi)容都是我干的猿规。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼宙橱,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姨俩!你這毒婦竟也來(lái)了蘸拔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤环葵,失蹤者是張志新(化名)和其女友劉穎调窍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體张遭,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邓萨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了菊卷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缔恳。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖洁闰,靈堂內(nèi)的尸體忽然破棺而出歉甚,到底是詐尸還是另有隱情,我是刑警寧澤扑眉,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布纸泄,位于F島的核電站,受9級(jí)特大地震影響襟雷,放射性物質(zhì)發(fā)生泄漏刃滓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一耸弄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卓缰,春花似錦计呈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至总寒,卻和暖如春扶歪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摄闸。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工善镰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人年枕。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓炫欺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親熏兄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子品洛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容