使用LIBSVM库的Python绑定示例

26 投票
8 回答
52362 浏览
提问于 2025-04-16 07:16

我急需一个使用LibSVM的分类任务示例,最好是用Python来写。我不知道输入数据应该是什么样子的,也不清楚哪个函数负责训练,哪个函数负责测试。谢谢!

8 个回答

20

这个例子展示了一个一类SVM分类器;它尽可能简单,同时又展示了完整的LIBSVM工作流程。

第一步: 导入NumPy和LIBSVM

  import numpy as NP
    from svm import *

第二步: 生成合成数据:在这个例子中,我们在一个给定的边界内生成500个点(注意:LIBSVM 网站上提供了很多真实的数据集)

Data = NP.random.randint(-5, 5, 1000).reshape(500, 2)

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

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

第四步: 接下来,按照这个决策边界随意划分数据:

  • 类别I: 位于一个任意圆圈内或上面的点

  • 类别II: 所有位于决策边界(圆圈)外部的点


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

第五步: 通过调用svm_problem构建问题描述,传入决策边界函数数据,然后将这个结果绑定到一个变量。

px = svm_problem(rx, Data)

第六步: 选择一个核函数用于非线性映射

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

pm = svm_parameter(kernel_type=RBF)

第七步: 训练分类器, 通过调用svm_model,传入问题描述(px)和(pm)

v = svm_model(px, pm)

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

v.predict([3, 1])
# returns the class label (either '1' or '0')

对于上面的例子,我使用了LIBSVM的版本3.0(这是在这个答案发布时的当前稳定版本)。

最后,关于你提到的核函数选择的问题,支持向量机并不特定于某个特定的核函数——例如,我可以选择不同的核(高斯、Polynomial等)。

LIBSVM包含了所有最常用的核函数——这非常有帮助,因为你可以看到所有合理的选择,选择一个用于你的模型,只需调用svm_parameter并传入kernel_type的值(选择的核的三字母缩写)。

最后,你在训练时选择的核函数必须与测试数据使用的核函数匹配。

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])
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])


撰写回答