2024年PHP日本大会

示例

基本流程是定义参数,提供训练数据来生成模型,然后根据模型进行预测。有一组默认参数应该能够在大多数输入情况下获得一些结果,所以我们将从查看数据开始。

数据以文件、流或数组的形式提供。如果以文件或流的形式提供,则必须每行一个训练示例,格式为整数类(通常为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条注释

razvan_bc at yahoo dot com
2年前
名为“6765419 at qq dot com”的用户给出的负面评价的示例也适用!

<?php
$data
= array(
array(-
1, 1 =>170, 2 => 60),//-1 代表男生,键1代表身高,键2代表体重
array(-1, 1 =>180, 2 => 70),
array(
1, 1 => 160, 2 => 46),//1 代表女生,键1代表身高,键2代表体重
array(1, 1 => 155, 2 => 40),
);
$svm = new SVM();
$model = $svm->train($data);
$data = array( 1 => 165, 2 =>60);//测试数据
$result = $model->predict($data);
echo
var_dump($result);//echo var_export($result);
//return;
?>

所以我得到

float(-1)
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
"预测失败: $result";
}
} else {
echo
"加载失败";
}
?>

在测试文件所在的文件夹中添加额外的https://github.com/ianbarber/php-svm/blob/master/tests/australian.scale文件后,运行代码即可获得结果。
================================

ok1

所以它能工作。
razvan_bc at yahoo dot com
2年前
我忘记了一个细节!
如果你打算在Windows XAMPP环境下手动安装,文件应放在c:\xampp\php\lib\libsvm-3.1 (对应第一篇文章中描述的文件) ,扩展文件放在c:\xampp\php\ext (php_svm.dll)。

运行正常,祝你好运。
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

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

因此,创建traindata.txt文件,内容为-1 1:0.43 3:0.12 9284:0.2,然后在第二个例子中使用它。

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

所以是的,我认为它能工作,正如我所说的,我需要进行更多测试来掌握主要功能,以便考虑更复杂的情况。
razvan_bc at yahoo dot com
2年前
前提:PHP 8.1,Windows 64位
----------------------------------

安装(针对初学者)
--------
访问https://github.com/ianbarber/php-svm

我从页面上找到了安装脚本的URL:
..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上的phpt文件,以了解为什么在昨天的测试中,某些函数需要两个参数而不是手册中说明的一个参数时出现错误。
To Top