载入中

http://huangbo929.blog.edu.cn/
  
载入中
相册
登录
载入中
最新日志
载入中
最新回复
载入中
最新留言
载入中
友情链接
日志统计
载入中
用户公告

载入中

  选择阅读字号:      我的首页  设为首页  加为收藏  点此留言

如何使用SVM基于Suffix Array的String Kernel核函数

String Kernel目前最快的算法是基于Suffix Tree或Suffix Array的方法。目前网上能够找到的源码实现除了SVMSequel(现在源码好象无法下载得到,而且是基于OCaml语言)外,能够找到的并且可用的非常少。SASK(http://users.rsise.anu.edu.au/~chteo/SASK.html)是最新的基于Suffix Array的实现,它基于Linux下的C++实现,但仅提供String Kernel的计算功能,如何与SVM结合起来直接使用并没有给出说明。自己在和它的作者进行了第14次通信后终于弄懂了利用它进行SVM分类的详尽过程,现在写在这里留给将来备忘:
       首先下载http://users.rsise.anu.edu.au/~chteo/SASK.html上的两个压缩包sask-1.1(http://users.rsise.anu.edu.au/~chteo/src/sask-1.1.tgz)和SASK experiments(http://users.rsise.anu.edu.au/~chteo/src/sask_icml06_expt.tgz)。然后分别将它们解压缩并且执行make命令。假设解压缩后的根目录分别为sask-1.1和sask_icml06_expt。
       再到libsvm网站上下载最新的libsvm,要求是2.84版本之后的,这样它具有利用Precomputed Kernel Matrix的输入数据格式的功能。
       运行sask-1.1/src目录下面生成的line-libsvmkm可执行文件,将提供的文本训练集转化成libsvm可以接受的Kernel Matrix格式。
       将生成的基于Kernel Matrix格式的libsvm训练文件交给libsvm里的svm-train可执行文件,得到对应的svm-model文件。这个文件里有rho值和各个Support Vector的序号和它们的alpha值。
       利用这些Support Vector及对应的alpha值构建一个与训练集对应的StringKernel对象,具体代码参见sask_icml06_expt/Code里面的 ltp-sa-sl.cpp文件,大致过程如下:
       将各个Support Vector每个后面加一个'\n'的SENTINAL字符后串接一起,形成一个Master String,假设这个字符串保存在data这个std::string里,然后:

                         //swf和swfParam是调节weight的参数
                        StringKernel sk(data.size(), (SYMBOL*)data.c_str(), swf, swfParam);

                      //alphas保存各个Support Vector的alpha值的数组,data_len保存各个Support Vector的长度, n是Support Vector的数目
                        sk.Set_Lvs(&alphas[0], &data_len[0], n);

                        sk.PrecomputeVal();

       至此,一个分类器已经创建成功,如果对一个字符串pattern进行分类,通过如下语句计算它对应的svm值(保存在kval这个变量里),减去rho后的符号即为它的label:
      sk.Compute_K((SYMBOL*)pattern.c_str(), pattern.length(), kval);
    
       使用起来其实真的很简单。如果训练数目巨大,还可以考虑用SVM-light取代libsvm以得到Support Vector及它们的alpha值。      

转自:http://hi.baidu.com/xuqingyang/blog/item/ea593c3b4a14fbee14cecb0c.html    

神威 发表于 2008-7-3 10:07:00 | 阅读全文 | 回复(1) | 引用通告 | 编辑
  • 标签:SVM 核函数 
  • Re:如何使用SVM基于Suffix Array的String Kernel核函数
    初学者(游客)我处理的是白血病的基因数据。27个1型,11个2型。每个病例5000个基音点。首先想找差异基因,然后进行基因诊断。

    Svmtrain 进行训练的时候跟核函数的选取有关系吗?系统默认的是RBF核函数吗?如何换别的核函数。如何用混合核函数运算?


    B-model中的
    1 1:-0.111111 2:-0.333333 3:-0.333333 4:-0.111111 5:0.333333 6:1 7:-0.555556 8:-0.777778 9:-1
    1 1:0.111111 2:0.555556 3:0.555556 4:-1 5:-0.555556 6:-0.333333 7:-0.555556 8:0.333333 9:-1
    1 1:-1 2:-1 3:-1 4:-1 5:-0.777778 6:1 7:-0.555556 8:-1 9:-1
    1 1:0.111111 2:-0.777778 3:-1 4:-1 5:-1 6:-1 7:0.333333 8:-1 9:-1
    0.3163404268781873 1:-1 2:-0.555556 3:-0.555556 4:-0.777778 5:-0.777778 6:-1 7:0.333333 8:-0.777778 9:-1

    红色的是啥意思啊?
    为何是68——9维的啊?68是啥意思?而数据文件是683----9维的。


    这个文件是在dos下运行的,我在网上看到还有在matlab下运行的。如何在在matlab下做你的实验一的作业啊。
    初学者(游客)发表评论于2008-7-3 15:29:00 | 个人主页 | 引用 | 返回 | 删除 | 回复
    发表评论:
    载入中
    Powered by Oblog.