<OpenCV> SVM参数配置

OpenCV SVM

模型参数配置

  • Types
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。
}
  • KernelTypes
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γxixj2 γ > 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)=(xixj)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)

  • ParamTypes
enum cv::ml::SVM::ParamTypes
{
	C=0, 	
	GAMMA=1, 	
	P=2, 	
	NU=3, 	
	COEF=4, 	
	DEGREE=5
}
  • 创建空的模型
    使用StatModel::train来训练模型。由于SVM有几个参数,您可能希望为您的问题找到最佳参数,这可以使用SVM::trainAuto完成。
static Ptr<SVM> cv::ml::SVM::create()
  • 从文件加载并创建序列化的支持向量机
    使用SVM::save序列化并存储SVM到磁盘。通过调用这个函数并指定文件的路径,再次从这个文件加载SVM。
static Ptr<SVM> cv::ml::SVM::load(const String& filepath)	
//!< 参数
//!< filepath	 序列化支持向量机的路径
  • 支持向量机优化问题的参数:C
    类别数量,支持向量机::C_SVC、支持向量机::EPS_SVR或支持向量机::NU_SVR。默认值为0。
virtual void cv::ml::SVM::setC(double val)	
  • 支持向量机::C_SVC问题中的可选权值,分配给特定的类
    它们乘以 C C C,则类 i i i的参数 C C C就变成了 c l a s s W e i g h t s ( i ) ∗ C classWeights(i) *C classWeights(i)C,因此这些权重影响不同类的误分类惩罚。权重越大,对应类数据的错误分类惩罚越大。默认值为空Mat。
virtual void cv::ml::SVM::setClassWeights(const cv::Mat& val)	
  • 核函数的参数:coef0
    对于SVM::POLY或SVM::SIGMOID。默认值为0。
virtual void cv::ml::SVM::setCoef0(double val)	
  • 当设置了自定义内核
virtual void cv::ml::SVM::setCustomKernel(const Ptr<Kernel>& _kernel)	
  • 核函数的参数:degree
    对于SVM::POLY。默认值为0。
virtual void cv::ml::SVM::setDegree(double val)
  • 核函数的参数:γ
    SVM::POLY, SVM::RBF, SVM::SIGMOID或SVM::CHI2。默认值为1。
virtual void cv::ml::SVM::setGamma(double val)	
  • 支持向量机核的类型
    SVM:: KernelTypes。默认值为SVM::RBF。
virtual void cv::ml::SVM::setKernel(int kernelType)	
  • SVM优化问题的参数:ν
    SVM::NU_SVC, SVM::ONE_CLASS或SVM::NU_SVR。默认值为0。
virtual void cv::ml::SVM::setNu(double val)	
  • 支持向量机的参数柱一优化问题
    SVM::EPS_SVR。默认值为0。
virtual void cv::ml::SVM::setP(double val)	
  • 终止迭代支持向量机训练的条件
    您可以指定最大迭代次数及训练终止的指定精度。默认值是TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 1000, FLT_EPSILON);
virtual void cv::ml::SVM::setTermCriteria(const cv::TermCriteria& val)	
  • 支持向量机公式的类型
    SVM:Type。默认值为SVM::C_SVC。
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 )
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值