php-ml est une bibliothèque de machine learning écrite en PHP. Bien que nous sachions que Python ou C++ fournissent davantage de bibliothèques d'apprentissage automatique, en fait, la plupart d'entre elles sont légèrement compliquées et la configuration rend de nombreux novices désespérés. Bien que la bibliothèque d'apprentissage automatique php-ml ne dispose pas d'algorithmes particulièrement avancés, elle possède les algorithmes d'apprentissage automatique, de classification et autres les plus élémentaires. Il suffit à notre petite entreprise de faire de simples analyses de données, prédictions, etc. Dans nos projets, nous devons rechercher la rentabilité et non une efficacité et une précision excessives. Certains algorithmes et bibliothèques semblent très puissants, mais si nous envisageons une mise en ligne rapide et que notre personnel technique n'a aucune expérience en apprentissage automatique, un code et une configuration complexes ralentiront en fait notre projet. Et si nous créons une application simple d'apprentissage automatique, alors le coût d'apprentissage pour l'étude de bibliothèques et d'algorithmes complexes est évidemment un peu élevé. De plus, si le projet rencontre des problèmes étranges, pouvons-nous les résoudre ? Que dois-je faire si mes besoins changent ? Je pense que tout le monde a vécu cette expérience : pendant que je travaillais, le programme a soudainement signalé une erreur et je n'ai pas pu en comprendre la raison. J'ai cherché sur Google ou Baidu et j'ai trouvé une seule question qui remplissait les conditions. Elle a été posée cinq ou dix. il y a des années, puis aucune réponse. . . Il est donc nécessaire de choisir la méthode la plus simple, la plus efficace et la plus rentable. La vitesse de php-ml n'est pas lente (passage rapide à php7), et la précision est également bonne. Après tout, les algorithmes sont les mêmes et php est basé sur c. Ce que les blogueurs n'aiment pas le plus, c'est comparer les performances et la portée des applications entre Python, Java et PHP. Si vous voulez vraiment des performances, veuillez développer en C. Si vous souhaitez vraiment approfondir le champ d'application, veuillez utiliser C ou même assembly. . .
Tout d'abord, si nous voulons utiliser cette bibliothèque, nous devons d'abord la télécharger. Ce fichier de bibliothèque peut être téléchargé depuis github (). Bien entendu, il est plus recommandé d'utiliser composer pour télécharger la bibliothèque et la configurer automatiquement.
Après le téléchargement, nous pouvons jeter un œil à la documentation de cette bibliothèque. Les documents sont tous des exemples simples. Nous pouvons créer nous-mêmes un fichier et l'essayer. Tous sont faciles à comprendre. Ensuite, testons-le sur des données réelles. L'un des ensembles de données est l'ensemble de données sur les étamines d'Iris, et l'autre est dû à la perte d'enregistrements, donc je ne sais pas de quoi il s'agit. . .
Les données sur les étamines de l'iris sont divisées en trois catégories différentes :
Il reste encore à traiter : Premièrement, le nom de fichier de notre ensemble de données inconnu est data.txt. Cet ensemble de données peut d'abord être dessiné dans un graphique linéaire xy. Par conséquent, nous dessinons d’abord les données originales dans un graphique linéaire. Comme l'axe des x est relativement long, il suffit de voir sa forme approximative :
Le dessin utilise la bibliothèque jpgraph de php, le code est le suivant :
Avec cette image originale à titre de comparaison, étudions ensuite. Nous utilisons LeastSquars en php-ml pour l'apprentissage. Le résultat de notre test doit être enregistré dans un fichier afin que nous puissions établir un tableau de comparaison. Le code d'apprentissage est le suivant : Après cela, nous lisons les données stockées dans le fichier, dessinons un graphique et collons d'abord le rendu final :1 <?php 2 include_once './src/jpgraph.php'; 3 include_once './src/jpgraph_line.php'; 4 5 $g = new Graph(1920,1080);//jpgraph的绘制操作 6 $g->SetScale("textint"); 7 $g->title->Set('data'); 8 9 //文件的处理10 $file = fopen('data.txt','r');11 $labels = array();12 while(!feof($file)){13 $data = explode(' ',fgets($file)); 14 $data[1] = str_replace(',','.',$data[1]);//数据处理,将数据中的逗号修正为小数点15 $labels[(int)$data[0]] = (float)$data[1];//这里将数据以键值的方式存入数组,方便我们根据键来排序16 } 17 18 ksort($labels);//按键的大小排序19 20 $x = array();//x轴的表示数据21 $y = array();//y轴的表示数据22 foreach($labels as $key=>$value){23 array_push($x,$key);24 array_push($y,$value);25 }26 27 28 $linePlot = new LinePlot($y);29 $g->xaxis->SetTickLabels($x); 30 $linePlot->SetLegend('data');31 $g->Add($linePlot);32 $g->Stroke();
1 <?php 2 require 'vendor/autoload.php'; 3 4 use Phpml\Regression\LeastSquares; 5 use Phpml\ModelManager; 6 7 $file = fopen('data.txt','r'); 8 $samples = array(); 9 $labels = array();10 $i = 0;11 while(!feof($file)){12 $data = explode(' ',fgets($file));13 $samples[$i][0] = (int)$data[0];14 $data[1] = str_replace(',','.',$data[1]);15 $labels[$i] = (float)$data[1];16 $i ++;17 } 18 fclose($file);19 20 $regression = new LeastSquares();21 $regression->train($samples,$labels);22 23 //这个a数组是根据我们对原数据处理后的x值给出的,做测试用。24 $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];25 for($i = 0; $i < count($a); $i ++){26 file_put_contents("putput.txt",($regression->predict([$a[$i]]))."\n",FILE_APPEND); //以追加的方式存入文件 27 }
可以发现,图形出入还是比较大的,尤其是在图形锯齿比较多的部分。不过,这毕竟是40组数据,我们可以看出,大概的图形趋势是吻合的。一般的库在做这种学习时,数据量低的情况下,准确度都非常低。要达到比较高的精度,需要大量的数据,万条以上的数据量是必要的。如果达不到这个数据要求,那我们使用任何库都是徒劳的。所以,机器学习的实践中,真正难的不在精度低、配置复杂等技术问题,而是数据量不够,或者质量太低(一组数据中无用的数据太多)。在做机器学习之前,对数据的预先处理也是必要的。
接下来,我们来对花蕊数据进行测试。一共三种分类,由于我们下载到的是csv数据,所以我们可以使用php-ml官方提供的操作csv文件的方法。而这里是一个分类问题,所以我们选择库提供的SVC算法来进行分类。我们把花蕊数据的文件名定为Iris.csv,代码如下:
1 <?php 2 require 'vendor/autoload.php'; 3 4 use Phpml\Classification\SVC; 5 use Phpml\SupportVectorMachine\Kernel; 6 use Phpml\Dataset\CsvDataset; 7 8 $dataset = new CsvDataset('Iris.csv' , 4, false); 9 $classifier = new SVC(Kernel::LINEAR,$cost = 1000);10 $classifier->train($dataset->getSamples(),$dataset->getTargets());11 12 echo $classifier->predict([$argv[1],$argv[2],$argv[3],$argv[4]]);//$argv是命令行参数,调试这种程序使用命令行较方便
是不是很简单?短短12行代码就搞定了。接下来,我们来测试一下。根据我们上面贴出的图,当我们输入5 3.3 1.4 0.2的时候,输出应该是Iris-setosa。我们看一下:
看,至少我们输入一个原来就有的数据,得到了正确的结果。但是,我们输入原数据集中没有的数据呢?我们来测试两组:
由我们之前贴出的两张图的数据看,我们输入的数据在数据集中并不存在,但分类按照我们初步的观察来看,是合理的。
所以,这个机器学习库对于大多数的人来说,都是够用的。而大多数鄙视这个库鄙视那个库,大谈性能的人,基本上也不是什么大牛。真正的大牛已经忙着捞钱去了,或者正在做学术研究等等。我们更多的应该是掌握算法,了解其中的道理和玄机,而不是夸夸其谈。当然,这个库并不建议用在大型项目上,只推荐小型项目或者个人项目等。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!