用PHP實現機器學習 樸素貝葉斯演算法

2021-07-24 22:00:08 字數 3197 閱讀 8031

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

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

那麼,這個classifier是要用來實現什麼功能呢?其實它主要是用來判斷給定的語句是積極地還是消極的。比如,「symfony is the best」是乙個積極的語句,「no symfony is bad」是乙個消極的語句。所以在給定了乙個語句之後,我想讓這個classifier在我不給定乙個新的規則的情況就返回乙個語句型別。

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

class classifier

} 我更喜歡使用列舉型別的類而不是字串作為我的返回值。我將這個列舉型別的類命名為type,並且包含兩個常量:乙個positive,乙個negative。這兩個常量將會當做guess方法的返回值。

class type

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

樸素貝葉斯

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

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

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

function learn($statement, $type)

$this->words[$type][$word]++; // 增加型別的詞語統計 }

$this->documents[$type]++; // 增加型別的語句統計 }

有了這個集合以後,現在這個演算法就可以根據歷史資料接受**訓練了。

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

function totalp($type)

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

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

第二個要定義的是對於給定的乙個詞是屬於哪個確定型別的概率。這個我們定義成p(word,type)。首先我們要得到乙個詞在訓練集中給出確定型別出現的次數,然後用這個結果來除以整個給定型別資料的詞數。這個方法我們定義為p:

function p($word, $type)

在本次的訓練集中,「is」的是積極型別的概率為0.375。這個詞在整個積極的資料中的7個詞中佔了兩次,所以結果就是(2+1)/(7+1)。

function getwords($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)

if ($likelihood > $best_likelihood) }

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上,

機器學習 樸素貝葉斯

樸素貝葉斯原理 1.貝葉斯公式 2.樸素貝葉斯的模型 3.後驗概率最大化的含義 4.樸素貝葉斯的引數估計 4.1.特徵是離散值 假設符合多項式分布 4.2.特徵是稀疏的離散值 假設符合伯努利分布 4.3.特徵是連續值 假設符合正態分佈 5.樸素貝葉斯演算法過程 6.樸素貝葉斯演算法小結 scikit...

機器學習 樸素貝葉斯 例子

一 學習樸素貝葉斯之前先了解一下 條件概率下 貝葉斯公式 1 舉例是兩個工具機m1和m2 用例生產扳手機器 生產扳手 個數 mach1 30mach2 20不合格佔1 defective 機器 次品分布比例 mach1 50 mach2 50 2 問題 mach2生產的不合格產品的概率是多少?p m...

機器學習之樸素貝葉斯

寫在前面 本文寫自初學時,若後續學習過程中有新的理解,將不定期進行更新 若文中敘述有誤,望不吝賜教,也將及時修改 貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。而樸素樸素貝葉斯分類是貝葉斯分類中最簡單,也是常見的一種分類方法。在理解樸素貝葉斯之前,需要對兩個數...