Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 394|回复: 0

[算法学习]bayes分类算法之java实现

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-3 00:01:03 | 显示全部楼层 |阅读模式
    这是基本的bayes分类算法实现, 原理比较繁琐, 如果看我的代码去理解bayes算法比较困难,这个版本是我的bayes算法实现的第一个版本,还有很大的优化的余地.如果有空我会更新.
    1. import java.util.*;
    2. public class Classifier {   
    3.       
    4.       
    5.     /**  
    6.      *   
    7.      * key   : 类别  
    8.      * value :   
    9.      * key  : 单词  
    10.      * value: 出现次数  
    11.      */  
    12.     private static HashMap< String,HashMap< String,Integer> > typeMap =
    13.                           new HashMap < String,HashMap< String,Integer>>();   
    14.       
    15.     //总共有多少种word   
    16.     private static Set< String> wordSet = new HashSet< String>();   
    17.       
    18.     //存放每个类别中总共有多少单词   
    19.     HashMap< String,Integer>  sumInType = new HashMap< String,Integer>();   
    20.       
    21.       
    22.     //训练   
    23.     public void train(String[] words,String type)   
    24.     {   
    25.            
    26.         if(typeMap.containsKey(type))   
    27.         {   
    28.             setWordInfo(typeMap.get(type),words,type);   
    29.         }   
    30.         //如果没有此类别   
    31.         else  
    32.         {   
    33.             setWordInfo(new HashMap< String,Integer>(),words,type);   
    34.         }   
    35.            
    36.            
    37.         for( String tp : typeMap.keySet())   
    38.         {   
    39.             int sum = 0;   
    40.             for(String w : typeMap.get(tp).keySet())   
    41.             {   
    42.                 sum += 1 *  typeMap.get(tp).get(w);   
    43.             }   
    44.             sumInType.put(tp, sum);   
    45.         }   
    46.            
    47.     }   
    48.       
    49.       
    50.       
    51.     /**  
    52.      * 计算每个单词的概率和保存单词的出现次数  
    53.      * @param words  
    54.      */  
    55.     private void  setWordInfo(HashMap< String,Integer> childMap,String[] words,String type)   
    56.     {   
    57.         //WordInfo wi ;   
    58.         int sumWord = 0 ;   
    59.         for(String w : words)   
    60.         {   
    61.             if(!childMap.containsKey(w))   
    62.             {   
    63.                 childMap.put(w, 1);   
    64.             }   
    65.             else  
    66.             {   
    67.                 childMap.put(w, childMap.get(w)+1);   
    68.             }   
    69.         }   
    70.         setWordSet(words);   
    71.         typeMap.put(type, childMap);   
    72.     }   
    73.       
    74.       
    75.     private void setWordSet(String[] words)   
    76.     {   
    77.         for( String w : words)   
    78.         {   
    79.             wordSet.add(w);   
    80.         }   
    81.     }   
    82.       
    83.     public String getClassification(String[] ws)   
    84.     {   
    85.            
    86.         //存放每个   
    87.         HashMap< String,HashMap< String,Double>> mp = new HashMap< String,HashMap< String,Double>>();   
    88.            
    89.         for( String type : typeMap.keySet())   
    90.         {   
    91.             for(String w : ws)   
    92.             {   
    93.                     if(mp.containsKey(type))   
    94.                     {   
    95.                         if(mp.get(type).containsKey(w))   
    96.                             break;   
    97.                         else  
    98.                         {   
    99.                             double p =
    100.                               (double)(typeMap.get(type).get(w)+ 1) / (double)(  wordSet.size() + sumInType.get(type));   
    101.                     /*      System.out.println("("+ typeMap.get(type).get(w) +
    102.                                  "+ 1)/(" + wordSet.size() + "+ "+sumInType.get(type)+")");  
    103.                             System.out.println("type["+type+"]  "+ w +" p = " + p);  
    104.                             System.out.println("-------------------------------------------");*/  
    105.                             mp.get(type).put(w, p);   
    106.                         }   
    107.                     }   
    108.                     else  
    109.                     {   
    110.                         HashMap< String,Double> submp = new HashMap< String,Double>();   
    111.                         int app = 0;   
    112.                         if(typeMap.get(type).containsKey(w))   
    113.                             app =   typeMap.get(type).get(w);   
    114.                            
    115.                            
    116.                         double p = (double)(app+ 1) / (double)(  wordSet.size() + sumInType.get(type));   
    117.                     /*  System.out.println("("+ app + "+ 1)/(" + wordSet.size() + "+ "+sumInType.get(type)+")");  
    118.                         System.out.println("type["+type+"]  "+ w +" p = " + p);  
    119.                         System.out.println("-------------------------------------------");*/  
    120.                         submp.put(w, p);   
    121.                         mp.put(type, submp);   
    122.                     }   
    123.             }   
    124.         }   
    125.            
    126.         HashMap< String,Integer> time = new HashMap< String,Integer>();   
    127.         for(String w : ws)   
    128.         {   
    129.             if(time.containsKey(w))   
    130.             {   
    131.                 time.put(w, time.get(w)+1);   
    132.             }   
    133.             else  
    134.             {   
    135.                 time.put(w, 1);   
    136.             }   
    137.         }   
    138.            
    139.         String realType = null;   
    140.         double maxP = 0;   
    141.                
    142.            
    143.         for(String ty : mp.keySet())   
    144.         {   
    145.             double p1 = 1;   
    146.             for(String w : mp.get(ty).keySet())   
    147.             {   
    148.                  p1 = p1 * Math.pow((mp.get(ty).get(w)),time.get(w));   
    149.            
    150.             }   
    151.             double p2 = 1d / mp.size() * p1;   
    152.             if (p2 > maxP)   
    153.             {   
    154.                 maxP = p2;     
    155.                 realType = ty;   
    156.             }   
    157.         }   
    158.         return realType;   
    159.     }   
    160.       
    161.       
    162.     public static void main(String[] args) {   
    163.            
    164.         String[] s1 = {"Chinese","BeiJing","Chinese"};   
    165.         String[] s2 = {"Chinese","Chinese","ShangHai"};   
    166.         String[] s3 = {"Chinese","Japan","Tokyo"};   
    167.         String[] s4 = {"Tokyo","Kyoto","Chinese"};   
    168.            
    169.         Classifier cf = new Classifier();   
    170.            
    171.         cf.train(s1, "Y");   
    172.         cf.train(s2, "Y");   
    173.         cf.train(s3, "N");   
    174.         cf.train(s4, "N");   
    175.            
    176.         String[] s5 = {"Tokyo","Chinese","Tokyo","Japan"};   
    177.         System.out.println("get type = "+cf.getClassification(s5));   
    178.     }   
    179.       
    180.       
    181.       
    182. }  
    复制代码


       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/3/000102921.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-11-11 23:05 , Processed in 0.504550 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表