svm是一种常用的分类方法,libsvm一个开源库,提供了c、java、python的接口。

而我需要用到的是php来使用svm方法,所以找了php-svm作为php的扩展。

按照php-svm的README中介绍的方法开始安装。在安装过程中,先是报 Unable to find svm.h 。即使指定了configure的with-svm也不行。之后,查看config.m4,发现以下代码:

AC_MSG_CHECKING([for svm.h header])
for i in $PHP_SVM /usr/local /usr;
do
test -r $i/include/libsvm-2.0/libsvm/svm.h && SVM_PREFIX=$i && SVM_INC_DIR=$i/include/libsvm-2.0/ && SVM_OK=1
done
if test “$SVM_OK” != “1”; then
for i in $PHP_SVM /usr/local /usr;
do
test -r $i/include/libsvm/svm.h && SVM_PREFIX=$i && SVM_INC_DIR=$i/include/ && SVM_OK=1
done
fi

这显然不对啊!它会在/usr/local和/usr的include/libsvm下去找svm.h文件!

解决方法两种:一是在/usr/local下建立符合其要求的目录,并且把svm.h复制过去;另一种,就是修改config.m4,添加上你的svm.h路径。

继而configure、make完毕。但是在make test的时候,报如下错误:

PHP Warning:  PHP Startup: Unable to load dynamic library 'modules/svm.so' - modules/svm.so: undefined symbol: svm_print_string in Unknown on line 0

但是在php-svm和libsvm的源码里grep,发现都没有svm_print_string 的定义:

svm.c:  extern void (*svm_print_string) (const char *);
svm.c:  svm_print_string = &print_null;
svm.c:  extern void (*svm_print_string) (const char *);
svm.c:  svm_print_string = &print_null;

所以,修改libsvm:

在svm.cpp中注释掉以下代码:

/* cy delete, move to svm.h */
  /*
  static void print_string_stdout(const char *s)
  {
      fputs(s,stdout);
      fflush(stdout);
  }
  static void (*svm_print_string) (const char *) = &print_string_stdout;
  */


在svm.h中新增:

 /* cy add, from svm.cpp */
  static void print_string_stdout(const char *s)
  {
      fputs(s,stdout);
      fflush(stdout);
  }
  static void (*svm_print_string) (const char *) = &print_string_stdout;


然后,重新在libsvm中make lib,再安装php-svm就可以了。

测试代码如下:

$data = array(
          array(-1, 1 => 0.43, 3 => 0.12, 9284 => 0.2),
          array(+1, 1 => 0.75, 3 => 0.35, 9284 => 0.9),
          );

  $svm = new SVM();
  $model = $svm->train($data);
  #$model->save('train.model');
  #var_dump($model);
  unset($model);

  $data = array(1 => 0.73, 3 => 0.32, 9284 => 0.8);
  $model = new SVMModel();
  $model->load('train.model');
  $result = $model->predict($data);
  var_dump($result);

12 Comments

  1. 直播吧 says:

    挺好的,不错!!!顶!!!

  2. Nike Jordan says:

    all of these goods are the best,cheap and durable

  3. 低碳 says:

    我要让笑容成为自己的招牌动作

  4. popfeng says:

    谢谢分享心得

  5. popfeng says:

    flykobe朋友你好,有几个问题向您请教:
    我的系统是ubuntu,首先我安装libsvm3.1,然后https://github.com/ianbarber/php-svm#readme下载了php-svm,因为是c扩展,使用phpize生成configure 然后就是configure make make install,接着修改了php.ini重启nginx后phpinfo()里出现了svm,兴奋阿!!
    到php-svm编译目录,make test 通过率91%,也生成了model文件,但是!!~~自己写php却无法调用svm()类,也就是说php中 extension_loaded(‘svm’) 总是发现不了 svm的踪迹,都重装了好几遍了,折腾坏了,希望得到帮助!~~

  6. admin says:

    你是使用php的cgi还是cli模式执行svm的呢?

  7. popfeng says:

    谢谢斑竹回复,已经搞定了,是cli.没有指定php配置文件导致没有加载到svm扩展
    php -c 配置文件 脚本文件 。。。。这样写就没问题来,呵呵

  8. Drupal says:

    不错 在PHP很容易用SVM了

  9. admin says:

    是的,还蛮容易的,有开源的代码可以使用

  10. fy says:

    学习了,我也做了个例子(http://www.fyhome.com.cn/?p=91),希望能一起交流交流 php svm 。

Leave a Reply