iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 8
0
AI & Data

學習PHP Machine Learning的冒險歷程系列 第 8

[2020鐵人賽Day8]邂逅PHP Machine Learning-How to load data from Excel CSV?

How to load data from Excel CSV?

在開始實作標準化前,先來說一下如何將Excel CSV載入,並取得資料

CsvDataset

從CSV文件檔案加載數據資料的類別方法,它繼承了ArrayDataset的類別方法。

CsvDataset($filepath, $features, $headingRow)

$filepath:(string) Csv文件檔案的路徑
$features:(int) 作為要素的列數(從第一列開始),最後一列必須是標籤
$headingRow:(bool) 定義文件檔案是否具有標題列(如果為true則第一行將被忽略)
(參考資料:PHP-ML CsvDataset


ArrayDataset

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>";
?>

上一篇
[2020鐵人賽Day7]邂逅PHP Machine Learning-用KNearestNeighbors (KNN) 來定位 - 資料處理(花朵分類)
下一篇
[2020鐵人賽Day9]邂逅PHP Machine Learning-用KNearestNeighbors (KNN) 來定位 - 訓練樣本與測試樣本
系列文
學習PHP Machine Learning的冒險歷程30

尚未有邦友留言

立即登入留言