最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java利用樸素貝葉斯分類算法實現(xiàn)信息分類

 更新時間:2022年06月23日 14:51:22   作者:洛陽泰山  
貝葉斯分類算法是統(tǒng)計學的一種分類方法,它是一類利用概率統(tǒng)計知識進行分類的算法。本文將利用樸素貝葉斯分類算法實現(xiàn)信息分類,需要的可以參考一下

貝葉斯分類算法 

貝葉斯分類算法是統(tǒng)計學的一種分類方法,它是一類利用概率統(tǒng)計知識進行分類的算法。在許多場合,樸素貝葉斯(Naïve Bayes,NB)分類算法可以與決策樹和神經(jīng)網(wǎng)絡分類算法相媲美,該算法能運用到大型數(shù)據(jù)庫中,而且方法簡單、分類準確率高、速度快。

由于貝葉斯定理假設一個屬性值對給定類的影響獨立于其它屬性的值,而此假設在實際情況中經(jīng)常是不成立的,因此其分類準確率可能會下降。為此,就衍生出許多降低獨立性假設的貝葉斯分類算法,如TAN(tree augmented Bayes network)算法。

那么既然是樸素貝葉斯分類算法,它的核心算法又是什么呢?

是下面這個貝葉斯公式:

換個表達形式就會明朗很多,如下:

我們最終求的p(類別|特征)即可!就相當于完成了我們的任務。

代碼實例

下面以女生找對象舉例,提取除女生找對象的幾個關(guān)鍵特征,比如顏值,性格,身高,上進心,資產(chǎn)情況為擇偶特征,通過事先調(diào)研等手段,獲取一部分數(shù)據(jù)樣本,即各類特征以及擇偶結(jié)果(分類)數(shù)據(jù)集。根據(jù)數(shù)據(jù)集利用樸素貝葉斯函數(shù)計算出個各個特征集合在該分類下的值,結(jié)果值最大的分類,認為該數(shù)據(jù)屬于這個分類。由于這個是利用概率學去計算得出的,不一定十分準確,數(shù)據(jù)集樣本數(shù)據(jù)越大,準確率就越高。

數(shù)據(jù)集data.txt

下面數(shù)據(jù)集每行代碼一條樣本數(shù)據(jù),每條數(shù)據(jù)中的具體特征用逗號“,” 分割,特征順尋依次為

顏值,性格,身高,上進心,資產(chǎn)情況,女生中意結(jié)果

帥,好,高,上進,有錢,中意
不帥,好,高,上進,有錢,中意
帥,不好,高,上進,有錢,中意
帥,好,不高,上進,有錢,中意
帥,好,高,不上進,有錢,中意
帥,好,高,上進,不有錢,中意
帥,好,不高,不上進,有錢,不中意
不帥,不好,不高,上進,有錢,中意
不帥,不好,不高,上進,不有錢,不中意
帥,好,不高,上進,不有錢,中意
不帥,好,高,不上進,有錢,不中意
帥,不好,高,上進,有錢,不中意
不帥,好,高,上進,有錢,不中意
帥,不好,高,上進,不有錢,中意
帥,不好,高,不上進,有錢,中意
帥,好,高,上進,不有錢,不中意
帥,不好,不高,不上進,不有錢,不中意
不帥,不好,不高,不上進,不有錢,不中意
帥,好,不高,上進,有錢,中意
不帥,不好,不高,不上進,有錢,不中意
帥,好,高,上進,不有錢,中意
帥,好,不高,不上進,有錢,中意
帥,好,高,不上進,不有錢,不中意
帥,不好,高,不上進,有錢,不中意

代碼實現(xiàn)

 
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;
 
/**
 * @author liuya
 */
public class NaiveBayesModel {
 
    //樣本數(shù)據(jù)
    private static List<List<String>> data = new ArrayList<>();
    //樣本數(shù)據(jù)
    private static Set<List<String>> dataSet = new HashSet<>();
    //分類模型
    public static Map<String,String> modelMap = new HashMap<>();
    //樣本數(shù)據(jù)集
    private static String path = "./src/data.txt";
 
    public static void main(String[] args) {
        //訓練模型
        trainingModel();
        //識別
        classification("帥","好","高","上進","有錢");
        classification("不帥","不好","不高","不上進","不有錢");
    }
 
    /**
     * 導入數(shù)據(jù)
     * @param path
     * @return
     */
    public static void readData(String path){
        List<String> row = null;
        try {
            InputStreamReader isr = new InputStreamReader(new FileInputStream(new File(path)));
            BufferedReader br = new BufferedReader(isr);
            String str = null;
            while((str = br.readLine()) != null){
                row = new ArrayList<>();
                String[] str1 = str.split(",");
                for(int i = 0; i < str1.length ; i++) {
                    row.add(str1[i]);
                }
                dataSet.add(row);
                data.add(row);
            }
            br.close();
            isr.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("讀取文件內(nèi)容出錯!");
        }
    }
 
    public static void trainingModel() {
        readData(path);
        String category1="中意";
        String category2="不中意";
        dataSet.forEach(e->{
          double categoryP1=  calculateBayesian(e.get(0),e.get(1),e.get(2),e.get(3),e.get(4),category1);
          double categoryP2=  calculateBayesian(e.get(0),e.get(1),e.get(2),e.get(3),e.get(4),category2);
            String result=categoryP1>categoryP2?category1:category2;
            modelMap.put(e.get(0)+"-"+e.get(1)+"-"+e.get(2)+"-"+e.get(3)+"-"+e.get(4),result);
        });
    }
 
    /**
     * 分類的識別
     * */
    public static void  classification(String look, String character, String height, String progresses, String wealthy){
        String key=look+"-"+character+"-"+height+"-"+progresses+"-"+wealthy;
        String result=modelMap.get(key);
        System.out.println("特征為"+look+","+character+","+height+","+progresses+","+wealthy+"的對象,女生"+result);
    }
 
 
    /**
     * 分類的核心是比較樸素貝葉斯的結(jié)果值,結(jié)果值大的認為就屬于該分類(會有誤差,數(shù)據(jù)集量越大,結(jié)果判定的準確率就會越高)由于分母相同可以直接比較分子來確定分類
     * */
    public static double calculateBayesian(String look, String character, String height, String progresses, String wealthy,String category) {
        //獲取P(x|y)的分母
      //  double denominator = getDenominator(look,character,height,progresses,wealthy);
        //獲取P(x|y)的分子
        double molecule = getMolecule(look,character,height,progresses,wealthy,category);
        return molecule/1;
    }
 
    /**
     * 獲取p(x|y)分子
     * @return
     */
    public static double getMolecule(String look, String character, String height, String progresses, String wealthy,String category) {
        double resultCP = getProbability(5, category);
        double lookCP = getProbability(0, look, category);
        double characterCP = getProbability(1, character, category);
        double heightCP = getProbability(2, height, category);
        double progressesCP = getProbability(3, progresses, category);
        double wealthyCP = getProbability(4, wealthy, category);
        return lookCP * characterCP * heightCP * progressesCP * wealthyCP * resultCP;
 
    }
 
    /**
     * 獲取p(x|y)分母
     * @return
     */
    public static double getDenominator(String look, String character, String height, String progresses, String wealthy) {
        double lookP = getProbability(0, look);
        double characterP = getProbability(1, character);
        double heightP = getProbability(2, height);
        double progressesP = getProbability(3, progresses);
        double wealthyP = getProbability(4, wealthy);
        return lookP * characterP * heightP * progressesP * wealthyP;
    }
 
 
    /**
     * 獲取某特征的概率
     * @return
     */
    private static double getProbability(int index, String feature) {
        int size = data.size();
        int num = 0;
        for (int i = 0; i < size; i++) {
            if (data.get(i).get(index).equals(feature)) {
                num++;
            }
        }
        return (double) num / size;
    }
 
    /**
     * 獲取某類別下某特征的概率
     * @return
     */
    private static double getProbability(int index, String feature, String category) {
        List<List<String>> filterData=data.stream().filter(e -> e.get(e.size() - 1).equals(category)).collect(Collectors.toList());
        int size =filterData.size();
        int num = 0;
        for (int i = 0; i < size; i++) {
            if (data.get(i).get(index).equals(feature)) {
                num++;
            }
        }
        return (double) num / size;
    }
}

輸出結(jié)果

使用場景

比如網(wǎng)站垃圾信息分類,文章自動分類,網(wǎng)站垃圾郵件分類,文件分類等。

以反垃圾啊郵件為例說明分類算法的使用,先將批量已經(jīng)分類的郵件樣本(如5000封正常的郵件,2000封垃圾郵件),輸入分類算法進行訓練,得到一個垃圾郵件分類模型,然后利用分類算法結(jié)合分類模型對待處理郵件進行分類識別。

根據(jù)已經(jīng)分類的樣本信息提取出一組特征信息的概率,比如郵件中“信用卡”這個詞出現(xiàn)在垃圾郵件的中的概率為20%,在非垃圾郵件的概率為1%,就得到一個分類模型。然后從待識別處理的郵件中提取特征值,結(jié)合分類模型,就可以判斷其分類是不是垃圾郵件。由于貝葉斯算法得到的分類判斷是概率值,所以可能會出現(xiàn)誤判。

以上就是Java利用樸素貝葉斯分類算法實現(xiàn)信息分類的詳細內(nèi)容,更多關(guān)于Java 信息分類的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java高并發(fā)中的交換器Exchanger解析

    Java高并發(fā)中的交換器Exchanger解析

    這篇文章主要介紹了Java高并發(fā)中的交換器Exchanger解析,如果兩個線程并行處理,但在某個時刻需要互相交換自己已經(jīng)處理完的中間數(shù)據(jù),然后才能繼續(xù)往下執(zhí)行,這個時候就可以使用 Exchanger,需要的朋友可以參考下
    2023-12-12
  • 程序猿必須要掌握的多線程安全問題之鎖策略詳解

    程序猿必須要掌握的多線程安全問題之鎖策略詳解

    在筆者面試過程時,經(jīng)常會被問到各種各樣的鎖,如樂觀鎖、讀寫鎖等等,非常繁多,在此做一個總結(jié),介紹的內(nèi)容如下,需要的朋友可以參考下
    2021-06-06
  • Java中類的定義和初始化示例詳解

    Java中類的定義和初始化示例詳解

    這篇文章主要給大家介紹了關(guān)于Java中類的定義和初始化的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • Spring Cloud Config 使用本地配置文件方式

    Spring Cloud Config 使用本地配置文件方式

    這篇文章主要介紹了Spring Cloud Config 使用本地配置文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Mybatis中and和循環(huán)or混用操作(or轉(zhuǎn)換成in)

    Mybatis中and和循環(huán)or混用操作(or轉(zhuǎn)換成in)

    這篇文章主要介紹了Mybatis中and和循環(huán)or混用操作(or轉(zhuǎn)換成in),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringCloud高可用配置中心Config詳解

    SpringCloud高可用配置中心Config詳解

    Spring Cloud Config 是一個解決分布式系統(tǒng)的配置管理方案,它包含了 server 和 client 兩個部分,這篇文章主要介紹了SpringCloud之配置中心Config(高可用),需要的朋友可以參考下
    2022-04-04
  • mybatis中的緩存機制

    mybatis中的緩存機制

    這篇文章主要介紹了mybatis中的緩存機制用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java語言實現(xiàn)簡單FTP軟件 FTP本地文件管理模塊實現(xiàn)(9)

    Java語言實現(xiàn)簡單FTP軟件 FTP本地文件管理模塊實現(xiàn)(9)

    這篇文章主要為大家詳細介紹了Java語言實現(xiàn)簡單FTP軟件,F(xiàn)TP本地文件管理模塊的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • JAVASE精密邏輯控制過程詳解(分支和循環(huán)語句)

    JAVASE精密邏輯控制過程詳解(分支和循環(huán)語句)

    在一個程序執(zhí)行的過程中各條語句的執(zhí)行順序?qū)Τ绦虻慕Y(jié)果是有直接影響的,這篇文章主要給大家介紹了關(guān)于JAVASE精密邏輯控制(分支和循環(huán)語句)的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • Java如何在臨界區(qū)中避免競態(tài)條件

    Java如何在臨界區(qū)中避免競態(tài)條件

    這篇文章主要介紹了Java如何在臨界區(qū)中避免競態(tài)條件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10

最新評論

方城县| 新昌县| 台东市| 乳源| 益阳市| 和林格尔县| 天柱县| 镇远县| 体育| 侯马市| 揭西县| 垫江县| 西盟| 富阳市| 江山市| 滦南县| 深水埗区| 镶黄旗| 大姚县| 新津县| 阳城县| 长沙县| 宜都市| 横山县| 万安县| 酒泉市| 嘉鱼县| 安宁市| 平遥县| 湖北省| 仁布县| 富蕴县| 廊坊市| 鄂温| 焉耆| 沈丘县| 泗水县| 平舆县| 蚌埠市| 龙山县| 酉阳|