前言: 对于SVM的了解,看前辈写的博客加上读论文对于SVM的皮毛知识总算有点了解,比如线性分类器,和求凸二次规划中用到的高等数学知识。然而SVM最核心的地方应该在于核函数和求关于α函数的极值的方法:SMO算法(当然还有很多别的算法。libsvm使用的是SMO,SMO算法也是最高效和简单的),还有松弛变量。。毕设答辩在即,这两个难点只能拖到后面慢慢去研究了。
于是我便是用了LibSvm,也就是台湾大学某某教授写的一个专门用于svm的工具包,其中有java语言的,python语言的,c语言的。我只拿了其中的两个文件svm.cpp 和svm.h ,这两个c语言的头文件和源文件已经可以直接拿来训练模型和预判分类了。这篇博客也只是照葫芦画瓢,利用已经写好的libsvm,做一个基于.net core的api接口,对于libsvm的内部实现都不甚了解。所在我是站在巨人的肩膀上学习,什么都是现成的。如果需要你自己去开发和创新,那么就意味着你已经站在芸芸众生的上面了。
目录:
文本分类学习(一)开篇
文本分类学习(二)文本表示
文本分类学习(三)特征权重(TF/IDF)和特征提取
文本分类学习(四)特征选择之卡方检验
文本分类学习(五)机器学习SVM的前奏-特征提取(卡方检验续集)
文本分类学习(六)AdaBoost和SVM(残)
文本分类学习(七)支持向量机SVM 的前奏 结构风险最小化和VC维度理论
文本分类学习(八)SVM 入门之线性分类器
文本分类学习(九)SVM入门之拉格朗日函数和KKT条件
一,LibSvm的简单介绍
这里只介绍libSvm中的C语言版本,也就是前言中说的svm.cpp和svm.h。
1.结构体介绍
svm.h 文件包含了svm中所有的结构体和函数声明。
首先是 结构体svm_node
struct svm_node
{
int index;
double value
};
svm_node 是用来储存单个文本向量的单个特征,结构体只有两个属性一个是下标,一个是值。很显然如果一个文本向量的表示肯定是一个svm_node[] 数组。值得注意的是libsvm中,对于特征值为0,也就是value为0的特征,可以不用放到svm_node[]数组里这样会简化计算。此外,svm_node[]数组的最后一个元素index的值必须是-1且value值为null,是一个文本向量的结束标志。
然后是 结构体svm_problem
struct svm_problem
{
int l;
double *y;
struct svm_node **x;
};
前面的svm_node是表示单个文本向量,那么svm_problem便表示的是整个训练集了。其中l是训练集的个数,y是一个数组表示训练集的标签,x是一个二维数组自然表示训练集的文本向量。注意在二分类问题中y数组的值应该是+1或者-1。
接下来是 结构体svm_parameter
struct svm_parameter
{
int svm_type;
int kernel_type;
int degree; /* for poly /
double gamma; / for poly/rbf/sigmoid /
double coef0; / for poly/sigmoid */
/* these are for training only */
double cache_size; /* in MB */
double eps; /* stopping criteria */
double C; /* for C_SVC, EPSILON_SVR and NU_SVR */
int nr_weight; /* for C_SVC */
int *weight_label; /* for C_SVC */
double* weight; /* for C_SVC */
double nu; /* for NU_SVC, ONE_CLASS, and NU_SVR */
double p; /* for EPSILON_SVR */
int shrinking; /* use the shrinking heuristics */
int probability; /* do probability estimates */