CvSVM
支持矢量机
class CvSVM : public CvStatModel //继承自基类CvStatModel
{
public:
// SVM type
enum { C_SVC=100, NU_SVC=101, ONE_CLASS=102, EPS_SVR=103, NU_SVR=104 };//SVC是SVM分类器,SVR是SVM回归
// SVM kernel type
enum { LINEAR=0, POLY=1, RBF=2, SIGMOID=3 }; //提供四种核函数,分别是线性,多项式,径向基,sigmoid型函数。
CvSVM();
virtual ~CvSVM();
CvSVM( const CvMat* _train_data, const CvMat* _responses,
const CvMat* _var_idx=0, const CvMat* _sample_idx=0,
CvSVMParams _params=CvSVMParams() );
virtual bool train( const CvMat* _train_data, const CvMat* _responses,
const CvMat* _var_idx=0, const CvMat*_sample_idx=0,
CvSVMParams_params=CvSVMParams() );
virtual float predict( const CvMat* _sample ) const;
virtual int get_support_vector_count() const;
virtual const float* get_support_vector(int i) const;
virtual void clear();
virtual void save( const char* filename, const char* name=0 );
virtual void load( const char* filename, const char* name=0 );
virtual void write( CvFileStorage* storage,const char* name );
virtual void read( CvFileStorage* storage, CvFileNode* node );
int get_var_count() const { return var_idx ? var_idx->cols : var_all;}
protected:
...
};
CvSVMParams
SVM训练参数struct
struct CvSVMParams
{
CvSVMParams();
CvSVMParams( int _svm_type, int _kernel_type,
double _degree, double _gamma,double _coef0,
double _C, double _nu, double_p,
CvMat* _class_weights, CvTermCriteria_term_crit );
int svm_type;
int kernel_type;
double degree; // for poly
double gamma; // for poly/rbf/sigmoid
double coef0; // for poly/sigmoid
double C; // for CV_SVM_C_SVC, CV_SVM_EPS_SVR andCV_SVM_NU_SVR
double nu; // forCV_SVM_NU_SVC, CV_SVM_ONE_CLASS, and CV_SVM_NU_SVR
double p; // forCV_SVM_EPS_SVR
CvMat* class_weights; // forCV_SVM_C_SVC
CvTermCriteria term_crit; // termination criteria
};
svm_type,SVM的类型:
CvSVM::C_SVC - n(n>=2)分类器,允许用异常值惩罚因子C进行不完全分类。
CvSVM::NU_SVC - n类似然不完全分类的分类器。参数nu取代了c,其值在区间【0,1】中,nu越大,决策边界越平滑。
CvSVM::ONE_CLASS - 单分类器,所有的训练数据提取自同一个类里,然后SVM建立了一个分界线以分割该类在特征空间中所占区域和其它类在特征空间中所占区域。
CvSVM::EPS_SVR - 回归。 训练集中的特征向量和拟合出来的超平面的距离需要小于p。异常值惩罚因子C被采用。
CvSVM::NU_SVR - 回归;nu 代替了p
kernel_type//核类型:
CvSVM::LINEAR - 没有任何向映像至高维空间,线性区分(或回归)在原始特征空间中被完成,这是最快的选择。 d(x,y) = x•y == (x,y)
CvSVM::POLY - 多项式核: d(x,y)= (gamma*(x•y)+coef0)degree
CvSVM::RBF - 径向基,对于大多数情况都是一个较好的选择:d(x,y)= exp(-gamma*|x-y|2)
CvSVM::SIGMOID - sigmoid函数被用作核函数:d(x,y) = tanh(gamma*(x•y)+coef0)
degree, gamma, coef0:都是核函数的参数,具体的参见上面的核函数的方程。
C, nu, p:在一般的SVM优化求解时的参数。
class_weights:可选权重,赋给指定的类别。一般乘以C以后去影响不同类别的错误分类惩罚项。权重越大,某一类别的误分类数据的惩罚项就越大。
term_crit:SVM的迭代训练过程的中止。(解决了部分受约束二次最优问题)
该结构需要初始化,并传递给CvSVM的训练函数。
CvSVM::train
训练SVM
bool CvSVM::train( const CvMat*_train_data, const CvMat* _responses,
const CvMat* _var_idx=0,const CvMat* _sample_idx=0,
CvSVMParams_params=CvSVMParams() );
训练SVM 模型的方法。它遵循的泛型训练"方法"的约定具有以下限制:仅支持 CV_ROW_SAMPLE 的数据布局、所有命令输入的变量、输出变量可以是断然(_params.svm_type=CvSVM::C_SVC 或_params.svm_type=CvSVM::NU_SVC)或命令 (_params.svm_type=CvSVM::EPS_SVR或 _params.svm_type=CvSVM::NU_SVR) 或不需要在所有(_params.svm_type=CvSVM:: ONE_CLASS),不支持缺省值。所有的参数都被集成在CvSVMParams这个结构中。
CvSVM::get_support_vector*
得到支持矢量和特殊矢量的数
int CvSVM::get_support_vector_count()const;
const float* CvSVM::get_support_vector(inti) const;
这个方法可以被用来得到支持矢量的集合。