win10+Python3.7.3+OpenCV3.4.1入门学习(二十一章 支持向量机)———— 21.2 SVM案例介绍

Python版本是Python3.7.3,OpenCV版本OpenCV3.4.1,开发环境为PyCharm

21.2 SVM案例介绍

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

svm = cv2.ml.SVM_create( )

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

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

式中参数的含义如下:
● 训练数据:表示原始数据,用来训练分类器。例如,前面讲的招聘的例子中,员工的笔试成绩、面试成绩都是原始的训练数据,可以用来训练支持向量机。
● 训练数据排列格式:原始数据的排列形式有按行排列(cv2.ml.ROW_SAMPLE,每一条训练数据占一行)和按列排列(cv2.ml.COL_SAMPLE,每一条训练数据占一列)两种形式,根据数据的实际排列情况选择对应的参数即可。
● 训练数据的标签:原始数据的标签。
● 训练结果:训练结果的返回值。
例如,用于训练的数据为data,其对应的标签为label,每一条数据按行排列,对分类器模型svm进行训练,所使用的语句为:

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

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

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

以上是支持向量机模块的基本使用方法。在实际使用中,可能会根据需要对其中的参数进行调整。OpenCV支持对多个参数的自定义,例如:可以通过setType()函数设置类别,通过setKernel()函数设置核类型,通过setC()函数设置支持向量机的参数C(惩罚系数,即对误差的宽容度,默认值为0)。
下面通过一个具体案例介绍如何在Python中调用OpenCV的支持向量机模块进行分类操作。

eg1:已知老员工的笔试成绩、面试成绩及对应的等级表现,根据新入职员工的笔试成绩、面试成绩预测其可能的表现。
根据题目要求,首先构造一组随机数,并将其划分为两类,然后使用OpenCV自带的支持向量机模块完成训练和分类工作,最后将运算结果显示出来。具体步骤如下。
1.生成模拟数据
首先,模拟生成入职一年后表现为A级的员工入职时的笔试和面试成绩。构造20组笔试和面试成绩都分布在[95, 100)区间的数据对:

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

上述模拟成绩,在一年后对应的工作表现为A级。
接下来,模拟生成入职一年后表现为B级的员工入职时的笔试和面试成绩。构造20组笔试和面试成绩都分布在[90, 95)区间的数据对:

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

上述模拟成绩,在一年后对应的工作表现为B级。
最后,将两组数据合并,并使用numpy.array对其进行类型转换:

data = np.vstack((a, b))
data = np.array(data, dtype='float32')

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

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

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

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

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

label = np.vstack((aLabel, bLabel))
label = np.array(label, dtype='int32')

3.训练

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

svm = cv2.ml.SVM_create()
result = svm.train(data, cv2.ml.ROW_SAMPLE, label)

4.分类
生成两个随机的数据对(笔试成绩,面试成绩)用于测试。可以用随机数,也可以直接指定两个数字。
这里,我们想观察一下笔试和面试成绩差别较大的数据如何分类。用如下语句生成成绩:

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

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

(p1, p2) = svm.predict(test)

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

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()

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

print(test)
print(p2)

程序如下:

import cv2
import numpy as np
import matplotlib.pyplot as plt
#第1步 准备数据
# A等级的笔试、面试分数
a = np.random.randint(95,100, (20, 2)).astype(np.float32)
# B等级的笔试、面试分数
b = np.random.randint(90,95, (20, 2)).astype(np.float32)
#合并数据
data = np.vstack((a,b))
data = np.array(data,dtype='float32')
#第2步 建立分组标签,0代表A等级,1代表B等级
#aLabel对应着a的标签,为类型0-等级A
aLabel=np.zeros((20,1))
#bLabel对应着b的标签,为类型1-等级B
bLabel=np.ones((20,1))
#合并标签
label = np.vstack((aLabel, bLabel))
label = np.array(label,dtype='int32')
#第3步 训练
# ml 机器学习模块 SVM_create() 创建
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)
#第4步 预测
#生成两个随机的(笔试成绩、面试成绩),可以用随机数生成
test = np.vstack([[99,90],[90,99]]) #0-A级 1-B级
test = np.array(test,dtype='float32')
#预测
(p1,p2) = svm.predict(test)
#第5步 观察结果
#可视化
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()
#打印原始测试数据test,预测结果
print(test)
print(p2)

运行上述程序,会显示如下图所示的结果,图中左下角的方块代表测评成绩为A级的员工,右上角的小圆点代表测评成绩为B级的员工,另外的两个五角星代表需要分类的新入职员工。

在这里插入图片描述
同时,程序会在控制台输出如下运行结果:

[[99. 90.]
 [90. 99.]]
[[1.]
 [1.]]

或者其他结果

[[99. 90.]
 [90. 99.]]
[[0.]
 [0.]]

运行结果表明:
● 笔试成绩为99分,面试成绩为90分,对应的分类为1,即该员工一年后的测评可能为B级(表现良好)。
● 笔试成绩为90分,面试成绩为99分,对应的分类为1,即该员工一年后的测评可能为B级(表现良好)。
因为我们采用随机方式生成数据,所以每次运行时所生成的数据会有所不同,运行结果也就会有所差异。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值