在開始實作標準化前,先來說一下如何將Excel CSV載入,並取得資料
從CSV文件檔案加載數據資料的類別方法,它繼承了ArrayDataset的類別方法。
CsvDataset($filepath, $features, $headingRow)
$filepath:(string) Csv文件檔案的路徑
$features:(int) 作為要素的列數(從第一列開始),最後一列必須是標籤
$headingRow:(bool) 定義文件檔案是否具有標題列(如果為true則第一行將被忽略)
(參考資料:PHP-ML CsvDataset)
ArrayDataset是將數據資料保存為PHP陣列類型的類別方法,並在其他類別方法中大量使用的Dataset類別方法
ArrayDataset($samples, $labels)
$samples:(array) 樣本
$labels:(array) 標籤
要取得樣本或標籤,可以使用getter:
取得樣本:$dataset->getSamples();
取得標籤:$dataset->getTargets();
(參考資料:PHP-ML ArrayDataset)
在[2020鐵人賽Day7]邂逅PHP Machine Learning-用KNearestNeighbors (KNN) 來定位 - 資料處理(花朵分類)有分享到此次實作的資料位置
資料集來源:https://archive.ics.uci.edu/ml/datasets/iris
整理過的資料集來源:https://drphototw.wixsite.com/wujl/teaching-2019f
將資料集下載放入專案資料夾內,並且建立一份iris.php
接著取出CSV樣本,並計算出標準化數值
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Phpml\Dataset\CsvDataset;
//讀取Excel
$dataset = new CsvDataset('iris.csv',4);
//取得相關數值
$getSample = $dataset->getSamples();
$getTargets = $dataset->getTargets();
// max(最大化)
$sepalLength_max = 0;
$sepalWidth_max = 0;
$petalLength_max = 0;
$petalWidth_max = 0;
// min(最小化)
$sepalLength_min = 0;
$sepalWidth_min = 0;
$petalLength_min = 0;
$petalWidth_min = 0;
// array(標準化數值)
$sepalLength_array = [];
$sepalWidth_array = [];
$petalLength_array = [];
$petalWidth_array = [];
for($i=0; $i<count($getSample); $i++){
if($i==0){
// max(最大化參數賦予初始值)
$sepalLength_max = $getSample[$i][0];
$sepalWidth_max = $getSample[$i][1];
$petalLength_max = $getSample[$i][2];
$petalWidth_max = $getSample[$i][3];
// min(最小化參數賦予初始值)
$sepalLength_min = $getSample[$i][0];
$sepalWidth_min = $getSample[$i][1];
$petalLength_min = $getSample[$i][2];
$petalWidth_min = $getSample[$i][3];
}
// max(比較最大化)
if($getSample[$i][0] > $sepalLength_max){
$sepalLength_max = $getSample[$i][0];
}
if($getSample[$i][1] > $sepalWidth_max){
$sepalWidth_max = $getSample[$i][1];
}
if($getSample[$i][2] > $petalLength_max){
$petalLength_max = $getSample[$i][2];
}
if($getSample[$i][3] > $petalWidth_max){
$petalWidth_max = $getSample[$i][3];
}
// mix(比較最小化)
if($getSample[$i][0] < $sepalLength_min){
$sepalLength_min = $getSample[$i][0];
}
if($getSample[$i][1] < $sepalWidth_min){
$sepalWidth_min = $getSample[$i][1];
}
if($getSample[$i][2] < $petalLength_min){
$petalLength_min = $getSample[$i][2];
}
if($getSample[$i][3] < $petalWidth_min){
$petalWidth_min = $getSample[$i][3];
}
}
// x'= (x-min)/(max - min) 標準化數值(有效值取到小數第三位)
for($i=0; $i<count($getSample); $i++){
$sepalLength_array[] = round(($getSample[$i][0]-$sepalLength_min)/($sepalLength_max-$sepalLength_min), 3);
$sepalWidth_array[] = round(($getSample[$i][1]-$sepalWidth_min)/($sepalWidth_max-$sepalWidth_min), 3);
$petalLength_array[] = round(($getSample[$i][2]-$petalLength_min)/($petalLength_max-$petalLength_min), 3);
$petalWidth_array[] = round(($getSample[$i][3]-$petalWidth_min)/($petalWidth_max-$petalWidth_min), 3);
}
// 印出標準化數值
echo "<pre>";
print_r($sepalLength_array);
print_r($sepalWidth_array);
print_r($petalLength_array);
print_r($petalWidth_array);
echo "</pre>";
?>