几个重要的数据结构
2.1
struct svm_problem
{int l; // 记录样本的总数double *y; // 样本所属的标签(+1, -1)struct svm_node **x; // 指向样本数据的二维数组(即一个矩阵,行数是样本数,列数是特征向量维度)
};
2.2
struct svm_node
{int index;double value;
};
svm_node是用来存储单个样本数据的,打个比方说,svm_problem是一群羊,那么svm_node就是这一群羊中的一只。需要注意的是,svm_node的存储空间应该比特征数大一位,最后一位index值必须以-1结束。比如:
svm_node* node = new svm_node[1 + feature_size];for (int j = 0; j < feature_size; j++){node[j].index = j + 1;node[j].value = xdata[j];}node[feature_size].index = -1;return node;
2.3
struct svm_parameter{int svm_type;// SVM的类型int kernel_type;// 核函数double degree;// 多项式参数double gamma;// 核函数为poly/rbf/sigmoid的参数double coef0;// 核函数为poly/sigmoid的参数//下面是训练所需的参数double cache_size;// 训练所需的内存MB为单位double eps;// 训练停止的标准(误差小于eps停止)double C;// 惩罚因子,越大训练时间越长int nr_weight;// 权重的数目,目前只有两个值,默认为0int *weight_label;// 权重,元素个数由nr_weight决定double* weight;// C_SVC权重double nu;double p;int shrinking;// 训练过程是否使用压缩int probability;// 是否做概率估计};
libsvm命名空间下主要使用类:
svm_model 为模型类,通过训练或加载训练好的模型文件获得
svm_parameter 为参数类,主要为支持向量机设定参数,具体参数如下:
svm_parameter.kernel_type
核函数类型:核函数设置类型(svm_parameter.LINEAR)
svm_parameter.LINEAR – 线性:u'×v
svm_parameter.POLY– 多项式:(γ×u'×v + coef0)^degree
svm_parameter.RBF – RBF函数:exp(-γ×|u-v|^2)
svm_parameter.SIGMOID – sigmoid:tanh(γ×u'×v + coef0)
svm_parameter.degree
核函数中的degree设置(默认3)
svm_parameter.coef0
核函数中的coef0设置(默认0)
svm_parameter.shrinking
是否使用启发式,0或1(默认1)
svm_parameter.nu
设置ν-SVC,一类SVM和ν- SVR的参数(默认0.5)
svm_parameter.C
设置C-SVC,ε -SVR和ν-SVR的参数(默认1)
svm_parameter.cache_size
设置cache内存大小,以MB为单位(默认40)
svm_problem 相当于训练集合,可讲需要训练的数据加入该类传递给训练器
svm_node 内部使用的数据结构,主要用于保存待训练数据
svm 主调用程序中我们一般使用以下几个方法:
svm.svm_train(svm_problem,svm_parameter) 该方法返回一个训练好的svm_model
svm.svm_load_model(文件名); 该方法返回一个训练好的svm_model
svm.svm_save_model(文件名,svm_model); 该方法将svm_model保存到文件中
svm.svm_predict_values(svm_model,svm_node,double); 该方法返回doule类值,svm_node对svm_model测试,返回值确定了svm_node在模型中的定位