PHP機器學習庫php-ml的實例教程
php-ml是使用PHP編寫的機器學習函式庫。雖然我們知道,python或C++提供了更多機器學習的函式庫,但實際上,他們大多都略顯複雜,配置起來讓許多新手感到絕望。 php-ml這個機器學習庫雖然沒有特別高大上的演算法,但其具有最基本的機器學習、分類等演算法,我們的小公司做一些簡單的資料分析、預測等等都是夠用的。在我們的專案中,追求的應該是性價比,而不是過度的效率和精確度。有些演算法和函式庫看起來非常厲害,但如果我們考慮快速上線,而我們的技術人員沒有機器學習方面的經驗,那麼複雜的程式碼和配置反而會拖累我們的專案。而如果我們本身就是做一個簡單的機器學習應用,那麼研究複雜函式庫和演算法的學習成本很顯然高了點,而且,專案出了奇奇怪怪的問題,我們能解決嗎?需求改變了怎麼辦?相信大家都有過這種經驗:做著做著,程序忽然報錯,自己怎麼都搞不清楚原因,上谷歌或百度一搜,只搜出一條滿足條件的問題,在五年、十年前提問,然後零回覆。 。 。所以,選擇最簡單最有效率、性價比最高的做法是必須的。 php-ml的速度不算慢(趕快換php7吧),精確度也不錯,畢竟演算法都一樣,而且php是基於c的。部落客最看不慣的就是,拿python和Java,PHP之間比性能,比適用範圍。真要性能,請你拿C開發。真要追求適用範圍,也請用C,甚至彙編。 。 。
首先,我們要使用這個函式庫,需要先下載這個函式庫。在github可以下載到這個函式庫檔案(https://github.com/php-ai/php-ml)。當然,更推薦使用composer來下載該庫,自動配置。
當下載好了以後,我們可以看一看這個庫的文檔,文檔都是一些簡單的小示例,我們可以自己建一個文件嘗試一下。都淺顯易懂。接下來,我們來拿實際的數據測試一下。 資料集一個是Iris花蕊的資料集,另一個由於記錄遺失,所以不知道是有關什麼的資料了。 。 。
Iris花蕊部分數據,有三種不同的分類:
#不知名數據集,小數點被打成了逗號,所以計算時還需要處理一下:
#我們先處理不知名資料集。首先,我們的不知名資料集的檔案名稱為data.txt。而這個資料集剛好可以先繪製成x-y折線圖。所以,我們先將原始資料繪製成一個折線圖。由於x軸比較長,所以我們只需要看清楚它大致的形狀即可:
#繪製採用了php的jpgraph函式庫,程式碼如下:
<?php include_once './src/jpgraph.php'; include_once './src/jpgraph_line.php'; $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();
在有了這個原圖做對比,我們接下來進行學習。我們採用php-ml的LeastSquars來學習。我們測試的輸出需要存入文件,方便我們可以畫一個對比圖。學習程式碼如下:
<?php require 'vendor/autoload.php'; use Phpml\Regression\LeastSquares; use Phpml\ModelManager; $file = fopen('data.txt','r'); $samples = array(); $labels = array(); $i = 0; while(!feof($file)){ $data = explode(' ',fgets($file)); $samples[$i][0] = (int)$data[0]; $data[1] = str_replace(',','.',$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 './src/jpgraph.php'; include_once './src/jpgraph_line.php'; $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();
可以發現,圖形出入還是比較大的,尤其是在圖形鋸齒比較多的部分。不過,這畢竟是40組數據,我們可以看出,大概的圖形趨勢是吻合的。一般的函式庫在做這種學習時,資料量低的情況下,準確度都非常低。要達到比較高的精度,需要大量的數據,萬條以上的數據量是必要的。如果達不到這個資料要求,那我們使用任何函式庫都是徒勞無功的。所以,機器學習的實踐中,真正難的不在精度低、配置複雜等技術問題,而是資料量不夠,或是品質太低(一組資料中無用的資料太多)。在做機器學習之前,資料的預先處理也是必要的。
接下来,我们来对花蕊数据进行测试。一共三种分类,由于我们下载到的是csv数据,所以我们可以使用php-ml官方提供的操作csv文件的方法。而这里是一个分类问题,所以我们选择库提供的SVC算法来进行分类。我们把花蕊数据的文件名定为Iris.csv,代码如下:
<?php require 'vendor/autoload.php'; use Phpml\Classification\SVC; use Phpml\SupportVectorMachine\Kernel; use Phpml\Dataset\CsvDataset; $dataset = new CsvDataset('Iris.csv' , 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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

在PHP8 中,match表達式是一種新的控制結構,用於根據表達式的值返回不同的結果。 1)它類似於switch語句,但返回值而非執行語句塊。 2)match表達式使用嚴格比較(===),提升了安全性。 3)它避免了switch語句中可能的break遺漏問題,增強了代碼的簡潔性和可讀性。
