黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

統(tǒng)計(jì)學(xué)習(xí)方法(四)——樸素貝葉斯法

系統(tǒng) 1954 0

/*先把標(biāo)題給寫了、這樣就能經(jīng)常提醒自己*/

題記:今天下午去上廁所的一會(huì)兒時(shí)間,就把第四章給掃完了,說(shuō)是掃完了主要是因?yàn)闆](méi)有深入去看,對(duì)于某些證明都直接跳過(guò)了,看了一下里面的例子,大概懂個(gè)意思就行了

1.? 樸素貝葉斯法

  設(shè)輸入空間 維向量的集合,輸出空間為類標(biāo)記集合 ,輸入特征向量 ,輸出類標(biāo)記為 的聯(lián)合概率分布,數(shù)據(jù)集

獨(dú)立同分布產(chǎn)生。

  樸素貝葉斯法就是通過(guò)訓(xùn)練集來(lái)學(xué)習(xí)聯(lián)合概率分布 .具體怎么學(xué)習(xí)呢? 主要就是從先驗(yàn)概率分布和條件概率分布入手,倆個(gè)概率相乘即可得聯(lián)合概率。

  為什么稱之為樸素呢,主要是其將條件概率的估計(jì)簡(jiǎn)化了,對(duì)條件概率分布作了條件獨(dú)立性假設(shè),這也是樸素貝葉斯法的基石,具體的假設(shè)如下

?   ? ? ? ? ? ? ? ?

此公式在假設(shè)條件之下可以等價(jià)于

? ? ? ? ? ? ? ? ? ? ??

現(xiàn)在, 對(duì)于給定的輸入向量 ,通過(guò)學(xué)習(xí)到的模型計(jì)算后驗(yàn)概率分布P(Y=Ck|X=x),后驗(yàn)分布中最大的類作為的輸出結(jié)果,根據(jù)貝葉斯定理可知后驗(yàn)概率為

?

?

上面的公式可能有點(diǎn)歧義,分母的Ck應(yīng)該寫成Cj才對(duì),因?yàn)镻(X=x)=E P(Y=Cj)*P(X=x|Y=Cj)

對(duì)于所有 都是相同的,即此可以將輸出結(jié)果簡(jiǎn)化為

? ? ? ? ? ? ? ? ? ? ? ??

至此大概講解了樸素貝葉斯的基本方法步驟了,關(guān)于參數(shù)估計(jì)還有具體實(shí)例下次再寫了。夏天真熱啊!

2.? 參數(shù)估計(jì)

? 2.1 極大似然估計(jì)

上一小節(jié)講了對(duì)于給定的輸入向量 ,其輸出結(jié)果可表示為

? ? ? ? ? ? ? ? ? ? ? ?? ?

對(duì)此可應(yīng)用極大似然估計(jì)法來(lái)估計(jì)相應(yīng)的概率,如先驗(yàn)概率 的極大似然估計(jì)是

? ? ? ? ? ? ? ? ? ? ? ??

設(shè)第個(gè) 特征 可能取值的集合為 ,條件概率 的極大似然估計(jì)是

? ? ? ? ? ? ? ? ? ? ? ?

公式看起來(lái)可能有點(diǎn)不實(shí)在,還是直接上例子來(lái)說(shuō)明吧!

?

例子:試由下表的訓(xùn)練數(shù)據(jù)學(xué)習(xí)一個(gè)樸素貝葉斯分類器并確定 的類標(biāo)記,表中 為特征, 為類標(biāo)記。

統(tǒng)計(jì)學(xué)習(xí)方法(四)——樸素貝葉斯法_第1張圖片


解:先驗(yàn)概率,

條件概率

據(jù)此可算出 后驗(yàn)分布中值 最大的,也就是最終的類標(biāo)記為-1

? ? 2.2 貝葉斯 估計(jì)

  極大似然估計(jì)的一個(gè)可能是會(huì)出現(xiàn)所要估計(jì)的概率值為 0的情況,這時(shí)會(huì)影響到后驗(yàn)概率的計(jì)算結(jié)果,解決這一問(wèn)題的方法是采用貝葉斯估計(jì),具體的只需要在極大似然估計(jì)的基礎(chǔ)上加多一個(gè)參數(shù)即可。懶得繼續(xù)寫公式了,不想寫了,剛剛碼完代碼!!

?

有興趣的可以看一下具體的代碼實(shí)現(xiàn)

      
        package
      
      
         org.juefan.bayes;


      
      
        import
      
      
         java.util.ArrayList;

      
      
        import
      
      
         java.util.HashMap;

      
      
        import
      
      
         java.util.Map;


      
      
        import
      
      
         org.juefan.basic.FileIO;

      
      
        /**
      
      
        
 * 這是一個(gè)簡(jiǎn)易的貝葉斯分類器
 * 只適用于離散數(shù)據(jù),連續(xù)型數(shù)據(jù)的暫時(shí)請(qǐng)先繞道了^.^
 * 
      
      
        @author
      
      
         JueFan
 
      
      
        */
      
      
        public
      
      
        class
      
      
         NaiveBayes{

    
      
      
        //
      
      
        平滑指數(shù), 默認(rèn)為拉普拉斯平滑,極大似然估計(jì)則為0
      
      
        private
      
      
        static
      
      
        double
      
       Lambda  = 1
      
        ; 
    
      
      
        //
      
      
        存儲(chǔ)先驗(yàn)概率數(shù)據(jù)
      
      
        private
      
       Map<Object, Double> PriorProbability = 
      
        new
      
       HashMap<>
      
        ();
    
      
      
        //
      
      
        存儲(chǔ)條件概率數(shù)據(jù)
      
      
        private
      
       Map<Object, ArrayList<Map<Object, Double>>> ConditionProbability = 
      
        new
      
       HashMap<>
      
        ();

    
      
      
        /**
      
      
        
     * 計(jì)算類別的先驗(yàn)概率
     * 
      
      
        @param
      
      
         datas 
     
      
      
        */
      
      
        public
      
      
        void
      
       setPriorPro(ArrayList<Data>
      
         datas){
        
      
      
        int
      
       counts =
      
         datas.size();
        
      
      
        for
      
      
        (Data data: datas){
            
      
      
        if
      
      
        (PriorProbability.containsKey(data.y)){
                PriorProbability.put(data.y, PriorProbability.get(data.y) 
      
      + 1
      
        );
            }
      
      
        else
      
      
         {
                PriorProbability.put(data.y, (
      
      
        double
      
      ) 1
      
        );
            }
        }
        
      
      
        for
      
      
        (Object o: PriorProbability.keySet())
            PriorProbability.put(o, (PriorProbability.get(o) 
      
      + Lambda)/(counts + Lambda *
      
         PriorProbability.size()));
    }

    
      
      
        /**
      
      
        
     * 計(jì)算條件概率
     * 
      
      
        @param
      
      
         datas
     
      
      
        */
      
      
        public
      
      
        void
      
       setCondiPro(ArrayList<Data>
      
         datas){
        Map
      
      <Object, ArrayList<Data>> tmMap = 
      
        new
      
       HashMap<>
      
        ();
        
      
      
        //
      
      
        按類別先將數(shù)據(jù)分類存放
      
      
        for
      
      
        (Data data: datas){
            
      
      
        if
      
      
        (tmMap.containsKey(data.y)){
                tmMap.get(data.y).add(data);
            }
      
      
        else
      
      
         {
                ArrayList
      
      <Data> tmDatas = 
      
        new
      
       ArrayList<>
      
        ();
                tmDatas.add(data);
                tmMap.put(data.y, tmDatas);
            }
        }
        
      
      
        //
      
      
        條件概率主體
      
      
        for
      
      
        (Object o: tmMap.keySet()){
            ArrayList
      
      <Map<Object, Double>> tmCon = 
      
        new
      
       ArrayList<>
      
        ();
            
      
      
        int
      
       LabelCount =
      
         tmMap.get(o).size();
            
      
      
        //
      
      
        計(jì)算每個(gè)特征的相對(duì)頻數(shù)
      
      
        for
      
      
        (Data data: tmMap.get(o)){
                
      
      
        for
      
      (
      
        int
      
       i = 0; i < data.x.size(); i++
      
        ){
                    
      
      
        if
      
      (tmCon.size() < i + 1
      
        ){
                        Map
      
      <Object, Double> tmMap2 = 
      
        new
      
       HashMap<>
      
        ();
                        tmMap2.put(data.x.get(i), (
      
      
        double
      
      ) 1
      
        );
                        tmCon.add(tmMap2);
                    }
      
      
        else
      
      
         {
                        
      
      
        if
      
      
        (tmCon.get(i).containsKey(data.x.get(i))){
                            tmCon.get(i).put(data.x.get(i), tmCon.get(i).get(data.x.get(i)) 
      
      + 1
      
        );
                        }
      
      
        else
      
      
         {
                            tmCon.get(i).put(data.x.get(i),  (
      
      
        double
      
      ) 1
      
        );
                        }
                    }
                }
            }
            
      
      
        //
      
      
        計(jì)算條件概率
      
      
        for
      
      (
      
        int
      
       i = 0; i < tmCon.size(); i++
      
        ){
                
      
      
        for
      
      
        (Object o1: tmCon.get(i).keySet()){
                    tmCon.get(i).put(o1, (tmCon.get(i).get(o1) 
      
      + Lambda)/(LabelCount + Lambda *
      
         tmCon.get(i).size()));
                }
            }
            ConditionProbability.put(o, tmCon);
        }
    }

    
      
      
        /**
      
      
        
     * 判斷實(shí)例的類別
     * 
      
      
        @param
      
      
         data
     * 
      
      
        @return
      
      
         判斷結(jié)果
     
      
      
        */
      
      
        public
      
      
         Object getLabel(Data data){
        Object label 
      
      = 
      
        new
      
      
         Object();
        
      
      
        double
      
       pro =
      
         0D;
        
      
      
        for
      
      
        (Object o: PriorProbability.keySet()){
            
      
      
        double
      
       tmPro = 1
      
        ;
            tmPro 
      
      *=
      
         PriorProbability.get(o);
            
      
      
        for
      
      (
      
        int
      
       i = 0; i < data.x.size(); i++
      
        ){
                tmPro 
      
      *=
      
         ConditionProbability.get(o).get(i).get(data.x.get(i));
            }
            
      
      
        if
      
      (tmPro >
      
         pro){
                pro 
      
      =
      
         tmPro;
                label 
      
      =
      
         o;
            }
            System.out.println(o.toString() 
      
      + " :的后驗(yàn)概率為: " +
      
         tmPro);
        }
        
      
      
        return
      
      
         label;
    }

    
      
      
        public
      
      
        static
      
      
        void
      
      
         main(String[] args) {
        ArrayList
      
      <Data> datas = 
      
        new
      
       ArrayList<>
      
        ();
        FileIO fileIO 
      
      = 
      
        new
      
      
         FileIO();
        fileIO.setFileName(
      
      ".//file//bayes.txt"
      
        );
        fileIO.FileRead();
        
      
      
        for
      
      
        (String data: fileIO.fileList){
            datas.add(
      
      
        new
      
      
         Data(data));
        }

        NaiveBayes bayes 
      
      = 
      
        new
      
      
         NaiveBayes();
        bayes.setPriorPro(datas);
        bayes.setCondiPro(datas);

        Data data 
      
      = 
      
        new
      
       Data("1\t2\tS"
      
        );
        System.out.println(data.toString() 
      
      + "\t的判斷類別為: " +
      
         bayes.getLabel(data));
    }
}
      
    

?

?對(duì)代碼有興趣的可以上本人的GitHub查看: https://github.com/JueFan/StatisticsLearningMethod/

統(tǒng)計(jì)學(xué)習(xí)方法(四)——樸素貝葉斯法


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論