在我的项目中用到了libsvm中的函数,但是发现现在很多博客都是一样的,而且,很多参数都没有解释清楚。所以本文就介绍一下,如有错误请指正。
部分参考来源:
https://blog.csdn.net/tang_jin2015/article/details/22292535
https://www.cnblogs.com/codingmengmeng/p/6254325.html
先说一下libsvm中的数据格式:
label 1:value1 2:value2 3:value3
label: 如果是分类则为类标签,如果是回归则为真实值
1,2,3:是样本的序号,可以省略,例如第2个样本没有值,那就是1:value1 3:value3
value1,value2,value3:表示样本值
svm-train中函数参数详解:
-s svm类型:SVM设置类型(默认0)
0 -- C-SVC:C-支持向量分类机;参数C为惩罚系数,C越大表示对错误分类的惩罚越大,适当的参数C对分类Accuracy很关键,用于惩罚系数的。
1 -- v-SVC:v-支持向量分类机;由于C的选取比较困难,用另一个参数v代替C。C是“无意义”的,v是有意义的。(与C_SVC其实采用的模型相同,但是它们的参数C的范围不同,C_SVC采用的是0到正无穷,该类型是[0,1]。)v用于惩罚支持向量的个数。
2 – one class SVM:单类别-支持向量机,不需要类标号,用于支持向量的密度估计和聚类。也就是训练数据只有一个类标签,可以用于检测异常点。
3 -- e-SVR:ε-支持向量回归机,不敏感损失函数,对样本点来说,存在着一个不为目标函数提供任何损失值的区域。
4 -- v-SVR:n-支持向量回归机,由于EPSILON_SVR需要事先确定参数,然而在某些情况下选择合适的参数却不是一件容易的事情。而NU_SVR能够自动计算参数。
// 如果想自己调用函数来训练和预测,则可以参考如下的函数参数说明
struct svm_model *svm_train(const struct svm_problem *prob, const struct svm_parameter *param)
{
struct svm_node
{
int index; // 单个样本的序号
double value; // 单个样本对应的值
};
struct svm_problem
{
int l; // 训练数据样本个数
double *y; // 训练样本的label,如果是分类,则是标签值,如果是回归,则是真实值
struct svm_node **x; // 数组指针,指向每一个训练样本
};
/*
例如:1 1:0.3 2:0.5 3:8.8
-1 1:0.6 3:1.8
则:
l = 2
y[0] = 1 y[1] = -1
*x = (1,0.3)(2,0.5)(3,8.8)
*x+1 = (1,0.6)(3,1.8)
*/
struct svm_parameter
{
int svm_type; // 应用类型:可以是C_SVC、NU_SVC、ONE_CLASS、EPSILON_SVR或NU_SVR其中的一种。
int kernel_type; // 核函数类型:可以是LINEAR、POLY、RBF、SIGMOID其中一种
例如:1 1:0.3 2:0.5 3:8.8
-1 1:0.6 3:1.8
则:
l = 2
y[0] = 1 y[1] = -1
*x = (1,0.3)(2,0.5)(3,8.8)
*x+1 = (1,0.6)(3,1.8)
*/
struct svm_parameter
{
int svm_type; // 应用类型:可以是C_SVC、NU_SVC、ONE_CLASS、EPSILON_SVR或NU_SVR其中的一种。
int kernel_type; // 核函数类型:可以是LINEAR、POLY、RBF、SIGMOID其中一种
// 各核函数的定义如下所示:
/*
LINEAR: u’*v
/*
LINEAR: u’*v
POLY: (gamma*u’*v + coef0)^degree
RBF: exp(-gamma*|u-v|^2)
SIGMOID: tanh(gamma*u’*v + coef0)
PRECOMPUTED:训练 集文件中的核心值
*/
int degree; /* for poly */
double gamma; /* for poly/rbf/sigmoid */
double coef0; /* for poly/sigmoid */
*/
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 */ // 一般取值有0.001,0.00001等
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 */
};
}
double cache_size; /* in MB */
double eps; /* stopping criteria */ // 一般取值有0.001,0.00001等
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 */
};
}
// 预测函数
double svm_predict_probability(const struct svm_model *model, const struct svm_node *x, double* prob_estimates)
{
struct svm_model
{
struct svm_parameter param; /* parameter */
int nr_class; /* number of classes, = 2 in regression/one class svm */
int l; /* total #SV */
struct svm_node **SV; /* SVs (SV[l]) */
double **sv_coef; /* coefficients for SVs in decision functions (sv_coef[k-1][l]) */
double *rho; /* constants in decision functions (rho[k*(k-1)/2]) */
double *probA; /* pariwise probability information */
double *probB;
int *sv_indices; /* sv_indices[0,...,nSV-1] are values in [1,...,num_traning_data] to indicate SVs in the training set */
double svm_predict_probability(const struct svm_model *model, const struct svm_node *x, double* prob_estimates)
{
struct svm_model
{
struct svm_parameter param; /* parameter */
int nr_class; /* number of classes, = 2 in regression/one class svm */
int l; /* total #SV */
struct svm_node **SV; /* SVs (SV[l]) */
double **sv_coef; /* coefficients for SVs in decision functions (sv_coef[k-1][l]) */
double *rho; /* constants in decision functions (rho[k*(k-1)/2]) */
double *probA; /* pariwise probability information */
double *probB;
int *sv_indices; /* sv_indices[0,...,nSV-1] are values in [1,...,num_traning_data] to indicate SVs in the training set */
/* for classification only */
int *label; /* label of each class (label[k]) */
int *nSV; /* number of SVs for each class (nSV[k]) */
/* nSV[0] + nSV[1] + ... + nSV[k-1] = l */
/* XXX */
int free_sv; /* 1 if svm_model is created by svm_load_model*/
/* 0 if svm_model is created by svm_train */
};
}