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-112525625616128空0.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 */};
- libsvm源码分析(一):svm.h文件
- libsvm-svm-scale.c 源码分析
- SVM原理、公式推导、libsvm源码分析
- libsvm代码阅读:基础准备与svm.h头文件
- LibSVM 3.12的源码分析Svm-train.c
- svm(一):libsvm简介
- libSVM源码分析
- libsvm源码分析
- libSVM源码分析
- CTP源码分析7 CTP路由引擎结构及源码分析(一)----TreeRoute.h头文件解读和概要介绍
- syslog.h源码分析
- libsvm svm-toy
- SVM应用之libsvm
- SVM-libsvm 配置
- svm.h
- HDFS源码分析(一)-----INode文件节点
- HDFS源码分析(一)-----INode文件节点
- 文件管理器源码分析(一)
- Java 动态代理机制分析及扩展,第 2 部分
- ubuntu常用操作
- HTTP和Socket
- 汇编语言超浓缩教程
- Java线程之ExecutorService.invokeAny()
- libsvm源码分析(一):svm.h文件
- 分块查找
- iOS平台XML解析类库对比和安装说明
- Sailfish应用开发入门(一)Windows 安装Sailfish,创建第一个Sailfish APP
- MFC中对生成exe文件的图标更改方法
- 初探移动网站的架构和设计
- 【转】C语言中的基本数据类型--数据之间的混合运算
- 蚁群算法+LEACH 点滴(二)最值求解
- BAPI_PO_RESET_RELEASE---取消采购订单审批