OpenCV机器学习(9)向量机(Support Vector Machine, SVM)cv::ml::SVM

  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::ml::SVM 是 OpenCV 机器学习模块中的一部分,用于实现支持向量机(Support Vector Machine, SVM)。SVM 是一种强大的监督学习算法,主要用于分类和回归分析。它通过找到一个最优的超平面来区分不同类别的数据点,或者在回归任务中预测连续值。

主要特点

  • 二分类与多分类:虽然SVM本质上是为二分类问题设计的,但OpenCV中的SVM可以通过一对多策略处理多分类问题。
  • 核函数支持:支持线性、多项式、RBF(径向基函数)、Sigmoid等多种核函数,允许非线性分类。
  • 参数调节:提供了多种参数调节选项,如惩罚因子C、核函数参数等,以优化模型性能。

常用成员函数

以下是一些常用的 cv::ml::SVM 类成员函数:

  • 创建模型实例
    • Ptr create():创建一个新的 SVM 模型实例。
  • 设置模型参数
    • void setType(int val):设置SVM类型(如 C_SVC, NU_SVC, ONE_CLASS, EPS_SVR, NU_SVR)。
    • void setKernel(int val):设置使用的核函数类型(如 LINEAR, POLY, RBF, SIGMOID)。
    • void setC(double val):设置SVM的惩罚参数C,默认值为1。
    • void setGamma(double val):设置核函数的gamma参数(对于RBF、POLY、SIGMOID核)。
    • void setDegree(double val):设置多项式核的度数。
    • void setCoef0(double val):设置核函数的系数0(对于POLY、SIGMOID核)。
    • void setNu(double val):设置ν-SVC、ν-SVR中的ν参数。
    • void setP(double val):设置ε-SVR中的ε值。

训练模型

  • bool train(const Ptr& trainData, int flags=0):使用提供的训练数据进行训练。
  • bool train(InputArray samples, int layout, InputArray responses):另一种形式的训练函数,直接接受样本和响应矩阵作为输入。

预测

  • float predict(InputArray samples, OutputArray results=noArray(), int flags=0) const:对新样本进行预测,并返回每个样本的类别标签或预测值(取决于标志)。

加载与保存模型

  • void save(const String& filename) const:将模型保存到文件。
  • static Ptr load(const String& filename):从文件加载模型。

代码示例

cpp 复制代码
#include <iostream>
#include <opencv2/ml.hpp>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace cv::ml;
using namespace std;

int main()
{
    // 准备训练数据
    Mat samples = ( Mat_< float >( 4, 2 ) << 0.5, 1.0, 1.0, 1.5, 2.0, 0.5, 1.5, 0.0 );

    Mat responses = ( Mat_< int >( 4, 1 ) << 0, 0, 1, 1 );

    // 确保数据和标签是正确的类型
    if ( samples.type() != CV_32F )
    {
        samples.convertTo( samples, CV_32F );
    }
    if ( responses.type() != CV_32S )
    {  // 对于分类任务,标签通常是整数类型
        responses.convertTo( responses, CV_32S );
    }

    // 创建并配置 SVM 模型
    Ptr< SVM > svm_model = SVM::create();
    svm_model->setType( SVM::C_SVC );  // 设置SVM类型为C-SVC
    svm_model->setKernel( SVM::RBF );  // 使用RBF核函数
    svm_model->setC( 1 );              // 设置惩罚参数C
    svm_model->setGamma( 0.5 );        // 设置RBF核的gamma参数

    // 使用TrainData创建训练数据对象
    Ptr< TrainData > trainData = TrainData::create( samples, ROW_SAMPLE, responses );

    // 训练模型
    bool ok = svm_model->train( trainData );
    if ( ok )
    {
        // 保存模型
        svm_model->save( "svm_model.yml" );

        // 对新样本进行预测
        Mat sample     = ( Mat_< float >( 1, 2 ) << 1.6, 0.7 );
        float response = svm_model->predict( sample );

        cout << "The predicted response for the sample is: " << response << endl;
    }
    else
    {
        cerr << "Training failed!" << endl;
    }

    return 0;
}

运行结果

bash 复制代码
The predicted response for the sample is: 1
相关推荐
阿linlin6 分钟前
OpenCV--图像预处理学习01
opencv·学习·计算机视觉
jndingxin3 小时前
OpenCV 图形API(10)用于执行标量除以矩阵的逐元素操作函数divRC()
人工智能·opencv
Blossom.1184 小时前
量子计算与经典计算的融合与未来
人工智能·深度学习·机器学习·计算机视觉·量子计算
硅谷秋水5 小时前
MoLe-VLA:通过混合层实现的动态跳层视觉-语言-动作模型实现高效机器人操作
人工智能·深度学习·机器学习·计算机视觉·语言模型·机器人
weixin_442424035 小时前
Opencv计算机视觉编程攻略-第七节 提取直线、轮廓和区域
人工智能·opencv·计算机视觉
小李独爱秋6 小时前
机器学习开发全流程详解:从数据到部署的完整指南
人工智能·机器学习
闲人编程6 小时前
形态学操作(腐蚀/膨胀/开闭运算)
python·opencv·图像识别
Dovis(誓平步青云)6 小时前
深挖 DeepSeek 隐藏玩法·智能炼金术2.0版本
人工智能·深度学习·机器学习·数据挖掘·服务发现·智慧城市
ZTLJQ6 小时前
基于机器学习的三国时期诸葛亮北伐失败因素量化分析
人工智能·算法·机器学习
赵钰老师7 小时前
【Deepseek、ChatGPT】智能气候前沿:AI Agent结合机器学习与深度学习在全球气候变化驱动因素预测中的应用
人工智能·python·深度学习·机器学习·数据分析