使用python绑定的示例,用于SVM库LIBSVM

Hos*_*ein 24 python machine-learning svm libsvm

我迫切需要在python中使用LibSVM的分类任务示例.我不知道输入应该是什么样的,哪个功能负责培训,哪个功能用于测试谢谢

Shi*_*oir 24

这里列出的代码示例不适用于LibSVM 3.1,所以我或多或少地通过mossplix移植了这个示例:

from svmutil import *
svm_model.predict = lambda self, x: svm_predict([0], [x], self)[0][0]

prob = svm_problem([1,-1], [[1,0,1], [-1,0,-1]])

param = svm_parameter()
param.kernel_type = LINEAR
param.C = 10

m=svm_train(prob, param)

m.predict([1,1,1])
Run Code Online (Sandbox Code Playgroud)


dou*_*oug 20

这个例子演示了一个单类SVM分类器 ; 它仍然显示完整的LIBSVM工作流程,尽可能简单.

第1步:导入NumPy和LIBSVM

  import numpy as NP
    from svm import *
Run Code Online (Sandbox Code Playgroud)

第2步:生成合成数据:对于此示例,给定边界内的500个点(注意:LIBSVM网站上提供了相当多的实际数据集)

Data = NP.random.randint(-5, 5, 1000).reshape(500, 2)
Run Code Online (Sandbox Code Playgroud)

第3步:现在,为一类分类器选择一些非线性决策边界:

rx = [ (x**2 + y**2) < 9 and 1 or 0 for (x, y) in Data ]
Run Code Online (Sandbox Code Playgroud)

步骤4:接下来,任意划分数据w/r/t这个决策边界:

  • I类:那些位于的任意的

  • 第二类:决策边界以外的所有点(圆圈)


SVM模型构建从这里开始; 在此之前的所有步骤只是为了准备一些合成数据.

步骤5:通过调用 svm_problem构建问题描述,传入决策边界函数数据,然后将此结果绑定到变量.

px = svm_problem(rx, Data)
Run Code Online (Sandbox Code Playgroud)

步骤6:为非线性映射选择内核函数

对于这个例子,我选择了RBF(径向基函数)作为我的核函数

pm = svm_parameter(kernel_type=RBF)
Run Code Online (Sandbox Code Playgroud)

步骤7:通过调用 svm_model训练分类,传入问题描述(px)和内核(pm)

v = svm_model(px, pm)
Run Code Online (Sandbox Code Playgroud)

步骤8:最后,通过在训练的模型对象('v')上调用预测来测试训练的分类器

v.predict([3, 1])
# returns the class label (either '1' or '0')
Run Code Online (Sandbox Code Playgroud)

对于上面的示例,我使用了3.0版本的LIBSVM(此答案发布时的当前稳定版本).

最后,w/r/t关于内核函数选择的问题部分,支持向量机并不特定于特定的内核函数 - 例如,我可以选择不同的内核(高斯,多项式等).

LIBSVM包括所有最常用的内核函数-这是一个很大的帮助,因为你可以看到所有可行的替代品,并选择一个为模型中使用,只需要调用的事svm_parameter和值传递的kernel_type(一所选内核的三字母缩写).

最后,您选择用于训练的内核函数必须与用于测试数据的内核函数相匹配.

  • 在第5步,我得到:`Traceback(最近一次调用最后一次):文件"<stdin>",第1行,在<module>文件"/usr/lib/pymodules/python2.7/svm.py"中,行83,在__init__ tmp_xi中,tmp_idx = gen_svm_nodearray(xi,isKernel = isKernel)文件"/usr/lib/pymodules/python2.7/svm.py",第51行,在gen_svm_nodearray中引发TypeError('xi应该是一个字典,列表或者元组')TypeError:xi应该是字典,列表或元组` (5认同)

mos*_*lix 13

LIBSVM从包含两个列表的元组中读取数据.第一个列表包含类,第二个列表包含输入数据.创建具有两个可能类的简单数据集,您还需要通过创建svm_parameter来指定要使用的内核.


>> from libsvm import *
>> prob = svm_problem([1,-1],[[1,0,1],[-1,0,-1]])
>> param = svm_parameter(kernel_type = LINEAR, C = 10)
  ## training  the model
>> m = svm_model(prob, param)
#testing the model
>> m.predict([1, 1, 1])


  • 此代码似乎不适用于最新版本的libsvm.我认为svm_parameter需要不同的关键字. (3认同)

小智 5

你可以考虑使用

http://scikit-learn.sourceforge.net/

这有一个很好的libsvm python绑定,应该很容易安装