<script type="text/javascript"> document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData("text"); if (text && text.length>300) { text = text + "/r/n/n本文来自CSDN博客,转载请标明出处:" + location.href; clipboardData.setData("text", text); } }, 100); } } </script> <script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script>
这些函数和结构都在头文件“ svm.h ”中有声名。你需要在你的 C/C++ 源文件中添加 #include “svm.h” 语句,在连接时需要将你的程序与 svm.cpp 连接。具体使用方法可以参考“ svm-train.c ”和“ svm-predict.c ”的使用示例。在文件 svm.h 中使用 LIBSVM_VERSION 定义了版本号,以便读者查阅。
在对测试数据进行分类之前,需要先使用训练数据建立一个支持向量模型。模型可以以文件的形式存储以备以后使用。一旦建立好了支持向量机模型,就可以用它来对新的数据进行分类了。
- 函数: struct svm_model *svm_train(const struct svm_problem *prob, const struct svm_parameter *param);
这个函数根据给定的参数和训练数据构建并返回一个支持向量机模型。
结构体 svm_problem 将问题形式化:
struct svm_problem
{
int l;
double *y;
struct svm_node **x;
};
其中“ l ”表示训练数据的实例数,而“ y ”是一个数组,用于存放它们的目标值。(类型值用整型数据,回归值用实数)“ x ”是一个数组指针,每一个指针指向一个稀疏的训练向量(即一个 svm_node 数组)。
例如,如果我们有如下的训练数据:
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
于是 svm_problem 的构成如下:
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,?)
其中(索引,值)存储在结构“ svm_node ”中:
struct svm_node
{
int index;
double value;
};
当索引为 -1 时表示已经到达向量的末端。注意索引必须“升序”排列。
结构体 svm_parameter 描述了一个支持向量机的参数:
struct svm_parameter
{
int svm_type;
int kernel_type;
int degree; /* for poly */
double gamma; /* for poly/rbf/sigmoid */
double coef0; /* for poly/sigmoid */
/* these are for training only */
double cache_size; /* in MB */
double eps; /* stopping criteria */
double C; /* for C_SVC, EPSILON_SVR, and NU_SVR */
int nr_weight; /* for C_SVC */
int *weight_label; /* for C_SVC */
double* weight; /* for C_SVC */
double nu; /* for NU_SVC, ONE_CLASS, and NU_SVR */
double p; /* for EPSILON_SVR */
int shrinking; /* use the shrinking heuristics */
int probability; /* do probability estimates */
};
svm_type 可以是 C_SVC 、 NU_SVC 、 ONE_CLASS 、 EPSILON_SVR 或 NU_SVR 其中的一种。
C_SVC: C-SVM 分类
NU_SVC: nu-SVM 分类
ONE_CLASS: one-class-SVM
EPSILON_SVR: epsilon-SVM 回归
NU_SVR: nu-SVM 回归
kernel_type 可以是 LINEAR 、 POLY 、 RBF 、 SIGMOID 其中一种。
LINEAR: u'*v
POLY: (gamma*u'*v + coef0)^degree
RBF: exp(-gamma*|u-v|^2)
SIGMOID: tanh(gamma*u'*v + coef0)
PRECOMPUTED: 训练集文件中的核心值
cache_size 是核心缓存的大小,单位为 MB 。 C 是违背约束成本(惩罚值)。 eps 是结束条件。(一般地,我们在 nu-SVC 模型中使用 0.00001 ,在其它模型中使用 0.001 )。 nu 是 nu-SVM 、 nu-SVR 与 one-class-SVM 中的一个参数。 p 是 epsilon-SVM 回归中对 epsilon 不敏感函数的 epsilon 值。 shirnking = 1 表示使用压缩,否则 = 0 。 probability = 1 表示得到带概率信息的模型,否则 = 0 。
nr_weight 、 weight_label 和 weight (权重)用于改变某些类的惩罚因子(如果一个类的权重不变,则将权重值设定为 1 )这在使用不均衡输入数据或使用不均匀错误成本训练分类器时尤其有用。
nr_weight 是数组 weight_label 和 weight 中的元素个数。每个 weight[i] 对应一个 weight_label[i] ,表示类 weight_label[i] 的惩罚是由因子 weight[i] 确定的。
如果不想改变任何类的惩罚因子,那么只需要将 nr_weight 设定为 0 。
* 注意 * 因为 svm_model 含有指向 svm_problem 的指针,如果仍要使用由 svm_train() 产生的 svm_model ,那么就不要释放 svm_problem 的内存。
* 注意 * 为了避免错误的参数,在调用 svm_train() 之前应该先调用 svm_check_parameter() 。
- 函数: double svm_predict(const struct svm_model *model,
const struct svm_node *x);
在给定模型的前提下,这个函数可以用来对测试向量 x 进行分类或回归。
分类模型返回的是 x 的预测类。
回归模型返回使用该模型计算所得的 x 函数值。 one-class 模型返回 +1 或 -1 。
- 函数: void svm_cross_validation(const struct svm_problem *prob,
const struct svm_parameter *param, int nr_fold, double *target);
这个函数用于交叉验证。数据会分成 nr_fold 个部分。在给定的参数下,顺序地对每一部分数据用其余部分数据训练成的模型进行验证。在验证过程中,预测标签(所有 prob 的实例)存放到一个名为 target (目标)的数组。
svm_prob 的格式与 svm_train() 的相同。
- 函数: int svm_get_svm_type(const struct svm_model *model);
这个函数用于确定模型的 svm_type 。可能的 svm_type 值已在 svm.h 中定义。
- 函数: int svm_get_nr_class(const svm_model *model);
对于分类模型,本函数用于得到类的数量。回归或 one-class 模型的返回值是 2 。
- 函数: void svm_get_labels(const svm_model *model, int* label)
对于分类模型,这个函数输出名称标签到一个名为 label 的数组。对于回归或 one-class 模型, label 的值保护不变。
- 函数: double svm_get_svr_probability(const struct svm_model *model);
对于带有概率信息的回归模型,此函数将输出一个值 sigma>0 。对于测试数据,我们考虑概率模型:目标值 = 预测值 + z , z :拉普拉斯分布 e^(-|z|/sigma)/(2sigma)
如果不是 svr 模型,或者不含有需要的信息,则返回 0 。
- 函数: void svm_predict_values(const svm_model *model,
const svm_node *x, double* dec_values)
在给定模型的前提下,这个函数可以用来给出测试向量 x 的决策值。
对于有 nr_class 个类的分类模型,这个函数给出 nr_class*(nr_class-1)/2 个决策值,并存到数组 dec_values 中,其中 nr_class 可以通过函数 svm_get_nr_class 得到。序列是 label[0] vs. label[1], …, label[0] vs. label[nr_class – 1], label[1] vs. label[2], …, label[nr_class-2] vs. label[nar_class-1], 其中 label 可以通过函数 svm_get_lables 得到。
回归模型中,label[0]表示使用该模型计算所得的 x 函数值。 one-class 模型中, label[0] 是 +1 或 -1 。
- 函数: double svm_predict_probability(const struct svm_model *model,
const struct svm_node *x, double* prob_estimates);
在给定带概率信息的模型的前提下,这个函数可以用来对测试向量 x 进行分类或回归。
对于带有概率信息的分类模型,这个函数会把 nr_class 概率期望输出到数组 prob_estimates 中。 nr_class 可以通过函数 svm_get_nr_class 得到。返回值是概率值最高的类。对于回归或 one-class 支持向量机,数组 prob_estimates 保持不变,而返回值与 svm_predict 的返回值相同。
- 函数: const char *svm_check_parameter(const struct svm_problem *prob,
const struct svm_parameter *param);
本函数检验对于当前问题,参数是否合法。在调用 svm_train() 和 svm_cross_validation() 之前应该调用此函数。如果参数合法,则返回 NULL ,如果不合法,则返回错误信息。
- 函数: int svm_check_probability_model(const struct svm_model *model);
此函数用于判断当前模型是否含有进行概率期望运算所需要的信息。如果含有则返回 +1 。否则返回 0 。在调用 sv svm_get_svr_probability 和 svm_predict_probability 之前应该调用此函数。
- 函数: int svm_save_model(const char *model_file_name,
const struct svm_model *model);
此函数用于将训练好的模型保存到文件中,如果保存成功则返回 0 ,如果发生错误则返回 -1 。
- 函数: struct svm_model *svm_load_model(const char *model_file_name);
此函数从文件中读取模型并返回指向该模型的指针,如果读取失败则回返空指针。
- 函数: void svm_destroy_model(struct svm_model *model);
此函数用于释放指定模型的内存。
- 函数: void svm_destroy_param(struct svm_parameter *param);
此函数用于释放指定参数集的内存。