文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

python中opencv支持向量机的实现

2024-04-02 19:55

关注

支持向量机

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

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

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

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

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

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

理论基础

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

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

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

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

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

将不可分变为可分

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

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

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

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

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

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

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

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

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

SVM使用介绍

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

语法格式:

svm = cv2.ml.SVM_create()

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

语法格式

训练结果= svm.train(训练数据,训练数据排列格式,训练数据的标签) 

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

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

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

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

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

例子介绍

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

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

具体步骤:

完整程序

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 向量机内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯