脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - python中opencv支持向量机的实现

python中opencv支持向量机的实现

2022-10-31 10:14暴风雨中的白杨 Python

本文主要介绍了python中opencv支持向量机的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

支持向量机

支持向量机(Support Vector Machine, SVM)是一种二分类模型,目标是寻找一个标准(称为超平面)对样本数据进行分割,分割的原则是确保分类最优化(类别之间的间隔最大)。

当数据集较小时,使用支持向量机进行分类非常有效。

支持向量机是最好的现成分类器之一,“现成”是指分类器不加修改即可直接使用。

在对原始数据分类的过程中,可能无法使用线性方法实现分割。支持向量机在分类时,把无法线性分割的数据映射到高维空间,然后在高维空间找到分类最优的线性分类器。

Python支持向量机的库: sk-learn , LIBSVM等

OpenCV也提供了对支持向量机的支持

理论基础

python中opencv支持向量机的实现

用于划分不同类别的直线,就是分类器。

构造分类器时,非常重要的一项工作就是找到最优分类器。

找到支持向量机:在已有数据中,找到离分类器最近的点,确保它们离分类器尽可能地远。

离分类器最近的点到分类器的距离称为间隔(margin)。希望间隔尽可能地大,这样分类器在处理数据时,就会更准确。

python中opencv支持向量机的实现

离分类器最近的那些点叫作支持向量(support vector)。 决定了分类器所在的位置。

将不可分变为可分

支持向量机会将不那么容易分类的数据通过函数映射变为可分类的。

支持向量机在处理数据时,如果在低维空间内无法完成分类,就会自动将数据映射到高维空间,使其变为(线性)可分的。简单地讲,就是对当前数据进行函数映射操作。

python中opencv支持向量机的实现

例如: 在分类时,通过函数f的映射,让左图中本来不能用线性分类器分类的数据变为右图中线性可分的数据。

同时: 支持向量机能够通过核函数有效地降低计算复杂度。

实际上支持向量机可以处理任何维度的数据。在不同的维度下,支持向量机都会尽可能寻找类似于二维空间中的直线的线性分类器。

例如,在二维空间,支持向量机会寻找一条能够划分当前数据的直线;在三维空间,支持向量机会寻找一个能够划分当前数据的平面(plane);在更高维的空间,支持向量机会尝试寻找一个能够划分当前数据的超平面(hyperplane)。

一般情况下,把能够可以被一条直线(更一般的情况,即一个超平面)分割的数据称为线性可分的数据,所以超平面是线性分类器。

“支持向量机”是由“支持向量”和“机器”构成的。

  • “支持向量”是离分类器最近的那些点,这些点位于最大“间隔”上。通常情况下,分类仅依靠这些点完成,而与其他点无关。
  • “机器”指的是分类器。

支持向量机是一种基于关键点的分类算法。

SVM使用介绍

在使用支持向量机模块时,需要先使用函数cv2.ml.SVM_create()生成用于后续训练的空分类器模型。

语法格式:

?
1
svm = cv2.ml.SVM_create()

获取了空分类器svm后,针对该模型使用svm.train()函数对训练数据进行训练

语法格式

?
1
训练结果= svm.train(训练数据,训练数据排列格式,训练数据的标签)
  • 训练数据:表示原始数据,用来训练分类器。
  • 训练数据排列格式:原始数据的排列形式有按行排列(cv2.ml.ROW_SAMPLE,每一条训练数据占一行)和按列排列(cv2.ml.COL_SAMPLE,每一条训练数据占一列)两种形式
  • 训练数据的标签:原始数据的标签。
  • 训练结果:训练结果的返回值。

例如: 用于训练的数据为data,其对应的标签为label,每一条数据按行排列,对分类器模型svm进行训练,所使用的语句为:

?
1
返回值 = svm.train(data, cv2.ml.ROW_SAMPLE, label)

完成对分类器的训练后,使用svm.predict()函数即可使用训练好的分类器模型对测试数据进行分类,其语法格式为:

?
1
(返回值,返回结果) = svm.predict(测试数据)

OpenCV支持对多个参数的自定义,例如:可以通过setType()函数设置类别,通过setKernel()函数设置核类型,通过setC()函数设置支持向量机的参数C ( 惩罚系数,即对误差的宽容度,默认值为0 )。

例子介绍

题目: 已知员工的笔试成绩、面试成绩及对应的等级表现,根据新入职员工的笔试成绩、面试成绩预测其可能的表现。

首先构造一组随机数,并将其划分为两类,然后使用OpenCV自带的支持向量机模块完成训练和分类工作,最后将运算结果显示出来。

具体步骤:

  • 生成模拟数据

    模拟生成入职一年后表现为A级的员工入职时的笔试和面试成绩。

    构造20组笔试和面试成绩都分布在[95, 100)区间的数据对:

    ?
    1
    a = np.random.randint(95,100, (20, 2)).astype(np.float32)

    上述模拟成绩,在一年后对应的工作表现为A级。

    模拟生成入职一年后表现为B级的员工入职时的笔试和面试成绩。

    构造20组笔试和面试成绩都分布在[90, 95)区间的数据对:

    ?
    1
    b = np.random.randint(90,95, (20, 2)).astype(np.float32)

    上述模拟成绩,在一年后对应的工作表现为B级。

    最后,将两组数据合并,并使用numpy.array对其进行类型转换:

    ?
    1
    2
    data = np.vstack((a, b))
    data = np.array(data, dtype='float32')
  • 构造分组标签

    为对应表现为A级的分布在[95, 100)区间的数据,构造标签“0”:

    ?
    1
    aLabel=np.zeros((20,1))

    为对应表现为B级的分布在[90, 95)区间的数据,构造标签“1”:

    ?
    1
    bLabel=np.ones((20,1))

    将上述标签合并,并使用numpy.array对其进行类型转换:

    ?
    1
    2
    label = np.vstack((aLabel, bLabel))
    label = np.array(label, dtype='int32')
  • 训练

    用支持向量机模块对已知的数据和其对应的标签进行训练:

    ?
    1
    2
    svm = cv2.ml.SVM_create()
    result = svm.train(data, cv2.ml.ROW_SAMPLE, label)
  • 分类

    生成两个随机的数据对(笔试成绩,面试成绩)用于测试。

    ?
    1
    2
    test = np.vstack([[98,90], [90,99]])
    test = np.array(test, dtype='float32')

    使用函数svm.predict()对随机成绩分类:

    ?
    1
    (p1, p2) = svm.predict(test)
  • 显示分类结果

    将基础数据(训练数据)、用于测试的数据(测试数据)在图像上显示出来:

    ?
    1
    2
    3
    4
    plt.scatter(a[:,0], a[:,1], 80, 'g', 'o')
    plt.scatter(b[:,0], b[:,1], 80, 'b', 's')
    plt.scatter(test[:,0], test[:,1], 80, 'r', '*')
    plt.show()

    将测试数据及预测分类结果显示出来:

    ?
    1
    2
    print(test)
    print(p2)

完整程序

?
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
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 准备数据
a = np.random.randint(95,100, (20, 2)).astype(np.float32)
b = np.random.randint(90,95, (20, 2)).astype(np.float32)
data = np.vstack((a, b))
data = np.array(data, dtype='float32')
    
# 建立分组标签,0代表A级,1代表B级
aLabel=np.zeros((20,1))
bLabel=np.ones((20,1))
label = np.vstack((aLabel, bLabel))
label = np.array(label, dtype='int32')
    
# 训练
svm = cv2.ml.SVM_create()
# 属性设置,直接采用默认值即可
#svm.setType(cv2.ml.SVM_C_SVC)    # svm type
#svm.setKernel(cv2.ml.SVM_LINEAR) # line
#svm.setC(0.01)
result = svm.train(data, cv2.ml.ROW_SAMPLE, label)
    
#预测
test = np.vstack([[98,90], [90,99]])
test = np.array(test, dtype='float32')
(p1, p2) = svm.predict(test)   # test 是 [[数据1],[数据2]] 结构的
   
# 结果
print(test)
print("res1",p2[0])
print("res2",p2[1])
plt.scatter(a[:,0], a[:,1], 80, 'g', 'o')
plt.scatter(b[:,0], b[:,1], 80, 'b', 's')
plt.scatter(test[:,0], test[:,1], 80, 'r', '*')
plt.show()

到此这篇关于python中opencv支持向量机的实现的文章就介绍到这了,更多相关opencv 向量机内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7072647491044245512

延伸 · 阅读

精彩推荐
  • PythonPython判断Abundant Number的方法

    Python判断Abundant Number的方法

    这篇文章主要介绍了Python判断Abundant Number的方法,实例分析了Python针对盈数的判断技巧,需要的朋友可以参考下...

    小卒过河3052020-07-15
  • Pythonpython numpy数组复制使用实例解析

    python numpy数组复制使用实例解析

    这篇文章主要介绍了python numpy数组复制使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以...

    python大师4142020-04-29
  • Pythonpython组合无重复三位数的实例

    python组合无重复三位数的实例

    今天小编就为大家分享一篇python组合无重复三位数的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Guo_Apple10612021-04-19
  • Pythonpython查找与排序算法详解(示图+代码)

    python查找与排序算法详解(示图+代码)

    这篇文章主要介绍了python查找与排序算法详解(示图+代码),文章通过二分查找展开主题详细内容,需要的朋友可以参考一下...

    knighthood20013902022-07-26
  • Pythonpyqt添加启动等待界面的操作

    pyqt添加启动等待界面的操作

    这篇文章主要介绍了pyqt添加启动等待界面的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    人生苦短8002021-09-24
  • PythonPython实现批量下载文件

    Python实现批量下载文件

    之前给大家分享的python 多线程抓取网页,不过这个只能用python 来抓取到网页的源代码,如果你想用做python 下载文件的话,上面的可能就不适合你了,最近...

    脚本之家11192020-06-30
  • PythonPython 通过xpath属性爬取豆瓣热映的电影信息

    Python 通过xpath属性爬取豆瓣热映的电影信息

    我喜欢看电影,可以说大部分热门电影我都看过。处理爱好的目的,我看了看豆瓣热映的电影列表。于是我写了这个爬虫把豆瓣热映的电影都爬了下来。对...

    剑客阿良_ALiang6202022-02-28
  • PythonPython 爬虫之Beautiful Soup模块使用指南

    Python 爬虫之Beautiful Soup模块使用指南

    这篇文章主要介绍了Python 爬虫之Beautiful Soup模块使用指南,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    hoxis11552021-03-13