精品一区二区久久_亚洲高清av在线_久久久久亚洲综合_可以免费看av的网站_91久久精品国产91久久_亚洲国产无_国产精品一区二区三区在线

全國服務熱線:

0416-3905144
當前位置:首頁 > 新聞中心 > 行業新聞

JS簡單實現樸素貝葉斯分類器

瀏覽: 發布日期:2024/3/2 14:28:26

首先放代碼

function NB(data) {
    this.fc = {}; //記錄特征的數量 feature conut 例如 {a:{yes:5,no:2},b:{yes:1,no:6}}
    this.cc = {}; //記錄分類的數量 category conut 例如 {yes:6,no:8} }NB.prototype = {
    infc(w, cls) { //插入新特征值
        if (!this.fc[w]) this.fc[w] = {};
        if (!this.fc[w][cls]) this.fc[w][cls] = 0;
        this.fc[w][cls] += 1;
    },
    incc(cls) { //插入新分類
        if (!this.cc[cls]) this.cc[cls] = 0;
        this.cc[cls] += 1;
    },
    allco() { //計算分類總數 all count
        var t = 0;
        for (var k in this.cc) t += this.cc[k];
        return t;
    },
    fprob(w, ct) { //特征標識概率   
        if (Object.keys(this.fc).indexOf(w) >= 0) {
            if (Object.keys(this.fc[w]).indexOf(ct) < 0) {
                this.fc[w][ct] = 0
            }
            var c = parseFloat(this.fc[w][ct]);
            return c / this.cc[ct];
        } else {
            return 0.0;
        }
    },
    cprob(c) { //分類概率
        return parseFloat(this.cc[c] / this.allco());
    },
    train(data, cls) { //參數:學習的Array,標識類型(Yes|No)
        for (var w of data) this.infc(String(w), cls);
        this.incc(cls);
    },
    test(data) {
        var ccp = {}; //P(類別)
        var fccp = {}; //P(特征|類別)
        for (var k in this.cc) ccp[k] = this.cprob(k);
        for (var i of data) {
            i = String(i);
            if (!i) continue;
            if (Object.keys(this.fc).indexOf(i)) {
                for (var k in ccp) {
                    if (!fccp[k]) fccp[k] = 1;
                    fccp[k] *= this.fprob(i, k); //P(特征1|類別1)*P(特征2|類別1)*P(特征3|類別1)...
                }
            }
        }
        var tmpk = "";
        for (var k in ccp) {
            ccp[k] = ccp[k] * fccp[k];
            if (!tmpk) tmpk = k;
            if (ccp[k] > ccp[tmpk]) tmpk = k;
        }
        return tmpk;
    }};


1.學習(train)功能

學習功能非常簡單,只是將學習的數據進行統計
代碼實現你可以查看代碼中的train函數

假設,某個醫院早上收了六個門診病人:

癥狀職業疾病
打噴嚏護士感冒
打噴嚏農夫過敏
頭痛建筑工人腦震蕩
頭痛建筑工人感冒
打噴嚏教師感冒
頭痛教師腦震蕩

我們先統計記錄這些信息數據:

var nb = new NB();var data=[
               {d:["打噴嚏","護士"],c:"感冒"},
               {d:["打噴嚏","農夫"],c:"過敏"},
               {d:["頭痛","建筑工人"],c:"腦震蕩"},
               {d:["頭痛","建筑工人"],c:"感冒"},
               {d:["打噴嚏","教師"],c:"感冒"},
               {d:["頭痛","教師"],c:"腦震蕩"},];
 for(var i of data){
    nb.train(i.d, i.c);}


統計結果:

2.預測(test)功能   

預測功能就要用到樸素貝葉斯算法
首先來看,貝葉斯公式:

可能你看不懂公式或看懂公式不知道公式怎么用
那我來簡單的翻譯一下:
P( Category |Feature) = P ( Feature | Category ) * P( Category)/ P(Feature) 

其實也是就是:
P(類別|特征)=P(特征|類別)*P(類別)/p(特征)

所以我們只要計算以下數據即可:

P(特征|類別)
P(類別)
p(特征)

假設兩個類別,分別是類別1,與類別2
那么類別總次數就是兩個類別出現次數總和
加上可能我們輸入的特征有多個假設就3個把那么也簡單:


P((特征1、特征2、特征3)|類別1)= P(特征1|類別1)*P(特征2|類別1)*P(特征3|類別1) P(類別1)=類別1的次數/(類別總數)P(特征1、特征2、特征3)=P(特征1)*P(特征2)*P(特征3)

因為根據公式我們知道:


P(類別1|特征)=P(特征|類別1)*P(類別1)/p(特征)P(類別2|特征)=P(特征|類別2)*P(類別2)/p(特征)

剛好p(特征)為分母所以如果比較P(類別1|特征)P(類別2|特征)的概率
只要比較P(特征|類別1)*P(類別1)P(特征|類別2)*P(類別2)的大小就行了

代碼實現查看代碼部分的test函數

3.測試數據

在已經學習了

我們預測一下打噴嚏的建筑工人是生了什么病

結果是感冒


性別身高(英尺)體重(磅)腳掌(英寸)
618012
5.9219011
5.5817012
5.9216510
616510
5.721649
51006
5.51508
5.421307
5.751509


預測性別示例:



中文臟話測試

function defaultTokenizer(text) {
    // 僅保留英文、中文、數字
    var rgxPunctuation = /[^(a-zA-ZA-Яa-я\u4e00-\u9fa50-9_)+\s]/g;
    // 英文以空格分詞,中文不分詞,以單個字為單位
    return text.replace(rgxPunctuation, ' ').replace(/[\u4e00-\u9fa5]/g, function(word) {
        return word + ' ';
    }).split(/\s+/);
};
// 中文測試
nb.train(defaultTokenizer('我的名字叫司馬萌.'), '正常')
nb.train(defaultTokenizer('沒什么,就是一道測試程序!!'), '正常')
nb.train(defaultTokenizer('不要皺眉,即使在傷心的時刻,因為你從不知道有誰會醉心于你的笑容。'), '正常')
nb.train(defaultTokenizer('去只是一種姿勢,得到并不等同于幸福。'), '正常')
nb.train(defaultTokenizer('理和美女都是赤裸裸的。'), '正常')
nb.train(defaultTokenizer('們看錯了這個世界,卻說世界欺騙了我們。'), '正常')
nb.train(defaultTokenizer('們人這一輩子不是別人的楷模,就是別人的借鑒。'), '正常')
nb.train(defaultTokenizer('萬別說直到永遠,因為你壓根不知道永遠有多遠。'), '正常')
nb.train(defaultTokenizer('些無法復制的浪漫,只能在回憶里慢慢變淡。'), '正常')
nb.train(defaultTokenizer('調是永恒的美德,缺心眼的話就要學會沉默。'), '正常')
nb.train(defaultTokenizer('用什么優勢贏得人生,就會用同樣的原因輸掉人生。'), '正常')
nb.train(defaultTokenizer('人最可悲的是,有自由的思想,卻沒有沖破羈絆的勇氣。'), '正常')
nb.train(defaultTokenizer('愛情就像倆個拉著橡皮筋的人,受傷的總是不愿意放手的那一個。'), '正常')
nb.train(defaultTokenizer('人生的經歷就像鉛筆一樣…開始很尖…經歷的多了也就變得圓滑了…如果承受不了就會斷了。'), '正常')
nb.train(defaultTokenizer('在你往上爬的時候,一定要保持梯子的整潔,否則你下來時可能會滑倒。'), '正常')
nb.train(defaultTokenizer('人生是沒有窮盡的,所以也就沒有什么所謂的歸宿。'), '正常')
nb.train(defaultTokenizer('幸福是因為你看到別人的不幸,不幸是因為你只看到別人的幸福。'), '正常')
nb.train(defaultTokenizer('我們的安全感,來自于充分體驗不安全感。'), '正常')
nb.train(defaultTokenizer('男人最大的武器是眼神,女人最大的武器是眼淚。'), '正常')
nb.train(defaultTokenizer('心清如水即是佛,了無牽掛佛無邊。'), '正常')
nb.train(defaultTokenizer('人活著為了什么?答案:一個念想。'), '正常')
nb.train(defaultTokenizer('有些事遇見了就無法放手,有些事放開了手就不必再回首。'), '正常')
nb.train(defaultTokenizer('我操,你他媽咋回事!!'), '臟話')
nb.train(defaultTokenizer('你他媽整個腦殘了,不惜拿自己的父母家人來騙別人的精液。!!'), '臟話')
nb.train(defaultTokenizer('跟一個你視為他為狗的人將素質,你真心逗B,腦子也秀逗了吧!'), '臟話')
nb.train(defaultTokenizer('賤人的生活方式就是,只許自己吃屎,不許別人放屁。'), '臟話')
nb.train(defaultTokenizer('你爹有點多,我忍不住笑了下,不好意思啊,你不要去想你那悲傷的母親。'), '臟話')
nb.train(defaultTokenizer('我們罵不罵關你個婊子什么事,草你嗎的瞎眼白內脹!'), '臟話')
nb.train(defaultTokenizer('你他媽那么喜歡被人擦,我想說我退出我不喜歡獸交。'), '臟話')
nb.train(defaultTokenizer('我只是你祖宗而已,你怎么可以這樣,你個傻逼怎么能把你祖宗都忘記了?'), '臟話')
nb.train(defaultTokenizer('你要是不扒一扒臉皮,我還真不曉得原來你的臉皮如此的厚呢!'), '臟話')
nb.train(defaultTokenizer('對不起哈,當年老子我沒忍住,一個屁把這二逼給蹦出來了!'), '臟話')
nb.train(defaultTokenizer('你是腦子有病還是怎么?你以為你是誰?不就是傻逼一個嘛!'), '臟話')
nb.train(defaultTokenizer('整天把逼臉擺給別人看,是想要告訴別人你是黃世仁他媽嗎?'), '臟話')
nb.train(defaultTokenizer('你是不是每次拉完屎,然后又自己舔干凈了,還到處炫耀自己拉屎很香。'), '臟話')
nb.train(defaultTokenizer('你媽是靠賣逼把你養大的吧,到你這代還能繼續賣逼,真的是母業女繼承啊。'), '臟話')
nb.train(defaultTokenizer('難道你是吃大姨媽拌飯長大的,怪不得長那么惡心呢!'), '臟話')
nb.train(defaultTokenizer('操你媽,日子那么難過像被人強奸了,但是經典他媽說與其掙扎不如學會享受!'), '臟話')
nb.train(defaultTokenizer('就你那鳥樣還整得跟個吉娃娃賣燒烤串似得,重口味賣得都是巨根火腿吧。'), '臟話')
nb.train(defaultTokenizer('你大哥拉破車、一直拉到耗子窩、耗子給你兩塊糖、你管耗子叫大娘。'), '臟話')
nb.train(defaultTokenizer('就你這樣子不好好讀書,以后做雞都沒人敢要!'), '臟話')
nb.train(defaultTokenizer('看你這尖嘴猴腮樣,長的那么丑還每天學人家自拍,太惡心人了。'), '臟話')
console.log('預期:臟話,實際:', nb.test(defaultTokenizer('我操')));
console.log('預期:正常,實際:', nb.test(defaultTokenizer('還沒使用中文分詞就分的這么棒')));
console.log('預期:臟話,實際:', nb.test(defaultTokenizer('你大爺的吧'))); // 臟話
console.log('預期:臟話,實際:', nb.test(defaultTokenizer('你丫有病吧'))); // 臟話
console.log('預期:正常,實際:', nb.test(defaultTokenizer('媽媽,我餓了'))); // 正常
console.log('預期:正常,實際:', nb.test(defaultTokenizer('馬克思主義')));





英文臟話測試


function defaultTokenizer(text) {

    // 僅保留英文、中文、數字

    var rgxPunctuation = /[^(a-zA-ZA-Яa-я\u4e00-\u9fa50-9_)+\s]/g;

    // 英文以空格分詞,中文不分詞,以單個字為單位

    return text.replace(rgxPunctuation, ' ').replace(/[\u4e00-\u9fa5]/g, function(word) {

        return word + ' ';

    }).split(/\s+/);

};

// 英文學習

// positive

nb.train(defaultTokenizer('What is your name?'), 'positive');

nb.train(defaultTokenizer('amazing, awesome movie!! Yeah!! Oh boy.'), 'positive');

nb.train(defaultTokenizer('Sweet, this is incredibly, amazing, perfect, great!!'), 'positive');

nb.train(defaultTokenizer('Do one thing at a time, and do well.'), 'positive');

nb.train(defaultTokenizer('Never forget to say “thanks”.'), 'positive');

nb.train(defaultTokenizer('Believe in yourself.'), 'positive');

nb.train(defaultTokenizer('Never put off what you can do today until tomorrow.'), 'positive');

nb.train(defaultTokenizer('Do not aim for success if you want it; just do what you love and believe in, and it will come naturally.'), 'positive');

nb.train(defaultTokenizer('Whatever is worth doing is worth doing well.'), 'positive');

nb.train(defaultTokenizer('Keep on going never give up.'), 'positive');

// foul

nb.train(defaultTokenizer('Get out !Beat it! Get lost!'), 'foul');

nb.train(defaultTokenizer('Go to hell! Go to the devil!'), 'foul');

nb.train(defaultTokenizer('Oh, hell is bells!'), 'foul');

nb.train(defaultTokenizer('You SOB (son of a)!'), 'foul');

nb.train(defaultTokenizer('You damned (disgusting) bastard!'), 'foul');

nb.train(defaultTokenizer('Idiot! You damned fool!'), 'foul');

nb.train(defaultTokenizer('Disgusting!'), 'foul');

nb.train(defaultTokenizer('I will see you in hell first!'), 'foul');

nb.train(defaultTokenizer('FUCK Fuck fuck'), 'foul');

nb.train(defaultTokenizer('You pig!'), 'foul');

nb.train(defaultTokenizer('God damn !'), 'foul');

nb.train(defaultTokenizer('Whore! Slut!'), 'foul');

nb.train(defaultTokenizer('You hypocrite!'), 'foul');

nb.train(defaultTokenizer('You ass licker (kisser)!'), 'foul');

// 判斷分類

console.log('預期:positive,實際:', nb.test(defaultTokenizer('My name is Surmon.')));

console.log('預期:positive,實際:', nb.test(defaultTokenizer('awesome, cool, amazing!! Yay.')));

console.log('預期:foul,實際:', nb.test(defaultTokenizer('get out!!!')));

console.log('預期:foul,實際:', nb.test(defaultTokenizer('Fuck!')));

?著作權歸作者所有,轉載或內容合作請聯系作者

作者:關愛單身狗成長協會

鏈接:https://www.jianshu.com/p/5d3ea4051f67

來源:簡書

版權所有?2014-2023 錦州辰碩家電維修中心 技術支持:13840665804 電話:0416-3905144 地址:錦州市古塔區中央大街26號
ICP備案/許可證號:遼ICP備2023002984號-2

主站蜘蛛池模板: www视频在线观看 | 欧美亚洲国产激情一区二区 | 亚欧乱色一区二区三区 | 99精品日韩 | 久久vs国产综合色大全 | 天天摸夜班摸天天碰 | 欧美区在线 | 国产区高清 | a性视频| 亚洲天堂视频在线观看免费 | 男女在线网站 | 欧美午夜色视频国产精品 | 人人添人人澡人人澡人人人人 | 亚洲一级毛片免费在线观看 | 国产精品偷伦视频播放 | 韩国最新三级网站在线播放 | 九九九好热在线 | 中日韩视频在线观看 | 国产成人精品aaaa视频一区 | 国产免费91 | 人人草人人干 | 日本在线视频一区二区 | 亚洲欧洲日本在线观看 | 99精品视频在线免费观看 | 欧美人bbbwww| 久久三级视频 | 久草国产在线观看 | 免费一区二区三区免费视频 | 秋月爱莉在线观看无修版 | 蜜柚视频在线看2019 | 欧美视频精品一区二区三区 | 久久毛片视频 | 日本免费人成黄页在线观看视频 | 99re在线视频 | 欧美性bbbbbbsbbbbbb | 日日爱网站 | 欧美精品三区 | 97香蕉 | 日毛片| 欧美网站在线 | 日本69视频 |