SVM
学习使用 libsvm 库。详细说明见这里。
使用工具训练
库中有编写好的训练程序 svm_train 可以按照要求的数据格式训练模型。训练数据格式:
<label> <index1>:<value1> <index2>:<value2> ...
.
.
.
每一行是一个训练数据,结尾由 '\n' 分开。对于 <label> ,如果是一个整数,那么为分类(支持多个类训练)。如果是实数,那么是回归。
<index>:<value> 代表第 index 处特征值为 value。index 从 1 开始递增,自定义的核函数除外。若使用自定义核函数:
# sample i; training
<label> 0:i 1:K(xi, x1) ... L:K(xi, xL)
# testing; ? can be any value
<label> 0:? 1:K(x, x1) ... L:K(x, xL)
使用库编程
所有的函数都在 svm.h 中声明。训练模型函数
struct svm_model *svm_train(const struct svm_problem *prob,
const struct svm_parameter *param);
需要定义 svm_problem 和 svm_parameter 。
struct svm_problem
{
int l;
double *y;
struct svm_node **x;
};
比如,
LABEL ATTR1 ATTR2 ATTR3 ATTR4 ATTR5
----- ----- ----- ----- ----- -----
1 0 0.1 0.2 0 0
2 0 0.1 0.3 -1.2 0
1 0.4 0 0 0 0
2 0 0.1 0 1.4 0.5
3 -0.1 -0.2 0.1 1.1 0.1
那么结构为
l = 5
y -> 1 2 1 2 3
x -> [ ] -> (2,0.1) (3,0.2) (-1,?)
[ ] -> (2,0.1) (3,0.3) (4,-1.2) (-1,?)
[ ] -> (1,0.4) (-1,?)
[ ] -> (2,0.1) (4,1.4) (5,0.5) (-1,?)
[ ] -> (1,-0.1) (2,-0.2) (3,0.1) (4,1.1) (5,0.1) (-1,?)
(index, value) 存储在 svm_node 结构中
struct svm_node
{
int index;
double value;
};
index = -1 代表每个数据点结尾。
svm_problem 定义可见头文件,参数解释见文档和 libsvm 上的调参手册。库中还提供了诸如 svm_XXX 函数辅助调用分析训练的 SVM 模型,多加利用。
|