>  기사  >  백엔드 개발  >  PHP 기계 학습 라이브러리 php-ml의 예제 튜토리얼

PHP 기계 학습 라이브러리 php-ml의 예제 튜토리얼

零下一度
零下一度원래의
2018-05-15 15:45:096331검색

php-ml은 PHP로 작성된 머신러닝 라이브러리입니다. Python이나 C++가 더 많은 기계 학습 라이브러리를 제공한다는 것을 알고 있지만 실제로 대부분은 약간 복잡하고 구성으로 인해 많은 초보자가 절망감을 느낍니다. 기계 학습 라이브러리 php-ml에는 특별히 고급 알고리즘이 없지만 가장 기본적인 기계 학습, 분류 및 기타 알고리즘이 포함되어 있어 소규모 회사에서는 간단한 데이터 분석, 예측 등을 수행하기에 충분합니다. 우리 프로젝트에서는 과도한 효율성과 정확성이 아니라 비용 효율성을 추구해야 합니다. 일부 알고리즘과 라이브러리는 매우 강력해 보이지만 빠르게 온라인에 접속하는 것을 고려하고 기술 직원이 기계 학습에 대한 경험이 없다면 복잡한 코드와 구성으로 인해 실제로 프로젝트가 지연될 것입니다. 그리고 간단한 기계 학습 애플리케이션을 만드는 경우 복잡한 라이브러리와 알고리즘을 연구하는 데 드는 학습 비용이 분명히 약간 높습니다. 또한 프로젝트에서 이상한 문제가 발생하면 해결할 수 있습니까? 요구 사항이 변경되면 어떻게 해야 합니까? 누구나 이런 경험을 했을 거라 생각합니다. 작업 중 갑자기 프로그램에서 오류가 발생했는데 이유를 알 수 없었습니다. 구글이나 바이두에서 검색해보니 조건에 맞는 질문이 5~10개 정도 나왔습니다. 몇 년 전, 그리고 답장이 없습니다. . . 따라서 가장 간단하고 효율적이며 비용 효율적인 방법을 선택하는 것이 필요합니다. php-ml 속도도 느리지 않고(php7로 빠르게 변경) 정확도도 좋습니다. 결국 알고리즘은 같고, php는 c를 기반으로 합니다. 블로거가 가장 싫어하는 것은 Python, Java 및 PHP 간의 성능과 응용 프로그램 범위를 비교하는 것입니다. 정말 성능을 원한다면 C로 개발하세요. 정말로 적용 범위를 추구하고 싶다면 C를 사용하거나 심지어 어셈블리를 사용해 보세요. . .

먼저 이 라이브러리를 사용하려면 먼저 다운로드해야 합니다. 이 라이브러리 파일은 github(https://github.com/php-ai/php-ml)에서 다운로드할 수 있습니다. 물론, Composer를 사용하여 라이브러리를 다운로드하고 자동으로 구성하는 것이 더 좋습니다.

다운로드한 후 이 라이브러리의 문서를 살펴볼 수 있습니다. 문서는 몇 가지 간단한 예입니다. 직접 파일을 만들어 사용해 볼 수 있습니다. 모두 이해하기 쉽습니다. 다음으로 실제 데이터를 대상으로 테스트해 보겠습니다. Dataset하나는 붓꽃 수술 데이터 셋이고, 하나는 기록 유실로 인한 데이터 셋이라 무슨 데이터인지는 모르겠습니다. . .

붓꽃 수술 데이터에는 세 가지 범주가 있습니다.

알 수 없는 데이터 세트, 소수점은 쉼표로 표시되므로 계산 시 처리가 필요합니다.

us 먼저 알려지지 않은 데이터 세트를 처리합니다. 먼저, 알 수 없는 데이터 세트의 파일 이름은 data.txt입니다. 그리고 이 데이터 세트는 먼저 x-y 선 차트로 그려질 수 있습니다. 따라서 먼저 원본 데이터를 꺾은선형 차트로 그립니다. x축이 상대적으로 길기 때문에 대략적인 모양만 보면 됩니다.

그림을 그리는 데에는 PHP의 jpgraph 라이브러리가 사용됩니다.

<?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(&#39;data&#39;);

//文件的处理
$file = fopen(&#39;data.txt&#39;,&#39;r&#39;);
$labels = array();
while(!feof($file)){
 $data = explode(&#39; &#39;,fgets($file));  
 $data[1] = str_replace(&#39;,&#39;,&#39;.&#39;,$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(&#39;data&#39;);
$g->Add($linePlot);
$g->Stroke();

이 원본 사진을 사용합니다. 비교를 위해 다음에 공부하겠습니다. 우리는 학습을 위해 php-ml에서 LeastSquars를 사용합니다. 비교 차트를 그릴 수 있도록 테스트 결과를 파일에 저장해야 합니다. 학습 코드는 다음과 같습니다.

<?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); //以追加的方式存入文件  
 }

이후 파일에 저장된 데이터를 읽어와 그래프를 그린 후 최종 렌더링을 먼저 붙여 넣습니다.

코드는 다음과 같습니다.


<?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(&#39;data&#39;);

$file = fopen(&#39;putput.txt&#39;,&#39;r&#39;);
$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(&#39;data&#39;);
$g->Add($linePlot);
$g->Stroke();

그래프가 여전히 일관성이 없는 것을 볼 수 있습니다. 특히 가장자리가 들쭉날쭉한 그래픽 부분에서 상대적으로 큽니다. 그러나 이는 결국 40개 세트의 데이터이며, 전반적인 그래픽 추세가 일관됨을 알 수 있습니다. 일반 도서관이 이런 학습을 할 경우 데이터 양이 적을수록 정확도가 매우 떨어진다. 상대적으로 높은 정확도를 얻으려면 많은 양의 데이터가 필요하며, 10,000개 이상의 데이터가 필요합니다. 이 데이터 요구 사항을 충족할 수 없다면 우리가 사용하는 모든 라이브러리는 쓸모없게 될 것입니다. 따라서 머신러닝 실습에서 실제 어려운 점은 정확도가 낮고 구성이 복잡하다는 기술적 문제가 아니라, 데이터 양이 부족하거나 품질이 너무 낮은(데이터 집합에 쓸모 없는 데이터가 너무 많은 경우) 것입니다. 머신러닝을 하기 전에 데이터 전처리도 필요합니다.

接下来,我们来对花蕊数据进行测试。一共三种分类,由于我们下载到的是csv数据,所以我们可以使用php-ml官方提供的操作csv文件的方法。而这里是一个分类问题,所以我们选择库提供的SVC算法来进行分类。我们把花蕊数据的文件名定为Iris.csv,代码如下:

<?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의 예제 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.