使用libSVM 求解分类问题的C++小例 1 . libSVM 简介 训练模型的结构体 struct svm_problem //储存参加计算的所有样本 { int l; //记录样本总数 double *y; //指向样本类别的组数 struct svm_node **x;//数据样本 }; 当样本类别事先已经被告知时,可以通过数字来给样本数据进行标识(如果是两类通常以1 与-1 来表示)。如果不清楚样本类别可以用样本个数编号来设置,这时候分类的准确率也就无法判定了。 数据样本是一个二维数组,其中每个单元格储存的是一个 svm_node,y 与样本数据的对应关系为: 数据节点的结构体 struct svm_node //储存单一向量的单个特征 { int index; //索引 double value; //值 }; 如果需要储存向量,就可以使用6 个 svm_node 来保存,内存映像为: index 1 2 3 4 5 -1 value 1 121 12321 121 1 NULL 注意:向量是以索引值为-1 的元素为结束标志位的。如果没有标志位将导致程序崩溃。 SVM 模型类型枚举 enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR }; C_SVC:C 表示惩罚因子,C 越大表示对错误分类的惩罚越大 NU_SVC:和C_SVC 相同。 ONE_CLASS:不需要类标号,用于支持向量的密度估计和聚类. EPSILON_SVR: -不敏感损失函数,对样本点来说,存在着一个不为目标函数提供任何损失值的区域,即 -带。 NU_SVR:由于 EPSILON_SVR 需要事先确定参数 ,然而在某些情况下选择合适的参数却不是一件容易的事情。而 NU_SVR 能够自动计算参数 。 注意:C_SVC 与 NU_SVC 其实采用的模型相同,但是它们的参数C 的范围不同C_SVC 采用的是 0 到正无穷,NU_SVC 是[0,1]。 核函数类型枚举 enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED }; LINEAR:线性核函数(linear kernel) POLY:多项式核函数(ploynomial kernel) RBF:径向机核函数(radical basis function) SIGMOID: 神经元的非线性作用函数核函数(Sigmoid tanh) PRECOMPUTED:用户自定义核函数 计算模型参数结构体 struct svm_parameter { int svm_type; //支持向量机模型类型 int kernel_type; //核函数类型 int degree; /* 使用于POLY模型 */ double gamma; /* for poly/rbf/sigmoid */ double coef0; /* for poly/sigmoid */ /* these are for training only */ double...