Heim > Artikel > Backend-Entwicklung > Detaillierte Erklärung des Naive Bayes-Algorithmus für maschinelles Lernen in PHP
Dieser Artikel stellt hauptsächlich den Naive-Bayes-Algorithmus für maschinelles Lernen in PHP vor. Er analysiert die Konzepte, Prinzipien und PHP-Implementierungstechniken des Naive-Bayes-Algorithmus im Detail mit Beispielen.
Das Beispiel in diesem Artikel beschreibt die Implementierung des Naive Bayes-Algorithmus für maschinelles Lernen in PHP. Teilen Sie es als Referenz mit allen. Die Einzelheiten lauten wie folgt:
Maschinelles Lernen ist in unserem Leben allgegenwärtig geworden. Alles vom Thermostat, der zu Hause funktioniert, bis hin zu intelligenten Autos und den Smartphones in unseren Taschen. Maschinelles Lernen scheint allgegenwärtig zu sein und es lohnt sich, es zu erkunden. Aber was ist maschinelles Lernen? Im Allgemeinen geht es beim maschinellen Lernen darum, dem System zu ermöglichen, kontinuierlich zu lernen und neue Probleme vorherzusagen. Von einfachen Vorhersagen von Einkaufsartikeln bis hin zu komplexen Vorhersagen digitaler Assistenten.
In diesem Artikel werde ich den Naive Bayes-Algorithmus Clasifier als Klasse vorstellen. Dies ist ein einfacher Algorithmus, der leicht zu implementieren ist und zufriedenstellende Ergebnisse liefert. Um diesen Algorithmus zu verstehen, sind jedoch einige statistische Kenntnisse erforderlich. Im letzten Teil des Artikels können Sie einige Beispielcodes sehen und sogar versuchen, Ihr eigenes maschinelles Lernen durchzuführen.
Erste Schritte
Welche Funktion wird also mit diesem Klassifikator erreicht? Tatsächlich wird es hauptsächlich verwendet, um festzustellen, ob eine bestimmte Aussage positiv oder negativ ist. Beispielsweise ist „Symfony ist das Beste“ eine positive Aussage und „Kein Symfony ist schlecht“ eine negative Aussage. Nachdem ich eine Anweisung gegeben habe, möchte ich, dass dieser Klassifikator einen Anweisungstyp zurückgibt, ohne eine neue Regel anzugeben.
Ich habe Classifier eine gleichnamige Klasse genannt und eine Schätzmethode eingefügt. Diese Methode akzeptiert eine Anweisung als Eingabe und gibt zurück, ob die Anweisung positiv oder negativ ist. Die Klasse sieht so aus:
class Classifier { public function guess($statement) {} }
Ich bevorzuge die Verwendung von Aufzählungsklassen anstelle von Zeichenfolgen für meine Rückgabewerte. Ich habe die Klasse dieses Aufzählungstyps Type genannt und sie enthält zwei Konstanten: eine POSITIVE und eine NEGATIVE. Diese beiden Konstanten werden als Rückgabewert der Schätzmethode verwendet.
class Type { const POSITIVE = 'positive'; const NEGATIVE = 'negative'; }
Die Initialisierungsarbeiten sind abgeschlossen und der nächste Schritt besteht darin, unseren Algorithmus für die Vorhersage zu schreiben.
Naive Bayes
Der Naive Bayes-Algorithmus arbeitet auf Basis eines Trainingssatzes und trifft entsprechende Vorhersagen auf Basis dieses Trainingssatzes. Dieser Algorithmus verwendet einfache Statistiken und ein wenig Mathematik, um die Ergebnisse zu berechnen. Das Trainingsset besteht beispielsweise aus den folgenden vier Texten:
语句 | 类型 |
Symfony ist das Beste | Positiv |
PhpStorm ist großartig | Positiv |
Iltar klagt viel | Negativ |
Kein Symfony ist schlecht | Negativ |
如果给定语句是“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代码如下:
[], 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
Beispielerklärung der Operation zum Umdrehen einer einzelnen verknüpften Liste in PHP
PHP-Implementierung Erläuterung der Methode zum Zusammenführen zweier geordneter Arrays
Detaillierte Erläuterung der Methode zur Implementierung des Joseph-Ring-Problems in PHP
Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung des Naive Bayes-Algorithmus für maschinelles Lernen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!