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的关键还是训练数据的选择上,如果训练的结果集不好,结果也会到处飘,怎么去好好选择训练集。继续研究

 

 

 

    

猜你喜欢

转载自blog.csdn.net/keny88888/article/details/105691829
今日推荐