亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

PHP實現機器學習之樸素貝葉斯算法詳解

2024-05-05 00:01:20
字體:
來源:轉載
供稿:網友

本文實例講述了PHP實現機器學習樸素貝葉斯算法。分享給大家供大家參考,具體如下:

機器學習已經在我們的生活中變得隨處可見了。比如從你在家的時候溫控器開始工作到智能汽車以及我們口袋中的智能手機。機器學習看上去已經無處不在并且是一個非常值得探索的領域。但是什么是機器學習呢?通常來說,機器學習就是讓系統不斷的學習并且對新的問題進行預測。從簡單的預測購物商品到復雜的數字助理預測。

在這篇文章我將會使用樸素貝葉斯算法Clasifier作為一個類來介紹。這是一個簡單易于實施的算法,并且可給出滿意的結果。但是這個算法是需要一點統計學的知識去理解的。在文章的最后部分你可以看到一些實例代碼,甚至自己去嘗試著自己做一下你的機器學習。

起步

那么,這個Classifier是要用來實現什么功能呢?其實它主要是用來判斷給定的語句是積極地還是消極的。比如,“Symfony is the best”是一個積極的語句,“No Symfony is bad”是一個消極的語句。所以在給定了一個語句之后,我想讓這個Classifier在我不給定一個新的規則的情況就返回一個語句類型。

我給Classifier命名了一個相同名稱的類,并且包含一個guess方法。這個方法接受一個語句的輸入,并且會返回這個語句是積極的還是消極的。這個類就像下面這樣:

class Classifier{ public function guess($statement) {}}

我更喜歡使用枚舉類型的類而不是字符串作為我的返回值。我將這個枚舉類型的類命名為Type,并且包含兩個常量:一個POSITIVE,一個NEGATIVE。這兩個常量將會當做guess方法的返回值。

class Type{ const POSITIVE = 'positive'; const NEGATIVE = 'negative';}

初始化工作已經完成,接下來就是要編寫我們的算法進行預測了。

樸素貝葉斯

樸素貝葉斯算法是基于一個訓練集合工作的,根據這個訓練集從而做出相應的預測。這個算法運用了簡單的統計學以及一點數學去進行結果的計算。比如像下面四個文本組成的訓練集合:

語句 類型
Symfony is the best Positive
PhpStorm is great Positive
Iltar complains a lot Negative
No Symfony is bad Negative
 


如果給定語句是“Symfony is the best”,那么你可以說這個語句是積極地。你平常也會根據之前學習到的相應知識做出對應的決定,樸素貝葉斯算法也是同樣的道理:它根據之前的訓練集來決定哪一個類型更加相近。

學習

在這個算法正式工作之前,它需要大量的歷史信息作為訓練集。它需要知道兩件事:每一個類型對應的詞產生了多少次和每一個語句對應的類型是什么。我們在實施的時候會將這兩種信息存儲在兩個數組當中。一個數組包含每一類型的詞語統計,另一個數組包含每一個類型的語句統計。所有的其他信息都可以從這兩個數組中聚合。代碼就像下面的一樣:

function learn($statement, $type){ $words = $this->getWords($statement); foreach ($words as $word) { if (!isset($this->words[$type][$word])) {  $this->words[$type][$word] = 0; } $this->words[$type][$word]++; // 增加類型的詞語統計 } $this->documents[$type]++; // 增加類型的語句統計}

有了這個集合以后,現在這個算法就可以根據歷史數據接受預測訓練了。

定義

為了解釋這個算法是如何工作的,幾個定義是必要的。首先,讓我們定義一下輸入的語句是給定類型中的一個的概率。這個將會表示為P(Type)。它是以已知類型的數據的類型作為分子,還有整個訓練集的數據數量作為分母來得出的。一個數據就是整個訓練集中的一個。到現在為止,這個方法可以將會命名為totalP,像下面這樣:

function totalP($type){ return ($this->documents[$type] + 1) / (array_sum($this->documents) + 1);}

請注意,在這里分子和分母都加了1。這是為了避免分子和分母都為0的情況。

根據上面的訓練集的例子,積極和消極的類型都會得出0.6的概率。每中類型的數據都是2個,一共是4個數據所以就是(2+1)/(4+1)。

第二個要定義的是對于給定的一個詞是屬于哪個確定類型的概率。這個我們定義成P(word,Type)。首先我們要得到一個詞在訓練集中給出確定類型出現的次數,然后用這個結果來除以整個給定類型數據的詞數。這個方法我們定義為p:

function p($word, $type){ $count = isset($this->words[$type][$word]) ? $this->words[$type][$word] : 0; return ($count + 1) / (array_sum($this->words[$type]) + 1);}

在本次的訓練集中,“is”的是積極類型的概率為0.375。這個詞在整個積極的數據中的7個詞中占了兩次,所以結果就是(2+1)/(7+1)。

最后,這個算法應該只關心關鍵詞而忽略其他的因素。一個簡單的方法就是將給定的字符串中的單詞分離出來:

function getWords($string){ return preg_split('//s+/', preg_replace('/[^A-Za-z0-9/s]/', '', strtolower($string)));}

準備工作都做好了,開始真正實施我們的計劃吧!

預測

為了預測語句的類型,這個算法應該計算所給定語句的兩個類型的概率。像上面一樣,我們定義一個P(Type,sentence)。得出概率高的類型將會是Classifier類中算法返回的結果。

為了計算P(Type,sentence),算法當中將用到貝葉斯定理。算法像這樣被定義:P(Type,sentence)= P(Type)* P(sentence,Type)/ P(sentence)。這意味著給定語句的類型概率和給定類型語句概率除以語句的概率的結果是相同的。

那么算法在計算每一個相同語句的P(Tyoe,sentence),P(sentence)是保持一樣的。這意味著算法就可以省略其他因素,我們只需要關心最高的概率而不是實際的值。計算就像這樣:P(Type,sentence) = P(Type)* P(sentence,Type)。

最后,為了計算P(sentence,Type),我們可以為語句中的每個詞添加一條鏈式規則。所以在一條語句中如果有n個詞的話,它將會和P(word_1,Type)* P(word_2,Type)* P(word_3,Type)* .....*P(word_n,Type)是一樣的。每一個詞計算結果的概率使用了我們前面看到的定義。

好了,所有的都說完了,是時候在php中實際操作一下了:

function guess($statement){ $words = $this->getWords($statement); // 得到單詞 $best_likelihood = 0; $best_type = null; foreach ($this->types as $type) { $likelihood = $this->pTotal($type); //計算 P(Type) foreach ($words as $word) {  $likelihood *= $this->p($word, $type); // 計算 P(word, Type) } if ($likelihood > $best_likelihood) {  $best_likelihood = $likelihood;  $best_type = $type; } } return $best_type;}

這就是所有的工作,現在算法可以預測語句的類型了。你要做的就是讓你的算法開始學習:

$classifier = new Classifier();$classifier->learn('Symfony is the best', Type::POSITIVE);$classifier->learn('PhpStorm is great', Type::POSITIVE);$classifier->learn('Iltar complains a lot', Type::NEGATIVE);$classifier->learn('No Symfony is bad', Type::NEGATIVE);var_dump($classifier->guess('Symfony is great')); // string(8) "positive"var_dump($classifier->guess('I complain a lot')); // string(8) "negative"

所有的代碼我已經上傳到了GIT上,https://github.com/yannickl88/blog-articles/blob/master/src/machine-learning-naive-bayes/Classifier.php

github上完整php代碼如下:

<?phpclass Type{ const POSITIVE = 'positive'; const NEGATIVE = 'negative';}class Classifier{ private $types = [Type::POSITIVE, Type::NEGATIVE]; private $words = [Type::POSITIVE => [], Type::NEGATIVE => []]; private $documents = [Type::POSITIVE => 0, Type::NEGATIVE => 0]; public function guess($statement) { $words  = $this->getWords($statement); // get the words $best_likelihood = 0; $best_type = null; foreach ($this->types as $type) {  $likelihood = $this->pTotal($type); // calculate P(Type)  foreach ($words as $word) {  $likelihood *= $this->p($word, $type); // calculate P(word, Type)  }  if ($likelihood > $best_likelihood) {  $best_likelihood = $likelihood;  $best_type = $type;  } } return $best_type; } public function learn($statement, $type) { $words = $this->getWords($statement); foreach ($words as $word) {  if (!isset($this->words[$type][$word])) {  $this->words[$type][$word] = 0;  }  $this->words[$type][$word]++; // increment the word count for the type } $this->documents[$type]++; // increment the document count for the type } public function p($word, $type) { $count = 0; if (isset($this->words[$type][$word])) {  $count = $this->words[$type][$word]; } return ($count + 1) / (array_sum($this->words[$type]) + 1); } public function pTotal($type) { return ($this->documents[$type] + 1) / (array_sum($this->documents) + 1); } public function getWords($string) { return preg_split('//s+/', preg_replace('/[^A-Za-z0-9/s]/', '', strtolower($string))); }}$classifier = new Classifier();$classifier->learn('Symfony is the best', Type::POSITIVE);$classifier->learn('PhpStorm is great', Type::POSITIVE);$classifier->learn('Iltar complains a lot', Type::NEGATIVE);$classifier->learn('No Symfony is bad', Type::NEGATIVE);var_dump($classifier->guess('Symfony is great')); // string(8) "positive"var_dump($classifier->guess('I complain a lot')); // string(8) "negative"

結束語

盡管我們只進行了很少的訓練,但是算法還是應該能給出相對精確的結果。在真實環境,你可以讓機器學習成百上千的記錄,這樣就可以給出更精準的結果。你可以下載查看這篇文章(英文):樸素貝葉斯已經被證明可以給出情緒統計的結果。

而且,樸素貝葉斯不僅僅可以運用到文本類的應用。希望通過這篇文章可以拉近你和機器學習的一點點距離。

原文地址:https://stovepipe.systems/post/machine-learning-naive-bayes

希望本文所述對大家PHP程序設計有所幫助。

 



注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美在线播放| 国产一区二区三区在线播放免费观看| 国产精品久久久久av| 色综合男人天堂| 日韩经典中文字幕在线观看| 亚洲国产天堂久久综合网| 成人午夜在线影院| 日韩大片在线观看视频| 91精品久久久久久久久久入口| 成人网在线免费看| 欧美高清自拍一区| 成人在线免费观看视视频| 国产成人拍精品视频午夜网站| 一个色综合导航| 亚洲另类图片色| 久久免费视频这里只有精品| 日本在线观看天堂男亚洲| 欧美电影《睫毛膏》| 日韩av三级在线观看| 久久久久久18| 久久久国产在线视频| 国产成+人+综合+亚洲欧美丁香花| 欧美日韩在线观看视频| 欧美激情国内偷拍| 国产成人综合久久| 欧美精品18videosex性欧美| 亚洲电影免费观看高清| 色一情一乱一区二区| 日本一区二区不卡| 在线看福利67194| 欧美黑人性视频| 色婷婷综合久久久久中文字幕1| 国内精品久久久久久影视8| 色吧影院999| 亚洲在线免费观看| 欧美成人精品在线| 色婷婷亚洲mv天堂mv在影片| www.xxxx精品| 另类少妇人与禽zozz0性伦| 国产一区二区三区视频在线观看| 日本欧美中文字幕| 欧美成人免费全部| 欧洲成人在线观看| 国产精品亚洲自拍| 中文字幕国产亚洲| 色av吧综合网| 国产成人在线一区| 欧美中文字幕在线视频| 日韩精品在线观| 国产精品成人一区| 国产免费一区视频观看免费| 97超视频免费观看| 成人免费看黄网站| 国产精品高潮呻吟久久av黑人| 成人免费自拍视频| 欧美综合激情网| 欧美区在线播放| 在线激情影院一区| 亚洲精品久久久一区二区三区| 欧美理论片在线观看| 欧美国产第一页| 精品久久在线播放| 亚洲一二三在线| 久久99久国产精品黄毛片入口| 久久久久久久久久婷婷| 91色精品视频在线| 国产日韩欧美视频在线| 欧美一区二区大胆人体摄影专业网站| 成人a在线视频| 久久夜色精品国产欧美乱| 欧美性猛交xxxx乱大交极品| 亚洲在线免费视频| 97视频在线免费观看| 亚洲性视频网站| 欧美成人免费一级人片100| 国产丝袜高跟一区| 久久精品精品电影网| 日韩亚洲精品电影| 日韩一区二区欧美| 亚洲综合视频1区| 亚洲精品视频播放| 国内精品一区二区三区| 亚洲欧美日韩在线一区| 国产成人福利网站| 欧美性生交大片免网| www.日本久久久久com.| 亚洲免费福利视频| 91精品久久久久久| 国产一区二区欧美日韩| 国产精品成人一区| 亚洲一区二区三区乱码aⅴ| 日韩美女视频在线观看| 成人疯狂猛交xxx| 久久久999精品视频| 成人精品久久av网站| 日韩一区二区在线视频| 青青精品视频播放| 亚洲欧洲美洲在线综合| 91美女片黄在线观看游戏| 日韩经典中文字幕| 中文字幕日韩av综合精品| 久久91超碰青草是什么| 亚洲aaa激情| 亚洲男女性事视频| 日韩精品在线观看一区| 中文在线资源观看视频网站免费不卡| 精品自拍视频在线观看| 一区二区欧美久久| 91免费视频网站| 91亚洲国产成人精品性色| 国产亚洲成av人片在线观看桃| 欧美日韩裸体免费视频| 91美女片黄在线观看游戏| 黄色成人在线播放| 日韩欧美国产激情| 日韩在线观看免费网站| 国产欧美婷婷中文| 亚洲欧美精品中文字幕在线| 久久中文久久字幕| 欧美性生交xxxxx久久久| 国产精品久久久久久久久久99| 国产欧美精品一区二区三区介绍| 国产精品福利无圣光在线一区| www.亚洲免费视频| 中文字幕在线国产精品| 欧美整片在线观看| 日韩亚洲一区二区| 成人免费视频在线观看超级碰| 一区二区亚洲精品国产| 岛国精品视频在线播放| 亚洲欧美精品在线| 538国产精品一区二区免费视频| 日韩欧美在线视频| 国产一区二区久久精品| 久久久久久噜噜噜久久久精品| 亚洲综合日韩中文字幕v在线| 亚洲伊人成综合成人网| 国产精品丝袜久久久久久不卡| 亚洲另类激情图| 青青草国产精品一区二区| 国产欧美一区二区三区视频| 国产视频丨精品|在线观看| 欧美理论片在线观看| 亚洲毛片在线免费观看| 亚洲欧美日韩精品| 欧美亚洲视频在线看网址| 岛国av在线不卡| 久久综合伊人77777尤物| 久久久精品999| 亚洲激情成人网| 国产精品一区久久| 亚洲国产精品推荐| 欧美成人自拍视频| 国产在线久久久| 4438全国亚洲精品在线观看视频| 国产精品久久久久久av下载红粉| 日韩精品在线免费| 亚洲在线第一页| 成人免费看吃奶视频网站| 日韩精品视频免费专区在线播放| 136fldh精品导航福利| 91精品久久久久久久久久入口| 国产午夜精品全部视频在线播放| 欧美性高潮床叫视频|