Heim  >  Artikel  >  Backend-Entwicklung  >  Einfaches Testen und Nutzungsfreigabe von PHP-ML

Einfaches Testen und Nutzungsfreigabe von PHP-ML

小云云
小云云Original
2018-02-07 10:24:272452Durchsuche

php-ml ist eine in PHP geschriebene Bibliothek für maschinelles Lernen. Obwohl wir wissen, dass Python oder C++ mehr Bibliotheken für maschinelles Lernen bieten, sind die meisten davon tatsächlich etwas kompliziert und die Konfiguration lässt viele Anfänger hoffnungslos erscheinen. Dieser Artikel stellt Ihnen hauptsächlich eine einfache Test- und Verwendungsmethode der PHP-Bibliothek für maschinelles Lernen php-ml vor. Der Herausgeber findet es ziemlich gut, deshalb teile ich es jetzt mit Ihnen und gebe es als Referenz. Folgen wir dem Herausgeber, um einen Blick darauf zu werfen. Ich hoffe, es kann allen helfen.

Obwohl die Bibliothek für maschinelles Lernen php-ml nicht über besonders fortschrittliche Algorithmen verfügt, verfügt sie über die grundlegendsten Algorithmen für maschinelles Lernen, Klassifizierung und andere. Unser kleines Unternehmen kann einige einfache Datenanalysen, Vorhersagen usw. durchführen . Wir streben bei unseren Projekten nach Wirtschaftlichkeit, nicht nach übermäßiger Effizienz und Präzision. Einige Algorithmen und Bibliotheken sehen sehr leistungsfähig aus, aber wenn wir erwägen, schnell online zu gehen und unsere technischen Mitarbeiter keine Erfahrung mit maschinellem Lernen haben, werden komplexer Code und komplexe Konfigurationen unser Projekt tatsächlich in die Länge ziehen. Und wenn wir eine einfache Anwendung für maschinelles Lernen erstellen, sind die Lernkosten für das Studium komplexer Bibliotheken und Algorithmen offensichtlich etwas hoch. Können wir diese außerdem lösen, wenn das Projekt auf seltsame Probleme stößt? Was soll ich tun, wenn sich meine Bedürfnisse ändern? Ich glaube, jeder hat diese Erfahrung gemacht: Während der Arbeit meldete das Programm plötzlich einen Fehler, und ich konnte den Grund nicht herausfinden. Ich habe bei Google oder Baidu nur eine Frage gefunden, die die Bedingungen erfüllte vor Jahren, und dann keine Antwort. . .

Daher ist es notwendig, die einfachste, effizienteste und kostengünstigste Methode zu wählen. Die Geschwindigkeit von PHP-ML ist nicht langsam (wechseln Sie schnell zu PHP7) und die Genauigkeit ist auch gut. Schließlich sind die Algorithmen dieselben und PHP basiert auf c. Was Bloggern am wenigsten gefällt, ist der Vergleich der Leistung und des Anwendungsbereichs zwischen Python, Java und PHP. Wenn Sie wirklich Leistung wollen, entwickeln Sie bitte in C. Wenn Sie den Anwendungsbereich wirklich verfolgen möchten, verwenden Sie bitte C oder sogar Assembly. . .

Wenn wir diese Bibliothek nutzen möchten, müssen wir sie zunächst herunterladen. Diese Bibliotheksdatei kann von Github (https://github.com/php-ai/php-ml) heruntergeladen werden. Natürlich ist es empfehlenswerter, Composer zu verwenden, um die Bibliothek herunterzuladen und automatisch zu konfigurieren.

Nach dem Herunterladen können wir einen Blick auf die Dokumentation dieser Bibliothek werfen. Bei den Dokumenten handelt es sich um einige einfache Beispiele. Wir können selbst eine Datei erstellen und ausprobieren. Alle sind leicht zu verstehen. Als nächstes testen wir es anhand tatsächlicher Daten. Einer der Datensätze ist der Datensatz der Iris-Staubgefäße, der andere ist auf den Verlust von Aufzeichnungen zurückzuführen, sodass ich nicht weiß, worum es bei den Daten geht. . .

Iris-Staubblattdaten haben drei verschiedene Kategorien:

Unbekannter Datensatz, der Dezimalpunkt ist als Komma markiert, daher bei der Berechnung noch erforderlich Zu verarbeiten:

Befassen wir uns zunächst mit dem unbekannten Datensatz. Erstens lautet der Dateiname unseres unbekannten Datensatzes data.txt. Und dieser Datensatz kann zunächst einfach in ein x-y-Liniendiagramm gezeichnet werden. Daher zeichnen wir zunächst die Originaldaten in ein Liniendiagramm ein. Da die x-Achse relativ lang ist, müssen wir nur ihre grobe Form sehen:

Zeichnung verwendet die jpgraph-Bibliothek von PHP, der Code lautet wie folgt:

<?php
include_once &#39;./src/jpgraph.php&#39;;
include_once &#39;./src/jpgraph_line.php&#39;;

$g = new Graph(1920,1080);//jpgraph的绘制操作
$g->SetScale("textint");
$g->title->Set('data');

//文件的处理
$file = fopen('data.txt','r');
$labels = array();
while(!feof($file)){
 $data = explode(' ',fgets($file));  
 $data[1] = str_replace(',','.',$data[1]);//数据处理,将数据中的逗号修正为小数点
 $labels[(int)$data[0]] = (float)$data[1];//这里将数据以键值的方式存入数组,方便我们根据键来排序
} 

ksort($labels);//按键的大小排序

$x = array();//x轴的表示数据
$y = array();//y轴的表示数据
foreach($labels as $key=>$value){
 array_push($x,$key);
 array_push($y,$value);
}


$linePlot = new LinePlot($y);
$g->xaxis->SetTickLabels($x); 
$linePlot->SetLegend('data');
$g->Add($linePlot);
$g->Stroke();

Da wir nun dieses Originalbild zum Vergleich haben, schauen wir uns es als nächstes an. Wir verwenden LeastSquars in PHP-ML zum Lernen. Die Ausgabe unseres Tests muss in einer Datei gespeichert werden, damit wir ein Vergleichsdiagramm erstellen können. Der Lerncode lautet wie folgt:

<?php
 require &#39;vendor/autoload.php&#39;;

 use Phpml\Regression\LeastSquares;
 use Phpml\ModelManager;

 $file = fopen(&#39;data.txt&#39;,&#39;r&#39;);
 $samples = array();
 $labels = array();
 $i = 0;
 while(!feof($file)){
  $data = explode(&#39; &#39;,fgets($file));
  $samples[$i][0] = (int)$data[0];
  $data[1] = str_replace(&#39;,&#39;,&#39;.&#39;,$data[1]);
  $labels[$i] = (float)$data[1];
  $i ++;
 } 
 fclose($file);

 $regression = new LeastSquares();
 $regression->train($samples,$labels);

 //这个a数组是根据我们对原数据处理后的x值给出的,做测试用。
 $a = [0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,29,30,31,37,40,41,45,48,53,55,57,60,61,108,124];
 for($i = 0; $i < count($a); $i ++){
  file_put_contents("putput.txt",($regression->predict([$a[$i]]))."\n",FILE_APPEND); //以追加的方式存入文件  
 }

Danach lesen wir die in der Datei gespeicherten Daten aus, zeichnen ein Diagramm und fügen zunächst das endgültige Rendering ein:

Der Code lautet wie folgt:

<?php
include_once &#39;./src/jpgraph.php&#39;;
include_once &#39;./src/jpgraph_line.php&#39;;

$g = new Graph(1920,1080);
$g->SetScale("textint");
$g->title->Set('data');

$file = fopen('putput.txt','r');
$y = array();
$i = 0;
while(!feof($file)){
 $y[$i] = (float)(fgets($file));
 $i ++;   
} 

$x = [0,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,26,27,29,30,31,37,40,41,45,48,53,55,57,60,61,108,124];

$linePlot = new LinePlot($y);
$g->xaxis->SetTickLabels($x); 
$linePlot->SetLegend('data');
$g->Add($linePlot);
$g->Stroke();

Es kann festgestellt werden, dass die Grafikdiskrepanz immer noch relativ groß ist, insbesondere in den Teilen mit stärker gezackten Grafiken. Allerdings sind es immerhin 40 Datensätze, und wir können sehen, dass die allgemeinen grafischen Trends konsistent sind. Wenn allgemeine Bibliotheken diese Art des Lernens durchführen, ist die Genauigkeit sehr gering, wenn die Datenmenge gering ist. Um eine relativ hohe Genauigkeit zu erreichen, ist eine große Datenmenge erforderlich, und zwar mehr als 10.000 Daten. Wenn dieser Datenbedarf nicht erfüllt werden kann, ist jede von uns genutzte Bibliothek vergebens. Daher liegt die eigentliche Schwierigkeit in der Praxis des maschinellen Lernens nicht in technischen Problemen wie geringer Genauigkeit und komplexer Konfiguration, sondern in unzureichendem Datenvolumen oder zu geringer Qualität (zu viele nutzlose Daten in einem Datensatz). Vor dem maschinellen Lernen ist auch eine Vorverarbeitung der Daten erforderlich.

Als nächstes testen wir die Staubblattdaten. Insgesamt gibt es drei Kategorien. Da wir CSV-Daten heruntergeladen haben, können wir die offizielle Methode zum Betrieb von CSV-Dateien verwenden, die von PHP-ML bereitgestellt wird. Da es sich um ein Klassifizierungsproblem handelt, wählen wir für die Klassifizierung den von der Bibliothek bereitgestellten SVC-Algorithmus. Wir nennen die Datei mit den Stempeldaten Iris.csv und der Code lautet wie folgt:

<?php
require &#39;vendor/autoload.php&#39;;

use Phpml\Classification\SVC;
use Phpml\SupportVectorMachine\Kernel;
use Phpml\Dataset\CsvDataset;

$dataset = new CsvDataset(&#39;Iris.csv&#39; , 4, false);
$classifier = new SVC(Kernel::LINEAR,$cost = 1000);
$classifier->train($dataset->getSamples(),$dataset->getTargets());

echo $classifier->predict([$argv[1],$argv[2],$argv[3],$argv[4]]);//$argv是命令行参数,调试这种程序使用命令行较方便

是不是很简单?短短12行代码就搞定了。接下来,我们来测试一下。根据我们上面贴出的图,当我们输入5 3.3 1.4 0.2的时候,输出应该是Iris-setosa。我们看一下:

看,至少我们输入一个原来就有的数据,得到了正确的结果。但是,我们输入原数据集中没有的数据呢?我们来测试两组:

由我们之前贴出的两张图的数据看,我们输入的数据在数据集中并不存在,但分类按照我们初步的观察来看,是合理的。

所以,这个机器学习库对于大多数的人来说,都是够用的。而大多数鄙视这个库鄙视那个库,大谈性能的人,基本上也不是什么大牛。真正的大牛已经忙着捞钱去了,或者正在做学术研究等等。我们更多的应该是掌握算法,了解其中的道理和玄机,而不是夸夸其谈。当然,这个库并不建议用在大型项目上,只推荐小型项目或者个人项目等。

jpgraph只依赖GD库,所以下载引用之后就可以使用,大量的代码都放在了绘制图形和初期的数据处理上。由于库的出色封装,学习代码并不复杂。需要所有代码或者测试数据集的小伙伴可以留言或者私信等,我提供完整的代码,解压即用。

相关推荐:

PHP机器学习库php-ml的实例教程

Das obige ist der detaillierte Inhalt vonEinfaches Testen und Nutzungsfreigabe von PHP-ML. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn