国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于weka平臺手工實(shí)現(xiàn)樸素貝葉斯分類

這篇具有很好參考價(jià)值的文章主要介紹了基于weka平臺手工實(shí)現(xiàn)樸素貝葉斯分類。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、貝葉斯定理

B事件發(fā)生后,A事件發(fā)生的概率可以如下表示:

p ( A ∣ B ) = p ( A ∩ B ) P ( B ) (1) p(A|B)=\frac{p(A\cap B)}{P(B)}\tag{1} p(AB)=P(B)p(AB)?(1)

A事件發(fā)生后,B事件發(fā)生的概率可以如下表示:

p ( B ∣ A ) = p ( A ∩ B ) P ( A ) (2) p(B|A)=\frac{p(A\cap B)}{P(A)}\tag{2} p(BA)=P(A)p(AB)?(2)

二者做比:

P ( A ∣ B ) P ( B ∣ A ) = P ( A ) P ( B ) (3) \frac{P(A|B)}{P(B|A)}=\frac{P(A)}{P(B)}\tag{3} P(BA)P(AB)?=P(B)P(A)?(3)

P ( B ∣ A ) P(B|A) P(BA) 乘到等式右邊后,我們就叨叨了如下貝葉斯定理:

P ( A ∣ B ) = P ( B ∣ A ) P ( A ) P ( B ) (4) P(A|B)=\frac{P(B|A)P(A)}{P(B)}\tag{4} P(AB)=P(B)P(BA)P(A)?(4)

二、貝葉斯分類

將貝葉斯定理的變量名稱稍作變換,我們就得到了貝葉斯公式:

P ( c ∣ x ) = P ( x ∣ c ) P ( c ) P ( x ) (5) P(c|\bm{x})=\frac{P(\bm{x}|c)P(c)}{P(\bm{x})}\tag{5} P(cx)=P(x)P(xc)P(c)?(5)

其中, P ( c ) P(c) P(c) 表示數(shù)據(jù)集中 l a b e l label label c c c 類樣本的概率, x \bm{x} x 是輸入屬性, P ( x ) P(\bm{x}) P(x) 表示輸入 x \bm{x} x 發(fā)生的概率, P ( x ∣ c ) P(\bm{x}|c) P(xc) c c c 發(fā)生條件下 x \bm{x} x 發(fā)生的概率。

我們通過公式5,來表示我們把輸入 x \bm{x} x 分為 c c c 類的概率,這就是貝葉斯分類

進(jìn)一步理解, P ( c ) P(c) P(c)叫做先驗(yàn)概率 P ( x ∣ c ) P(x|c) P(xc)叫做似然概率,二者相乘,最終的結(jié)果就可以很好的表征樣本為某個(gè)類別的可能性大小。

三、樸素貝葉斯

從上面的式5可以看出,我們?nèi)绻胍A(yù)測一個(gè)輸入 x \bm{x} x的類別,我們只需要得到訓(xùn)練數(shù)據(jù)集中的 P ( c ) P(c) P(c) P ( x ∣ c ) P(\bm{x}|c) P(xc) 就可以了, P ( x ) P(x) P(x)不需要。

因?yàn)槲覀兊念A(yù)測過程是,給出一個(gè)樣本輸入 x x x,假設(shè)這個(gè)樣本可能的類別為 C = { c ∣ c 0 , c 1 , . . . , c n } C=\{c|c_0,c_1,...,c_n\} C={cc0?,c1?,...,cn?};

我們根據(jù)貝葉斯公式,計(jì)算 P ( c 0 ) P(c_0) P(c0?), P ( c 1 ) P(c_1) P(c1?),……, P ( c n ) P(c_n) P(cn?) ;

最后,我們選擇一個(gè)最大的 P ( c ) P(c) P(c)作為我們最終的預(yù)測類別 c ′ c' c,模型預(yù)測結(jié)束。

而在這個(gè)過程中,我們的輸入 x x x 是相同的,因此 P ( x ) P(\bm{x}) P(x) 也是相同的,所以我們不需要管它,就選擇分子最大的就可以了。

3.1 計(jì)算 P ( c ) P(c) P(c)

這個(gè)很好計(jì)算,我們直接統(tǒng)計(jì)一下,數(shù)據(jù)集中不同類別的數(shù)據(jù)的頻率就可以了,大數(shù)定律告訴我們,當(dāng)數(shù)據(jù)集足夠大的時(shí)候,我們可以使用頻率來逼近概率。

3.2 計(jì)算 P ( x ∣ c ) P(\bm{x}|c) P(x∣c)

這個(gè)思路也很簡單,同樣是統(tǒng)計(jì),統(tǒng)計(jì)數(shù)據(jù)集中,label屬于 c c c 的,同時(shí)輸入屬性為 x \bm{x} x 的數(shù)據(jù)的頻率,在數(shù)據(jù)量比較大的情況下,同樣使用頻率逼近概率。

但是,這里的 x \bm{x} x 是由不同的輸入屬性組合到一起最終合成的,它具有非常多種的情況,是組合問題,這種問題統(tǒng)計(jì)起來是會出現(xiàn)復(fù)雜度爆炸的情況的,無法在多項(xiàng)式的時(shí)間內(nèi)完成程序的運(yùn)算,換言之為一種 NP 難問題。

3.3 屬性獨(dú)立假設(shè)

為了解決這種 NP 難問題,我們采用了屬性條件獨(dú)立假設(shè),進(jìn)而就誕生了樸素貝葉斯

樸素貝葉斯分類通過屬性獨(dú)立假設(shè),近似求解了 P ( x ∣ c ) P(\bm{x}|c) P(xc)這個(gè)NP難問題,而且近似的效果非常好,可以取得很棒的分類效果。

假設(shè)所有屬性為獨(dú)立分布的,我們可以得到如下式子:

P ( x ∣ c ) = ∏ i = 0 d P ( x i ∣ c ) (6) P(\bm{x}|c)=\prod_{i=0}^dP(x_i|c)\tag{6} P(xc)=i=0d?P(xi?c)(6)

其中d為屬性數(shù)目, x i x_i xi? x \bm{x} x 在第 i i i 個(gè)屬性上的取值。

將式(6)帶入式(5)可以得到如下結(jié)果:

P ( c ∣ x ) = P ( x ∣ c ) P ( c ) P ( x ) = P ( c ) P ( x ) ∏ i = 0 d P ( x i ∣ c ) (7) P(c|\bm{x})=\frac{P(\bm{x}|c)P(c)}{P(\bm{x})}=\frac{P(c)}{P(\bm{x})}\prod_{i=0}^dP(x_i|c)\tag{7} P(cx)=P(x)P(xc)P(c)?=P(x)P(c)?i=0d?P(xi?c)(7)

這里面的 P ( x i ∣ c ) P(x_i|c) P(xi?c) 是很有限的,它的數(shù)量可以表示為 ∑ i = 1 n n u m A t t r i b u t e s V a l u e s ( i ) × n u m C l a s s V a l u e s \sum_{i=1}^n numAttributesValues(i)\times numClassValues i=1n?numAttributesValues(i)×numClassValues。在程序設(shè)計(jì)中我們可以采用一個(gè)二維的List數(shù)組、三維double數(shù)組或者二維數(shù)組表示三維數(shù)組等多種方法來存儲這個(gè)變量。(具體可以看下面代碼,為了代碼的可讀性和簡潔性,我是采用二維List來進(jìn)行表示的)

其中 n n n表示輸入 x \bm{x} x的屬性數(shù)量, n u m A t t r i b u t e s V a l u e s ( i ) numAttributesValues(i) numAttributesValues(i) 表示第i個(gè)屬性的可能取值的數(shù)量, n u m C l a s s V a l u e s numClassValues numClassValues 表示 label 有多少個(gè)類別。

從上面也可以看出,貝葉斯分類器天然是用來處理名詞性屬性的,如果我們遇到了數(shù)值型屬性,就需要進(jìn)行一下數(shù)據(jù)離散化處理,才能采用貝葉斯進(jìn)行分類。數(shù)據(jù)離散化處理方法有很多,比如:等高分箱、等寬分享,以及基于概率分布的劃分等。文章來源地址http://www.zghlxwxcb.cn/news/detail-543978.html

四、基于weka的代碼實(shí)現(xiàn)

package weka.classifiers.myf;

import weka.classifiers.Classifier;
import weka.core.*;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

/**
 * @author YFMan
 * @Description 樸素貝葉斯 分類器
 * @Date 2023/5/14 18:48
 */
public class myNaiveBayes extends Classifier {

    // 用于存儲 樸素貝葉斯 屬性參數(shù)
    protected List<Integer>[][] m_Distributions;

    // 用于存儲 樸素貝葉斯 類別參數(shù)
    protected List<Integer> m_ClassDistribution;

    // 類別參數(shù) 的 種類數(shù)量
    protected int m_NumClasses;

    // 存儲訓(xùn)練數(shù)據(jù)
    protected Instances m_Instances;

    /*
     * @Author YFMan
     * @Description 訓(xùn)練分類器,初始化 屬性參數(shù) 和 類別參數(shù)
     * @Date 2023/5/14 21:42
     * @Param [instances 訓(xùn)練數(shù)據(jù)]
     * @return void
     **/
    public void buildClassifier(Instances instances) throws Exception {
        // 初始化訓(xùn)練數(shù)據(jù)
        m_Instances = instances;
        // 初始化類別參數(shù) 的 種類數(shù)量
        m_NumClasses = instances.numClasses();

        // 初始化 屬性參數(shù)
        m_Distributions = new List[instances.numAttributes() - 1][m_NumClasses];
        for(int i=0;i<instances.numAttributes() - 1;i++){
            for(int j=0;j<m_NumClasses;j++){
                m_Distributions[i][j] = new ArrayList<>();
            }
        }
        // 初始化 類別參數(shù)
        m_ClassDistribution = new ArrayList<>();
        for(int i=0;i<m_NumClasses;i++){
            m_ClassDistribution.add(0);
        }

        // 獲取屬性參數(shù)的枚舉類型
        Enumeration attributeEnumeration = instances.enumerateAttributes();
        // 遍歷屬性參數(shù)
        while (attributeEnumeration.hasMoreElements()) {
            // 獲取屬性參數(shù)
            Attribute attribute = (Attribute) attributeEnumeration.nextElement();
            // 獲取屬性參數(shù)的索引
            int attributeIndex = attribute.index();
            // 獲取屬性參數(shù)的值的枚舉類型
            Enumeration attributeValueEnumeration = attribute.enumerateValues();
            // 遍歷屬性參數(shù)的值
            while (attributeValueEnumeration.hasMoreElements()) {
                // 獲取屬性參數(shù)的值
                String attributeValue = (String) attributeValueEnumeration.nextElement();
                // 遍歷類別參數(shù)
                for (int classIndex = 0; classIndex < m_NumClasses; classIndex++) {
                    // 初始化 屬性參數(shù) 的 某個(gè)值 的 某個(gè)類別參數(shù) 的 計(jì)數(shù)
                    m_Distributions[attributeIndex][classIndex].add(0);
                }
            }
        }

        // 遍歷訓(xùn)練數(shù)據(jù)
        for (int instanceIndex = 0; instanceIndex < instances.numInstances(); instanceIndex++) {
            // 獲取訓(xùn)練數(shù)據(jù)的實(shí)例
            Instance instance = instances.instance(instanceIndex);
            // 獲取訓(xùn)練數(shù)據(jù)的類別參數(shù)的值
            int classValue = (int) instance.classValue();
            // 遍歷屬性參數(shù)
            for (int attributeIndex = 0; attributeIndex < instances.numAttributes() - 1; attributeIndex++) {
                // 獲取訓(xùn)練數(shù)據(jù)的屬性參數(shù)的值
                int attributeValue = (int) instance.value(attributeIndex);
                // 計(jì)數(shù)
                m_Distributions[attributeIndex][classValue].set(attributeValue,
                        m_Distributions[attributeIndex][classValue].get(attributeValue) + 1);
            }
            // 計(jì)數(shù)
            m_ClassDistribution.set(classValue, m_ClassDistribution.get(classValue) + 1);
        }
    }

    /*
     * @Author YFMan
     * @Description 根據(jù)給定的實(shí)例,預(yù)測其類別
     * @Date 2023/5/14 21:43
     * @Param [instance 給定的實(shí)例]
     * @return double[]
     **/
    public double[] distributionForInstance(Instance instance)
            throws Exception {
        // 初始化預(yù)測概率數(shù)組
        double[] predictionProbability = new double[m_NumClasses];
        // 遍歷類別參數(shù)
        for (int classIndex = 0; classIndex < m_NumClasses; classIndex++) {
            // 初始化預(yù)測概率
            double prediction = 1;
            // 遍歷屬性參數(shù)
            for (int attributeIndex = 0; attributeIndex < m_Instances.numAttributes() - 1; attributeIndex++) {
                // 獲取屬性參數(shù)的值
                int attributeValue = (int) instance.value(attributeIndex);
                // 獲取 當(dāng)前屬性 可能的取值數(shù)
                int attributeValueCount = m_Distributions[attributeIndex][classIndex].size();
                // 計(jì)算條件概率P(x|c) (當(dāng)前屬性值在當(dāng)前類別下占的比例) (拉普拉斯平滑)
                double p_x_c =  (double) (m_Distributions[attributeIndex][classIndex].get(attributeValue) + 1) /
                        (m_ClassDistribution.get(classIndex) + attributeValueCount);
                // 計(jì)算預(yù)測概率
                prediction *= p_x_c;
            }
            // 計(jì)算先驗(yàn)概率P(c) (當(dāng)前類別占總類別的比例) (拉普拉斯平滑)
            double p_c = (double) (m_ClassDistribution.get(classIndex) + 1) /
                    (m_Instances.numInstances() + m_NumClasses);
            // 計(jì)算預(yù)測概率
            predictionProbability[classIndex] = prediction * p_c;
        }
        // 歸一化
        Utils.normalize(predictionProbability);
        // 返回預(yù)測概率數(shù)組
        return predictionProbability;
    }

    /*
     * @Author YFMan
     * @Description 主函數(shù)
     * @Date 2023/5/14 21:54
     * @Param [argv 命令行參數(shù)]
     * @return void
     **/
    public static void main(String[] argv) {
        runClassifier(new myNaiveBayes(), argv);
    }
}

到了這里,關(guān)于基于weka平臺手工實(shí)現(xiàn)樸素貝葉斯分類的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 機(jī)器學(xué)習(xí):基于樸素貝葉斯(Naive Bayes)的分類預(yù)測

    機(jī)器學(xué)習(xí):基于樸素貝葉斯(Naive Bayes)的分類預(yù)測

    目錄 一、簡介和環(huán)境準(zhǔn)備 簡介: 環(huán)境: 二、實(shí)戰(zhàn)演練 2.1使用葡萄(Wine)數(shù)據(jù)集,進(jìn)行貝葉斯分類 1.數(shù)據(jù)導(dǎo)入 2.模型訓(xùn)練 3.模型預(yù)測 2.2模擬離散數(shù)據(jù)集–貝葉斯分類 1.數(shù)據(jù)導(dǎo)入、分析 2.模型訓(xùn)練、預(yù)測 ?三、原理解析 樸素貝葉斯算法 優(yōu)缺點(diǎn): 樸素貝葉斯(Naive Bayes, NB)?是

    2023年04月19日
    瀏覽(24)
  • 基于機(jī)器學(xué)習(xí)算法:樸素貝葉斯和SVM 分類-垃圾郵件識別分類系統(tǒng)(含Python工程全源碼)

    基于機(jī)器學(xué)習(xí)算法:樸素貝葉斯和SVM 分類-垃圾郵件識別分類系統(tǒng)(含Python工程全源碼)

    本項(xiàng)目采用樸素貝葉斯和支持向量機(jī)(SVM)分類模型作為基礎(chǔ),通過對垃圾郵件和正常郵件的數(shù)據(jù)進(jìn)行訓(xùn)練,旨在實(shí)現(xiàn)垃圾郵件的自動識別功能。 通過訓(xùn)練這兩個(gè)分類模型,我們的目標(biāo)是建立一個(gè)高效準(zhǔn)確的垃圾郵件識別系統(tǒng)。當(dāng)接收到新的郵件時(shí),系統(tǒng)將對郵件文本進(jìn)行預(yù)

    2024年02月09日
    瀏覽(32)
  • 機(jī)器學(xué)習(xí)——使用樸素貝葉斯分類器實(shí)現(xiàn)垃圾郵件檢測(python代碼+數(shù)據(jù)集)

    機(jī)器學(xué)習(xí)——scikit-learn庫學(xué)習(xí)、應(yīng)用 機(jī)器學(xué)習(xí)——最小二乘法擬合曲線、正則化 機(jī)器學(xué)習(xí)——使用樸素貝葉斯分類器實(shí)現(xiàn)垃圾郵件檢測(python代碼+數(shù)據(jù)集) 貝葉斯公式: P ( A ∣ B ) = P ( A ) P ( B ∣ A ) P ( B ) P(A mid B)=frac{P(A) P(B mid A)}{P(B)} P ( A ∣ B ) = P ( B ) P ( A ) P ( B ∣ A )

    2024年02月10日
    瀏覽(29)
  • 基于樸素貝葉斯的垃圾郵件分類Python實(shí)現(xiàn)

    基于樸素貝葉斯的垃圾郵件分類Python實(shí)現(xiàn)

    垃圾郵件的問題一直困擾著人們,傳統(tǒng)的垃圾郵件分類的方法主要有\(zhòng)\\"法\\\"和\\\"校驗(yàn)碼法\\\"等,然而這兩種方法效果并不理想。其中,如果使用的是“”法,垃圾郵件中如果這個(gè)被拆開則可能識別不了,比如,“中獎(jiǎng)”如果被拆成“中 ~~~ 獎(jiǎng)”可能會識別不了。

    2024年02月02日
    瀏覽(23)
  • 機(jī)器學(xué)習(xí)算法——貝葉斯分類器3(樸素貝葉斯分類器)

    機(jī)器學(xué)習(xí)算法——貝葉斯分類器3(樸素貝葉斯分類器)

    基于貝葉斯公式來估計(jì)后驗(yàn)概率P(c|x)的主要困難在于:類條件概率P(x|c)是所有屬性上的聯(lián)合概率,難以從有限的訓(xùn)練樣本直接估計(jì)而得。 為避開這個(gè)障礙,樸素貝葉斯分類器(Naive Bayes classfier)采用了“ 屬性條件獨(dú)立性假設(shè) ”:對已知類別,假設(shè)所有屬性相互獨(dú)立。換句話

    2023年04月22日
    瀏覽(27)
  • 機(jī)器學(xué)習(xí)--樸素貝葉斯分類器

    第1關(guān):條件概率 什么是條件概率 概率指的是某一事件 A 發(fā)生的可能性,表示為 P(A) 。而條件概率指的是某一事件 A 已經(jīng)發(fā)生了條件下,另一事件 B 發(fā)生的可能性,表示為 P(B|A) ,舉個(gè)例子: 今天有 25% 的可能性下雨,即 P(下雨)=0.25 ; 今天 75% 的可能性是晴天,即 P(晴天)=0.7

    2024年02月08日
    瀏覽(18)
  • 機(jī)器學(xué)習(xí)之樸素貝葉斯分類器原理詳解、公式推導(dǎo)(手推)、面試問題、簡單實(shí)例(python實(shí)現(xiàn),sklearn調(diào)包)

    機(jī)器學(xué)習(xí)之樸素貝葉斯分類器原理詳解、公式推導(dǎo)(手推)、面試問題、簡單實(shí)例(python實(shí)現(xiàn),sklearn調(diào)包)

    樸素貝葉斯是一種有監(jiān)督學(xué)習(xí)算法,這種算法基于貝葉斯的一個(gè)樸素的假設(shè)——每對特征和樣本數(shù)據(jù)都是獨(dú)立同分布的。最終可以推出樸素貝葉斯分類器的判定準(zhǔn)則: h n b ( x ) = a r g ? m a x c ∈ Υ ? P ( c ) ∏ i = 1 d P ( x i ? ∣ ? c ) h_{nb}(x)=mathop{arg max}limits_{cin varUpsilon} P(

    2024年02月08日
    瀏覽(22)
  • 機(jī)器學(xué)習(xí)實(shí)驗(yàn) - 樸素貝葉斯分類器

    機(jī)器學(xué)習(xí)實(shí)驗(yàn) - 樸素貝葉斯分類器

    報(bào)告內(nèi)容僅供學(xué)習(xí)參考,請獨(dú)立完成作業(yè)和實(shí)驗(yàn)喔~ 1.1 實(shí)驗(yàn)要求 (1)了解樸素貝葉斯與半樸素貝葉斯的區(qū)別與聯(lián)系,掌握高斯分布、多項(xiàng)式分布和伯努利分布的樸素貝葉斯計(jì)算方法。 (2)編程實(shí)現(xiàn)樸素貝葉斯分類器,基于多分類數(shù)據(jù)集,使用樸素貝葉斯分類器實(shí)現(xiàn)多分類預(yù)

    2024年02月09日
    瀏覽(18)
  • 【機(jī)器學(xué)習(xí)】分類算法 - 樸素貝葉斯 MultinomialNB

    「作者主頁」: 士別三日wyx 「作者簡介」: CSDN top100、阿里云博客專家、華為云享專家、網(wǎng)絡(luò)安全領(lǐng)域優(yōu)質(zhì)創(chuàng)作者 「推薦專欄」: 對網(wǎng)絡(luò)安全感興趣的小伙伴可以關(guān)注專欄《網(wǎng)絡(luò)安全入門到精通》 md5() 可以計(jì)算字符串的 「MD5散列值」 。 語法 參數(shù) $str :需要計(jì)算的字符串

    2024年02月14日
    瀏覽(28)
  • 機(jī)器學(xué)習(xí)筆記07---樸素貝葉斯分類器

    機(jī)器學(xué)習(xí)筆記07---樸素貝葉斯分類器

    貝葉斯決策論是概率框架下實(shí)施決策的基本方法。對分類任務(wù)來說,在所有相關(guān)概率都已知的理想情形下,貝葉斯決策論考慮如何基于這些概率和誤判損失來選擇最優(yōu)的類別標(biāo)記。 ? ? 貝葉斯公式: ?其中,P(c)是類\\\"先驗(yàn)\\\"概率;P(x|c)是樣本x相對于類標(biāo)記c的類條件概率,或稱

    2024年02月07日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包