libsvm源码分析(一):svm.h文件

来源:互联网 发布:ping命令测试网络 编辑:程序博客网 时间:2024/04/30 22:21

    libsvm中svm.h文件主要定义整个程序要用的结构体svm_node,svm_problem,svm_parameter和一些方法。

1.svm_problem用于存储本次参加运算的所有样本(数据集),及其所属类别。

struct svm_problem{int l;      //记录样本总数double *y;  //指向样本所属类别的数组。struct svm_node **x;  //指向一个存储内容为指针的数组};


如果你的数据的形式如下所示:(libsvm只支持数值型的数据,最后一维表示所属类别)

125,256,6000,256,16,128,1
29,8000,32000,32,8,32,2
29,8000,32000,32,8,32,3
29,8000,32000,32,8,32,1
29,8000,16000,32,8,16,3

对应的svm_problem的参数:

int l=5,即样本总数;

double *y ={1.0, 2.0,  3.0, 1.0, 3.0}。

参加多类别计算时,由于使用one-against-one方法,所以参加分类的两类所对应的y[i]的内容是+1和-1。

很多人在论坛上问如何进行多类别运算,本人在对libsvm的源码进行分析,发现svm.cpp中svm_train调用svm_group_classes中会计算数据中样本的类别数,所以,在直接输入数据后可以自动的进行多类别的分类工作。代码如下所示:

for(i=0;i<l;i++){int this_label = (int)prob->y[i];int j;for(j=0;j<nr_class;j++){if(this_label == label[j]){++count[j];break;}}data_label[i] = j;if(j == nr_class){if(nr_class == max_nr_class){max_nr_class *= 2;label = (int *)realloc(label,max_nr_class*sizeof(int));count = (int *)realloc(count,max_nr_class*sizeof(int));}label[nr_class] = this_label;count[nr_class] = 1;++nr_class;}}


struct svm_node **x;

struct svm_node{int index;double value;};

svm_node用于存储单一向量中的单个特征,如125,256,6000,256,16,128,1存储该数据包含7个svm_node:

123456-1125256600025616128如果value 为0.00,该特征将不会被存储,如125,256,0,256,16,128,1,其中(特征3)被跳过:

12456-1125256256161280.00 不保留的好处在于,做点乘的时候,可以加快计算速度,对于稀疏矩阵,更能充分体现这种
数据结构的优势。但做归一化时,操作就比较麻烦了。

因此,svm_node **x中存储了数据,svm_node **x = Malloc(svm_node *,l);


2.svm_parameters是svm参数设置

enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR };/* svm_type */enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED }; /* kernel_type */
struct svm_parameter
{int svm_type; /* svm_type */int kernel_type;/* kernel_type */int degree;//poly中的ddouble gamma;//poly/rbf/sigmoid中的gammadouble coef0;//poly/sigmoid中的r/* these are for training only */double cache_size; /* 训练所需的内存,MB */double eps;double C;//惩罚因子int nr_weight;//权重的数目,目前在实例代码中只有两个值,一个是默认0,另外一个是svm_binary_svc_probability函数中使用数值2。int *weight_label;//权重,元素个数由nr_weight决定.double* weight;//double nu;/* for NU_SVC, ONE_CLASS, and NU_SVR */double p;/* for EPSILON_SVR */int shrinking;//指明训练过程是否使用压缩int probability; //是否要做概率估计};
因为我只对C-SVM进行研究,所以部分参数还是不太清楚是什么意思。
int nr_weight;int *weight_label;double* weight;

3.svm_model中存储训练模型

struct svm_model{struct svm_parameter param;//训练参数int nr_class;//类别数int l;//支持向量数struct svm_node **SV;//保存支持向量的指针,至于支持向量的内容,如果是从文件中读取,内容会额外保留;如果是直接训练得来,则保留在原来的训练集中。如果训练完成后需要预报,原来的训练集内存不可以释放。double **sv_coef;///相当于判别函数中的alphadouble *rho;//相当于判别函数中的bdouble *probA;double *probB;/* for classification only */int *label;//每类的类标签int *nSV;//每类的支持向量数 nSV[0] + nSV[1] + ... + nSV[k-1] = lint free_sv;/* 1 if svm_model is created by svm_load_model*//* 0 if svm_model is created by svm_train */};



原创粉丝点击