PHP 日本研討會 2024

範例

基本流程是定義參數、提供訓練資料以產生模型,然後根據模型進行預測。有一組預設參數,應該可以在大多數輸入中獲得一些結果,因此我們先來看看資料。

資料可以透過檔案、串流或陣列提供。如果透過檔案或串流提供,則每個訓練範例必須包含一行,其格式必須為整數類別(通常為 1 和 -1),後跟一系列特徵/值配對,並按特徵順序遞增排列。特徵是整數,值是浮點數,通常縮放為 0-1。例如

-1 1:0.43 3:0.12 9284:0.2

在文件分類問題中,例如垃圾郵件檢查器,每一行代表一個文件。將有兩個類別,-1 代表垃圾郵件,1 代表正常郵件。每個特徵代表一個詞,值代表該詞對文件的重要性(可能是頻率計數,總數縮放到單位長度)。值為 0 的特徵(例如,該詞根本沒有出現在文件中)將不會被包含在內。

在陣列模式中,資料必須以陣列的陣列形式傳遞。每個子陣列的第一個元素必須是類別,然後是特徵值配對的鍵 => 值集合。

此資料會傳遞到 SVM 類別的 train 函式,如果成功,該函式會傳回 SVM 模型。

產生模型後,它可用於對先前未見的資料進行預測。這可以以陣列形式傳遞到模型的 predict 函式,格式與之前相同,但不包含標籤。回應將是類別。

可以使用 save 和 load 函式來儲存和還原模型,這兩個函式都需要檔案位置。

範例 #1 從陣列訓練

<?php
$data
= array(
array(-
1, 1 => 0.43, 3 => 0.12, 9284 => 0.2),
array(
1, 1 => 0.22, 5 => 0.01, 94 => 0.11),
);

$svm = new SVM();
$model = $svm->train($data);

$data = array(1 => 0.43, 3 => 0.12, 9284 => 0.2);
$result = $model->predict($data);
var_dump($result);
$model->save('model.svm');
?>

上面的範例將輸出類似以下的內容

int(-1)

範例 #2 從檔案訓練

<?php
$svm
= new SVM();
$model = $svm->train("traindata.txt");
?>

新增註解

使用者貢獻的註解 5 個註解

0
razvan_bc at yahoo dot com
2 年前
由「6765419 at qq dot com」的人評為負面的範例也可以運作!

<?php
$data
= array(
array(-
1, 1 =>170, 2 => 60),//-1 表示男生,key 1表示身高,key 2表示體重=Represents a boy, key 1 represents height, key 2 represents weight
array(-1, 1 =>180, 2 => 70),
array(
1, 1 => 160, 2 => 46),//1 表示女生,key 1表示身高,key 2表示體重=Represents a girl, key 1 represents height, key 2 represents weight
array(1, 1 => 155, 2 => 40),
);
$svm = new SVM();
$model = $svm->train($data);
$data = array( 1 => 165, 2 =>60);//測試數據 =Test Data
$result = $model->predict($data);
echo
var_dump($result);//echo var_export($result);
//return;
?>

所以我得到

float(-1)
0
razvan_bc at yahoo dot com
2 年前
好的,我做了更多測試..

取得原始碼
https://github.com/ianbarber/php-svm/blob/master/tests/002_predict.phpt 已修改 ..
<?php
$svm
= new svmmodel();
//$result = $svm->load(dirname(__FILE__) . '/australian.model');
$result = $svm->load('australian.model');

if(
$result) {
$data = array(
"1" => 1,
2 => -0.731729,
3 => -0.886786,
4 => -1,
5 => 0.230769,
"6" => -0.25,
7 => -0.783509,
8 => 1,
9 => 1,
10 => "-0.820896",
11 => -1,
13 => -0.92,
"14" => "-1"
);
$result = $svm->predict($data);
if(
$result > 0) {
echo
"ok";
print_r($result);
} else {
echo
"predict failed: $result";
}
} else {
echo
"loading failed";
}
?>

另外,將 https://github.com/ianbarber/php-svm/blob/master/tests/australian.scale 放到 .php 檔案所在的測試資料夾後,執行程式碼就能得到結果。
================================

ok1

所以它能運作
0
razvan_bc at yahoo dot com
2 年前
我忘了一個細節!
如果你想在 Windows XAMPP 中手動安裝,安裝資料夾應該是 c:\xampp\php\lib\libsvm-3.1 (放我第一篇文章中描述的檔案),擴充套件則應該在 c:\xampp\php\ext (php_svm.dll)。

可以運作。祝你好運
0
razvan_bc at yahoo dot com
2 年前
我從 pecl.php.net 下載了 svm php_svm-0.2.3-8.1-ts-vs16-x64.zip,然後我讀了 README.md ...

=====================================================
資料可以以檔案、串流或陣列的形式提供。如果以檔案或串流形式提供,則每個訓練範例必須佔一行,格式為一個整數類別(通常為 1 和 -1),後跟一系列特徵/值對,且特徵按遞增順序排列。特徵是整數,值是浮點數,通常縮放為 0-1。例如

-1 1:0.43 3:0.12 9284:0.2

=====================================================

因此,建立內容為 -1 1:0.43 3:0.12 9284:0.2 的 traindata.txt 讓我可以在第二個範例中使用它。

<?php
$svm
= new SVM();
$model = $svm->train("traindata.txt");
$model->save('model2.svm');
?>

執行並編輯 model2.svm 後,我得到了以下內容
-------------------------------------------------------------------
svm_type c_svc
kernel_type rbf
gamma 0.00010771219302024989
nr_class 1
total_sv 0
rho
label -1
nr_sv 0
SV
--------------------------------------------------------------------

所以,是的,我想它可以運作,如同我說的,我需要做更多測試來掌握主要功能,以便考慮其他更複雜的功能。
0
razvan_bc at yahoo dot com
2 年前
前提:PHP 8.1,Windows 64
----------------------------------

安裝(針對初學者)
--------
在我瀏覽 https://github.com/ianbarber/php-svm 之後

我從頁面上找到的網址(安裝腳本)取得
.. http://www.csie.ntu.edu.tw/~cjlin/cgi-bin/libsvm.cgi?+http://www.csie.ntu.edu.tw/~cjlin/libsvm+tar.gz

並手動安裝它
1. php.ini
(在主群組 extension=... 約 12 個之後)
...
extension=svm
...

2. 我手動在 PHP 內部建立了一個名為 libsvm-3.1 的資料夾,然後我在那裡解壓縮了 libsvm.dll、libsvmread.mexw64、libsvmwrite.mexw64、svmpredict.mexw64、svm-predict.exe、svm-scale.exe、svm-toy.exe、svmtrain.mexw64、svm-train.exe!

執行
<?php

$data
= array(
array(-
1, 1 => 0.43, 3 => 0.12, 9284 => 0.2),
array(
1, 1 => 0.22, 5 => 0.01, 94 => 0.11),
);

$svm = new SVM();
$model = $svm->train($data);

$data = array(1 => 0.43, 3 => 0.12, 9284 => 0.2);
$result = $model->predict($data);
var_dump($result);
$model->save('model.svm');

?>

透過伺服器(Apache、PHP、MariaDB;甚至是自訂或 XAMPP),我現在得到結果了
我得到的 model.svm 內容如下
================================
svm_type c_svc
kernel_type rbf
gamma 0.00010771219302024989
nr_class 2
total_sv 2
rho 0
label 1 -1
nr_sv 1 1
SV
1 1:0.22 5:0.01 94:0.11
-1 1:0.43 3:0.12 9284:0.2
=================================

所以我認為這對於啟動來說非常酷。
我將查看 GitHub 中的 PHP 檔案,以了解為什麼昨天的測試中,某些需要兩個參數而不是像手冊中一樣只需要一個參數的函式會出現錯誤。
To Top