对于Dlib库的学习,主要是对库中例子的分析
本次是关于svm_struct_ex.cpp(结构支持向量机)的学习,在例子中建立了关于多分类的支持向量机。其实多分类支持向量机,就是把n分类问题变为n个二分类问题,在输出当中也会有n个结果,数值最大的类就是该样本的预测值。
以下是例子中的所用到的主要类
一、构建svm的求解问题
structural_svm_problem_thread
该类属于抽象类,不能实例化,并且继承于structural_svm_problem,该类是用于构建svm的求解问题。继承该抽象类,必须重载以下四个纯虚函数:
virtual long get_num_dimensions () const = 0; //返回值:特征数*类别数
virtual long get_num_samples () const = 0; //返回值:样本数
virtual void get_truth_joint_feature_vector (
long idx,
feature_vector_type& psi
) const = 0; //生成样本+标签的样本向量 维度:特征数*类别数
virtual void separation_oracle (
const long idx,
const matrix_type& current_solution,//权重矩阵
scalar_type& loss,
feature_vector_type& psi
) const = 0; //计算支持向量机的输出和loss
关于feature_vector_type-用于计算的实际样本向量 维数:特征数*类别数
例如:3类为0,1,2,3个特征 则属于类0的样本向量feature_vector_type为[x1,x2,x3,0,0,0,0,0,0];
类中设置参数的函数
set_C(1); //正则化的常数
set_epsilon(0.0001) //设置eps值,软间隔的松弛量,默认为0.001
类中常用的函数
set_rowm-矩阵的整行的赋值、set_colm-矩阵的整列的赋值、dot-计算内积
最后,该类所构建的求解问题:
其中,Y-是预测值 ,多个支持向量机输出的的最大值,y_i-是标签值,C-为正则化常数,防止过拟合,eps-是松弛变量,越小拟合度越高。
该最小化函数所满足的KTT条件:
一、||w||=0 该条件就是间隔最大化的条件
二、Loss(i,Y)=0 该条件对应于我们设计的损失函数,当分类正确时值=0,当分类错误时值大于0
三、F(x_i,Y|w)-F(x_i,y_i|w)=0 该条件和平常的二分类问题并不一样,对应于n分类问题,需要求解n个支持向量机,支持向量机输出值最大的那个就是该样本的类标签,当预测输出和标签类所对应的支持向量机的输出差为0时,就是分类正确的时候,否则差值会为一个正数。
总结:这个类可以方便的构建一个SVM的多分类问题,允许我自定义损失函数,设置正则化常数,设置松弛变量,并且可以运用多线程进行求解运算,但是实际运行来看貌似CPU的运行跑不满,作为线性结构,没有核函数,不适用于非线性问题。
二、问题的求解
所用到的的类
//oca-求解的类
oca solver;
solver(problem, weights);
在例程中的运用是这样的,但是点进去会发现该类重载了运算符(),在经过类型和参数的检查后,由private模板函数oca_impl进行求解运算,好像是用的lasso和smo算法,并没有作深入的了解,使用的时候也没有自己设置参数。
三、总结
以上是关于,dlib库的源码学习,其实,我用这个多分类的svm例子,作为线性结构,对kaggle的泰坦尼克号数据集,进行了二分类,效果很差。可能他所构建的没有用到非线性核函数的方法,或者是关于这正则化项和松弛变量的设置问题,还都有待尝试。