017 OpenCV 向量机SVM

目录

一、环境

二、SVM原理

三、完整代码


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、SVM原理

OpenCV中的向量机(SVM)是一种监督学习算法,用于分类和回归分析。它通过找到一个最优的超平面来将不同类别的数据分开,并使用支持向量来确定这个超平面的位置和方向。

SVM的基本思想是找到一个最优的超平面,使得两个类别之间的间隔最大化。这个间隔被称为“最大间隔”,而支持向量则是位于间隔边缘上的样本点。这些支持向量决定了最优超平面的位置和方向,因此它们也被称为“支持向量机”。

在OpenCV中,SVM可以用于二分类、多分类和回归分析。对于二分类问题,SVM会找到一个最优的超平面,将正类和负类分开。对于多分类问题,SVM会使用“一对一”或“一对多”策略来处理多个类别。对于回归分析问题,SVM会找到一个最优的超平面,将输入数据映射到一个连续的输出值上。

SVM的核心是核函数,它用于将输入数据映射到一个高维空间中。在高维空间中,数据更容易被分离,因为不同类别之间的距离更大。常用的核函数包括线性核、多项式核、径向基函数核(RBF)和sigmoid核等。不同的核函数适用于不同类型的数据,选择合适的核函数可以提高SVM的性能。

线性核是最简单的核函数,它将输入数据直接映射到高维空间中。如果数据的维度很高,那么线性核的效果可能不太好。多项式核可以将输入数据映射到一个更高维的空间中,但是它需要更多的计算资源。径向基函数核(RBF)是一种非常强大的核函数,它可以将输入数据映射到一个无限维的空间中。但是,RBF需要调整一个参数C来控制间隔的大小,这可能会影响模型的性能。sigmoid核可以将输入数据映射到一个概率空间中,它通常用于二分类问题。

总之,OpenCV中的向量机是一种强大的监督学习算法,可以用于分类和回归分析。它的核心是核函数,不同的核函数适用于不同类型的数据。选择合适的核函数可以提高SVM的性能,从而更好地解决实际问题。

三、完整代码

以下代码是在二维坐标系上,随便设置4个点,第一个点类别是:1;剩余三个点类别是:-1。向量机作用就是找到一个2维决策面(线),将上述两类点划分开。

import cv2 as cv
import numpy as np

# 设置训练数据(二分类)
labels = np.array([1, -1, -1, -1])
trainingData = np.matrix([[501, 10], [255, 10], [501, 255], [10, 501]], dtype=np.float32)

# 训练SVM
# 初始化
svm = cv.ml.SVM_create()
svm.setType(cv.ml.SVM_C_SVC)
svm.setKernel(cv.ml.SVM_LINEAR)
svm.setTermCriteria((cv.TERM_CRITERIA_MAX_ITER, 100, 1e-6))
# 开始训练
svm.train(trainingData, cv.ml.ROW_SAMPLE, labels)
# 用于数据可视化
width = 512
height = 512
image = np.zeros((height, width, 3), dtype=np.uint8)

# 显示不同类别区域
green = (0,255,0)
blue = (255,0,0)
for i in range(image.shape[0]):
    for j in range(image.shape[1]):
        sampleMat = np.matrix([[j,i]], dtype=np.float32)
        response = svm.predict(sampleMat)[1]

        if response == 1:
            image[i,j] = green
        elif response == -1:
            image[i,j] = blue
# 显示训练数据
thickness = -1
cv.circle(image, (501,  10), 5, (  0,   0,   0), thickness)
cv.circle(image, (255,  10), 5, (255, 255, 255), thickness)
cv.circle(image, (501, 255), 5, (255, 255, 255), thickness)
cv.circle(image, ( 10, 501), 5, (255, 255, 255), thickness)

# 显示支撑向量(决策边界)
thickness = 2
sv = svm.getUncompressedSupportVectors()

for i in range(sv.shape[0]):
    cv.circle(image, (int(sv[i,0]), int(sv[i,1])), 6, (128, 128, 128), thickness)
cv.imwrite('result.png', image) # save the image
cv.imshow('SVM Simple Example', image) # show it to the user
cv.waitKey()

相关推荐

  1. 支持向量SVM

    2023-12-08 06:06:07       31 阅读
  2. 支持向量SVM

    2023-12-08 06:06:07       33 阅读
  3. 支持向量SVM

    2023-12-08 06:06:07       31 阅读
  4. 支持向量SVM

    2023-12-08 06:06:07       29 阅读
  5. SVM支持向量

    2023-12-08 06:06:07       22 阅读
  6. 支持向量——SVM

    2023-12-08 06:06:07       17 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-08 06:06:07       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-08 06:06:07       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-08 06:06:07       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-08 06:06:07       20 阅读

热门阅读

  1. C#:内存分配

    2023-12-08 06:06:07       33 阅读
  2. 关于Go语言的底层,Slice,map

    2023-12-08 06:06:07       34 阅读
  3. hbase

    hbase

    2023-12-08 06:06:07      26 阅读
  4. 华纳云:宝塔面板下配置Discuz伪静态的步骤

    2023-12-08 06:06:07       37 阅读
  5. debian11,debian 如何删除虚拟内存,交换分区

    2023-12-08 06:06:07       38 阅读
  6. el-table进行列的拖拽

    2023-12-08 06:06:07       32 阅读
  7. c++的查找算法总结

    2023-12-08 06:06:07       29 阅读
  8. yolov5 获取漏检图片脚本

    2023-12-08 06:06:07       37 阅读
  9. 第57天:django学习(六)

    2023-12-08 06:06:07       31 阅读