概述
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−γ∣∣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)
- 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 )
最后
以上就是高大过客为你收集整理的<OpenCV> SVM参数配置的全部内容,希望文章能够帮你解决<OpenCV> SVM参数配置所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复