enum cv::ml::SVM::Types
{
C_SVC=100, //!< C-Support向量分类。n类分类(n≥2),允许对异常值使用惩罚乘子C进行不完全分类。
NU_SVC=101, //!< ν支持向量分类。n类分类,可能不完全分离。参数ν(范围0-1、值越大,决策边界越平滑),用来代替C。
ONE_CLASS=102, //!< 分布估计(一类支持向量机)。所有的训练数据都来自同一类,支持向量机建立了一个边界,将类从特征空间的其余部分分离出来。
EPS_SVR=103, //!< ϵ支持向量回归。从训练集到拟合超平面的特征向量之间的距离必须小于p。对于异常值,使用惩罚乘法器C。
NU_SVR=104 //!< ν支持向量回归。ν代替p。
}
enum cv::ml::SVM::KernelTypes
{
CUSTOM=-1, //!< 当设置了自定义内核时,由SVM::getKernelType返回;
LINEAR=0, //!< 线性内核。相当于不进行映射处理,在原始特征空间中进行线性判别(或回归)。这是运行速度最快的选择,但是拟合程度不高;
POLY=1, //!< 多项式的内核 ;参数:[GAMMA,COEF,DEGREE]
RBF=2, //!< 径向基函数(RBF)是一种很好的选择;参数:[GAMMA]
SIGMOID=3, //!< Sigmoid kernel;参数:[GAMMA,COEF]
CHI2=4, //!< Chi2指数核,类似于RBF核;参数:[GAMMA]
INTER=5 //!< 直方图相交的内核。一个快速的内核。
}
LINEAR: K ( x i , x j ) = x i T x j K(x_i,x_j)=x_i^Tx_j K(xi,xj)=xiTxj
POLY: K ( x i , x j ) = ( γ x i T x j + c o e f 0 ) d e g r e e K(x_i,x_j)=(γx_i^Tx_j+coef0)^{degree} K(xi,xj)=(γxiTxj+coef0)degree
RBF: K ( x i , x j ) = e − γ ∣ ∣ x i − x j ∣ ∣ 2 K(x_i,x_j)=e^{-γ||x_i-x_j||^2} K(xi,xj)=e−γ∣∣xi−xj∣∣2, γ > 0 γ>0 γ>0
SIGMOID: t a n h ( γ x i T x j + c o e f 0 ) tanh(γx_i^Tx_j+coef0) tanh(γxiTxj+coef0)
CHI2: K ( x i , x j ) = e − γ χ 2 ( x i , x j ) K(x_i,x_j)=e^{-γ\chi^2(x_i,x_j)} K(xi,xj)=e−γχ2(xi,xj), χ 2 ( x i , x j ) = ( x i − x j ) 2 / ( x i + x j ) , γ > 0 \chi^2(x_i,x_j)=(x_i-x_j)^2/(x_i+x_j),γ>0 χ2(xi,xj)=(xi−xj)2/(xi+xj),γ>0
INTER: K ( x i , x j ) = m i n ( x i , x j ) K(x_i,x_j)=min(x_i,x_j) K(xi,xj)=min(xi,xj)
enum cv::ml::SVM::ParamTypes
{
C=0,
GAMMA=1,
P=2,
NU=3,
COEF=4,
DEGREE=5
}
static Ptr<SVM> cv::ml::SVM::create()
static Ptr<SVM> cv::ml::SVM::load(const String& filepath)
//!< 参数
//!< filepath 序列化支持向量机的路径
virtual void cv::ml::SVM::setC(double val)
virtual void cv::ml::SVM::setClassWeights(const cv::Mat& val)
virtual void cv::ml::SVM::setCoef0(double val)
virtual void cv::ml::SVM::setCustomKernel(const Ptr<Kernel>& _kernel)
virtual void cv::ml::SVM::setDegree(double val)
virtual void cv::ml::SVM::setGamma(double val)
virtual void cv::ml::SVM::setKernel(int kernelType)
virtual void cv::ml::SVM::setNu(double val)
virtual void cv::ml::SVM::setP(double val)
virtual void cv::ml::SVM::setTermCriteria(const cv::TermCriteria& val)
virtual void cv::ml::SVM::setType ( int val )
virtual bool cv::ml::SVM::trainAuto(const Ptr<TrainData>& data,
int kFold = 10,
ParamGrid Cgrid = getDefaultGrid(C),
ParamGrid gammaGrid = getDefaultGrid(GAMMA),
ParamGrid pGrid = getDefaultGrid(P),
ParamGrid nuGrid = getDefaultGrid(NU),
ParamGrid coeffGrid = getDefaultGrid(COEF),
ParamGrid degreeGrid = getDefaultGrid(DEGREE),
bool balanced = false)
//!< 参数
//!< data 可以使用TrainData::create或TrainData::loadFromCSV构造的训练数据。
//!< kFold 交叉验证参数。训练集被划分为kFold子集。其中一个子集用于测试模型,其他子集构成列车集。因此,SVM算法执行kFold次。
//!< Cgrid grid for C
//!< gammaGrid grid for gamma
//!< pGrid grid for p
//!< nuGrid grid for nu
//!< coeffGrid grid for coeff
//!< degreeGrid grid for degree
//!< balanced 如果问题是2类分类,则该方法创建更平衡的交叉验证子集,子集中的类之间的比例接近于整个训练数据集中的比例。
virtual bool cv::ml::SVM::trainAuto (InputArray samples,
int layout,
InputArray responses,
int kFold = 10,
Ptr<ParamGrid> Cgrid = SVM::getDefaultGridPtr(SVM::C),
Ptr<ParamGrid> gammaGrid = SVM::getDefaultGridPtr(SVM::GAMMA),
Ptr<ParamGrid> pGrid = SVM::getDefaultGridPtr(SVM::P),
Ptr<ParamGrid> nuGrid = SVM::getDefaultGridPtr(SVM::NU),
Ptr<ParamGrid> coeffGrid = SVM::getDefaultGridPtr(SVM::COEF),
Ptr<ParamGrid> degreeGrid = SVM::getDefaultGridPtr(SVM::DEGREE),
bool balanced = false)
//!< 参数
//!< samples 训练样本
//!< layout ROW_SAMPLE or COL_SAMPLE
//!< responses 与训练样本相关的响应向量。
//!< kFold 交叉验证参数。训练集被划分为kFold子集。其中一个子集用于测试模型,其他子集构成训练集。
//!< Cgrid grid for C
//!< gammaGrid grid for gamma
//!< pGrid grid for p
//!< nuGrid grid for nu
//!< coeffGrid grid for coeff
//!< degreeGrid grid for degree
//!< balanced 如果问题是2类分类,则该方法创建更平衡的交叉验证子集,子集中的类之间的比例接近于整个训练数据集中的比例。
virtual bool train( const Ptr<TrainData>& trainData, int flags=0 )
virtual bool train( InputArray samples, int layout, InputArray responses )