如何利用python使用libsvm

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何利用python使用libsvm相关的知识,希望对你有一定的参考价值。

 把包解压在C盘之中,如:C:\libsvm-3.182.
  因为要用libsvm自带的脚本grid.py和easy.py,需要去官网下载绘图工具gnuplot,解压到c盘.进入c:\libsvm\tools目录下,用文本编辑器(记事本,edit都可以)修改grid.py和easy.py两个文件,找到其中关于gnuplot路径的那项,根据实际路径进行修改,并保存
  python与libsvm的连接(参考SVM学习笔记(2)LIBSVM在python下的使用)

  1.打开IDLE(pythonGUI),输入>>>importsys>>>sys.version
  2.如果你的python是32位,将出现如下字符:
  (default,Apr102012,23:31:26)[MSCv.150032bit(Intel)]’
  这个时候LIBSVM的python接口设置将非常简单。在libsvm-3.16文件夹下的windows文件夹中找到动态链接库libsvm.dll,将其添加到系统目录,如`C:\WINDOWS\system32\’,即可在python中使用libsvm
  wk_ad_begin(pid : 21);wk_ad_after(21, function()$('.ad-hidden').hide();, function()$('.ad-hidden').show(););
  3.执行一个小例子

  importos
  os.chdir('C:\libsvm-3.18\python')#请根据实际路径修改
  fromsvmutilimport*
  y,x=svm_read_problem('../heart_scale')#读取自带数据
  m=svm_train(y[:200],x[:200],'-c4')
  p_label,p_acc,p_val=svm_predict(y[200:],x[200:],m)
  ##出现如下结果,应该是正确安装了optimizationfinished,#iter=257nu=0.351161
  obj=-225.628984,rho=0.636110nSV=91,nBSV=49
  TotalnSV=91

  Accuracy=84.2857%(59/70)(classification)
参考技术A LIBSVM是台湾大学林智仁(Lin
Chih-Jen)教授等开发设计的一个简单、易于使用和快速有效的SVM模式识别与回归的软件包。该软件对SVM所涉及的参数调节相对比较少,提供了很多的默认参数,利用这些默认参数可以解决很多问题;并提供了交互检验(Cross
Validation)的功能。该软件可以解决C-SVM、ν-SVM、ε-SVR和ν-SVR等问题,包括基于一对一算法的多类模式识别问题。
环境:win32,python3.4

1.下载最新版libsvm-3.21:http://www.csie.ntu.edu.tw/~cjlin/libsvm/

解压,我解压到了C盘根目录下C:\libsvm-3.21

2.在pycharm中测试:

测试代码

如果出现以下运行结果,则配置成功:

结果

【备注】出现问题及解决方法:

问题:WindowsError: [Error 193] %1 不是有效的 Win32

原因:libsvm.dll版本与OS版本不符。

解决方法:在http://www.lfd.uci.edu/~gohlke/pythonlibs/#libsvm上下载符合自己OS版本的libsvm。将下载好的.whl文件后缀改为.zip,解压,然后将解压的文件中含有的libsvm.dll替换C:\libsvm-3.21\windows中的libsvm.dll即可。

3.python接口的说明

在libsvm-3.16的python文件夹下主要包括了两个文件svm.py和svmutil.py。

svmutil.py接口主要包括了high-level的函数,这些函数的使用和LIBSVM的MATLAB接口大体类似

svmutil中主要包含了以下几个函数:

svm_train() : train an SVM model

svm_predict() : predict testing data

svm_read_problem() : read the data from a LIBSVM-format
file.

svm_load_model() : load a LIBSVM model.

svm_save_model() : save model to a file.

evaluations() : evaluate prediction results.

svm.py接口主要包括了一些low-level的应用。在svm.py中采用了python内置的ctypes库,由此python可以直接访问svm.h中定义的C结构和接口函数。svm.py主要运用了四个数据结构svm_node,
svm_problem, svm_parameter和svm_model。

在 Python 中使用 LibSVM 预计算内核

【中文标题】在 Python 中使用 LibSVM 预计算内核【英文标题】:Precomputed Kernels with LibSVM in Python 【发布时间】:2011-01-29 06:55:54 【问题描述】:

我已经在网上搜索了大约 3 个小时,但我还没有找到解决方案。我想给 libsvm 一个预先计算的内核并对数据集进行分类,但是:

如何生成预计算内核? (例如,Iris data 的基本预计算内核是什么?)

在 libsvm 文档中,声明:

对于预计算内核,每个实例的第一个元素必须是 身份证。例如,

        samples = [[1, 0, 0, 0, 0], [2, 0, 1, 0, 1], [3, 0, 0, 1, 1], [4, 0, 1, 1, 2]]
        problem = svm_problem(labels, samples)
        param = svm_parameter(kernel_type=PRECOMPUTED)

什么是身份证?没有进一步的细节。我可以按顺序分配 ID 吗?

非常感谢任何 libsvm 帮助和预计算内核示例。

【问题讨论】:

【参考方案1】:

首先,内核和 SVM 的一些背景知识...

如果您想为n 向量(任意维度)预先计算内核,需要做的是计算每对示例之间的内核函数。核函数接受两个向量并给出一个标量,因此您可以将预先计算的核视为标量的nxn 矩阵。它通常称为核矩阵,有时也称为 Gram 矩阵。

有很多不同的核,最简单的是线性核(也称为点积):

sum(x_i * y_i) for i in [1..N] where (x_1,...,x_N) (y_1,..,y_N) are vectors

其次,尝试回答您的问题...

关于 libsvm 中预计算内核的文档其实还不错...

假设原始训练数据有三个四特征实例
并且测试数据有一个实例:

15 1:1 2:1 3:1 4:1
45 2:3 4:3
25 3:1
15 1:1 3:1

如果使用线性核,我们有以下
新的训练/测试集:

15 0:1 1:4 2:6 3:1
45 0:2 1:6 2:18 3:0
25 0:3 1:1 2:0 3:1

15 0:? 1:2 2:0 3:1

第二个例子中的每个向量都是内核矩阵中的一行。索引零处的值是 ID 值,它似乎只是一个顺序计数。第一个向量的索引 1 处的值是来自第一个示例的第一个向量的核函数值与自身(即(1x1)+(1x1)+(1x1)+(1x1) = 4),第二个是第一个向量与第二个向量的核函数值(即(1x3)+(1x3)=6)。对于示例的其余部分,它就像这样。您可以看到核矩阵是对称的,因为 K(x,y) = K(y,x)。

值得指出的是,第一组向量以稀疏格式表示(即缺失值为零),但核矩阵不是也不应该是稀疏的。我不知道这是为什么,它似乎只是一个 libsvm 的东西。

【讨论】:

【参考方案2】:

scikit-learn 在处理自定义内核时隐藏了 libsvm 的大部分细节。您可以将任意函数作为内核传递,它会为您计算 gram 矩阵,也可以传递内核的预先计算的 Gram 矩阵。

对于第一个,语法是:

   >>> from scikits.learn import svm
   >>> clf = svm.SVC(kernel=my_kernel)

其中 my_kernel 是您的内核函数,然后您可以调用 clf.fit(X, y) 它会为您计算内核矩阵。在第二种情况下,语法是:

   >>> from scikits.learn import svm
   >>> clf = svm.SVC(kernel="precomputed")

当你调用 clf.fit(X, y) 时,X 必须是矩阵 k(X, X),其中 k 是你的内核。有关详细信息,另请参阅此示例:

http://scikit-learn.org/stable/auto_examples/svm/plot_custom_kernel.html

【讨论】:

【参考方案3】:

这是一个简单的 2 类 3 向量自定义内核输入文件,可以正常工作。我将解释这些部分(尽管您也应该看到 StompChicken 的回答):

1 0:1 1:10 2:12 3:21 2 0:2 1:12 2:19 3:30 1 0:3 1:21 2:30 3:130

每行的第一个数字是它所属的类别。 每行的下一个条目的格式为 0:n,并且必须是连续的,即 0:1 首次入场 0:2 第二次进入 第三次进入0:3

造成这种情况的一个可能原因是 libsvm 返回值 alpha_i 与输出文件中的向量一起使用,但对于预先计算的内核,不显示向量(可能真的很大),而是显示索引 0:n显示矢量以使您的输出更容易与您的输入相匹配。特别是由于输出与您放入它们的顺序不同,因此按类别分组。因此,在读取输入文件以将 libsvm 的输出与您自己的输入相匹配以获得那些 0:n 值时,这对您非常有用。在这里你可以看到输出

svm_type c_svc kernel_type 预计算 nr_class 2 total_sv 3 rho -1.53​​951 标签 1 2 nr_sv 2 1 SV 0.4126650675419768 0:1 0.03174528241667363 0:3 -0.4444103499586504 0:2

重要要注意,使用预先计算的内核,您不能像使用所有其他内核一样省略零条目。必须明确包含它们。

【讨论】:

【参考方案4】:

我相信 scikit-learn 的 libSVM 的 python 绑定应该可以解决这个问题。

有关详细信息,请参阅http://scikit-learn.sourceforge.net/modules/svm.html#kernel-functions 上的文档。

【讨论】:

以上是关于如何利用python使用libsvm的主要内容,如果未能解决你的问题,请参考以下文章

黑科技编程开发,利用Python使图片完美去除水印

利用这10个工具,你可以写出更好的Python代码

如何使表格布局中的列均匀分布,最大限度地利用可用空间

如何使 Hive 查询利用存储在 Metastore 中的统计信息

可视化实验八:利用Python绘制柱状图条形图

可视化实验八:利用Python绘制柱状图条形图