使用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 与