我是靠谱客的博主 高大过客,这篇文章主要介绍<OpenCV> SVM参数配置,现在分享给大家,希望可以做个参考。

OpenCV SVM

模型参数配置

  • Types
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
复制代码
1
2
3
4
5
6
7
8
9
10
enum cv::ml::SVM::ParamTypes { C=0, GAMMA=1, P=2, NU=3, COEF=4, DEGREE=5 }
  • 创建空的模型
    使用StatModel::train来训练模型。由于SVM有几个参数,您可能希望为您的问题找到最佳参数,这可以使用SVM::trainAuto完成。
复制代码
1
2
static Ptr<SVM> cv::ml::SVM::create()
  • 从文件加载并创建序列化的支持向量机
    使用SVM::save序列化并存储SVM到磁盘。通过调用这个函数并指定文件的路径,再次从这个文件加载SVM。
复制代码
1
2
3
4
5
static Ptr<SVM> cv::ml::SVM::load(const String& filepath) //!< 参数 //!< filepath 序列化支持向量机的路径
  • 支持向量机优化问题的参数:C
    类别数量,支持向量机::C_SVC、支持向量机::EPS_SVR或支持向量机::NU_SVR。默认值为0。
复制代码
1
2
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。
复制代码
1
2
virtual void cv::ml::SVM::setClassWeights(const cv::Mat& val)
  • 核函数的参数:coef0
    对于SVM::POLY或SVM::SIGMOID。默认值为0。
复制代码
1
2
virtual void cv::ml::SVM::setCoef0(double val)
  • 当设置了自定义内核
复制代码
1
2
virtual void cv::ml::SVM::setCustomKernel(const Ptr<Kernel>& _kernel)
  • 核函数的参数:degree
    对于SVM::POLY。默认值为0。
复制代码
1
2
virtual void cv::ml::SVM::setDegree(double val)
  • 核函数的参数:γ
    SVM::POLY, SVM::RBF, SVM::SIGMOID或SVM::CHI2。默认值为1。
复制代码
1
2
virtual void cv::ml::SVM::setGamma(double val)
  • 支持向量机核的类型
    SVM:: KernelTypes。默认值为SVM::RBF。
复制代码
1
2
virtual void cv::ml::SVM::setKernel(int kernelType)
  • SVM优化问题的参数:ν
    SVM::NU_SVC, SVM::ONE_CLASS或SVM::NU_SVR。默认值为0。
复制代码
1
2
virtual void cv::ml::SVM::setNu(double val)
  • 支持向量机的参数柱一优化问题
    SVM::EPS_SVR。默认值为0。
复制代码
1
2
virtual void cv::ml::SVM::setP(double val)
  • 终止迭代支持向量机训练的条件
    您可以指定最大迭代次数及训练终止的指定精度。默认值是TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 1000, FLT_EPSILON);
复制代码
1
2
virtual void cv::ml::SVM::setTermCriteria(const cv::TermCriteria& val)
  • 支持向量机公式的类型
    SVM:Type。默认值为SVM::C_SVC。
复制代码
1
2
3
virtual void cv::ml::SVM::setType ( int val )
  • 自动训练
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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类分类,则该方法创建更平衡的交叉验证子集,子集中的类之间的比例接近于整个训练数据集中的比例。
  • 自动训练
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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类分类,则该方法创建更平衡的交叉验证子集,子集中的类之间的比例接近于整个训练数据集中的比例。
  • 常规训练
复制代码
1
2
3
virtual bool train( const Ptr<TrainData>& trainData, int flags=0 ) virtual bool train( InputArray samples, int layout, InputArray responses )

最后

以上就是高大过客最近收集整理的关于<OpenCV> SVM参数配置的全部内容,更多相关<OpenCV>内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部