本文主要是介绍SVM 支持向量机,如何寻找超平面的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
SVM 支持向量机,如何寻找超平面的?
1.SVM概念
支持向量机(Support Vector Machine, SVM)是一种二分类模型,目标是寻找一个标准(称为超平面)对样本数据进行分割,分割的原则是确保分类最优化(类别之间的间隔最大)。
1.1 分类
下图绿色和黄色,红色可以基本建红色和黄色划分开
用到CV2的向量机模块
2.1 cv2.ml.SVM_create 来生成用于后续训练的空分类器模型
-
cv2函数格式:
svm=cv2.ml.SVM_create() 获取了空分类器svm,对该模型使用svm.train()函数训练数据,
- 训练规格式为:
trainedResults =svm.train( trainData,trainCowCol,trainLable)
- trainData,trainCowCol,trainLable,trainedResults 分别为训练数据,训练数据的排列格式,训练标签和训练结果
1.2 生成模拟数据
首先考虑员工一个月某产品销售数量,成绩考虑用100分来表示,那么可用模拟出分数在95分以上的数据为【95-100】为优秀
销售数量 | 积分 | |
1 | 95 | 95 |
2 | 94 | 94 |
3 | 85 | 80 |
1.3 代码
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(85,94, (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))
#print(aLabel)
#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
svm = cv2.ml.SVM_create()
# 属性设置,直接采用默认值即可svm.setKernel(cv2.ml.SVM_LINEAR) # line
#svm.setC(0.001)
# 训练
result = svm.train(data, cv2.ml.ROW_SAMPLE, label)
# 第4步 预测
# 生成 2个准备预测的结果
testdata = np.random.randint(85,100, (2, 2)).astype(np.float32)test = np.vstack(testdata)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()
# 预测结果
print(p2)
1.4 运行结果
要训练的数据和待训练的数据通过随机值来训练,svm的值超级飘。还有固定一下训练集合
1.5结论
svm的关键还是训练数据的选择上,如果训练的结果集不好,结果也会到处飘,怎么去好好选择训练集。继续研究
这篇关于SVM 支持向量机,如何寻找超平面的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!