支持向量机的算法用于对数据进行二分类,大多数用于监督学习的机器学习问题。下面是用支持向量机进行一个实际的分类举例。
导入必要的代码包,涉及矩阵运算与绘图,因此需要导入numpy与matplotlib包
代码语言:javascript复制from numpy import *
import time
import matplotlib.pyplot as plt
代码语言:javascript复制def calcKernelValue(matrix_x, sample_x, kernelOption):
kernelType = kernelOption[0]
numSamples = matrix_x.shape[0]
kernelValue = mat(zeros((numSamples, 1)))
if kernelType == 'linear':
kernelValue = matrix_x * sample_x.T
elif kernelType == 'rbf':
sigma = kernelOption[1]
if sigma == 0:
sigma = 1.0
for i in range(numSamples):
diff = matrix_x[i, :] - sample_x
kernelValue[i] = exp(diff * diff.T / (-2.0 * sigma ** 2))
else:
raise NameError('Not support kernel type! You can use linear or rbf!')
return kernelValue
定义一个SVM的训练模型代码
代码语言:javascript复制def trainSVM(train_x, train_y, C, toler, maxIter, kernelOption=('rbf', 1.0)):
# calculate training time
startTime = time.time() # 记录训练时的开始时间
# print (train_x)
# print(train_y)
# init data struct for svm
# train_x和train_y居然不是矩阵??不是传过来的参数就是矩阵嘛??
svm = SVMStruct(mat(train_x), mat(train_y), C, toler, kernelOption)
# start training
entireSet = True
alphaPairsChanged = 0
iterCount = 0
# Iteration termination condition:
# Condition 1: reach max iteration
# Condition 2: no alpha changed after going through all samples,
# in other words, all alpha (samples) fit KKT condition
while (iterCount < maxIter) and ((alphaPairsChanged > 0) or entireSet):
alphaPairsChanged = 0
# update alphas over all training examples
if entireSet:
for i in range(svm.numSamples):
alphaPairsChanged = innerLoop(svm, i)
print('---iter:%d entire set, alpha pairs changed:%d' % (iterCount, alphaPairsChanged))
iterCount = 1
# update alphas over examples where alpha is not 0 & not C (not on boundary)
else:
nonBoundAlphasList = nonzero((svm.alphas.A > 0) * (svm.alphas.A < svm.C))[0]
for i in nonBoundAlphasList:
alphaPairsChanged = innerLoop(svm, i)
print('---iter:%d non boundary, alpha pairs changed:%d' % (iterCount, alphaPairsChanged))
iterCount = 1
# alternate loop over all examples and non-boundary examples
if entireSet:
entireSet = False
elif alphaPairsChanged == 0:
entireSet = True
print('Congratulations, training complete! Took %fs!' % (time.time() - startTime))
return svm
模型训练与在数据上测试的可视化操作
代码语言:javascript复制def showSVM(svm):
if svm.train_x.shape[1] != 2:
print("Sorry! I can not draw because the dimension of your data is not 2!")
return 1
# draw all samples
for i in range(svm.numSamples):
if svm.train_y[i] == -1:
plt.plot(svm.train_x[i, 0], svm.train_x[i, 1], 'or')
elif svm.train_y[i] == 1:
plt.plot(svm.train_x[i, 0], svm.train_x[i, 1], 'ob')
# mark support vectors
supportVectorsIndex = nonzero(svm.alphas.A > 0)[0]
for i in supportVectorsIndex:
plt.plot(svm.train_x[i, 0], svm.train_x[i, 1], 'oy')
# draw the classify line
w = zeros((2, 1))
for i in supportVectorsIndex:
w = multiply(svm.alphas[i] * svm.train_y[i], svm.train_x[i, :].T)
min_x = min(svm.train_x[:, 0])[0, 0]
max_x = max(svm.train_x[:, 0])[0, 0]
y_min_x = float(-svm.b - w[0] * min_x) / w[1]
y_max_x = float(-svm.b - w[0] * max_x) / w[1]
plt.plot([min_x, max_x], [y_min_x, y_max_x], '-g')
plt.show()
支持向量机需要进行模型的训练后在进行推理的分类,在数据集中正类的标签为1,负类的标签为-1,通过输入的特征进行分类。
运行代码,在终端窗口输出模型的迭代过程,在做开始导入了time包进行运行时间的监控,最后的分类准确率到了100%,可以说分类效果非常的好,尤其是在线性分类的条件下。
以上是最终的分类结果,可以直观的看出来红色的样本与蓝色的样本被完美的分开了,支持向量机模型找到了超平面的直线,黄色的点为支持向量的样本。
接下来说一下最近的一些学习心得吧,小编马上要返校了,在疫情之下终于结束了“超长的寒假”,经过一个寒假的学习,小编从一个什么都不会的人工智能的小白,转变为一个初学者了,想想一个寒假做了很多项目,跑了很demo,想想最开始的树莓派的项目,人脸识别,视频流传输,还玩了玩ros操作系统,做了一个简单的路径规划,与slam三维视觉建图。使用OpenCV包做了一个视频中车辆检测,树莓派的速度比较慢。由于以后的硬件电路设计需要,画了一块MOS管的电机驱动电路PCB。学习生成对抗网络学习了图像自动上色的技术,做出了一副彩色的卓别林照片。
机器学习与数据挖掘上学习了很多基础的算法,KNN,决策树,随机森林,线性回归,逻辑回归,K-mean, SVM。在目标检测上学习了yolo v3学了一下优化的算法,对比了各种方法的区别,还接触了OCR等技术,做出来人工智能作诗的demo,情感分析等自然语言方面的算法,读了一些论文,复现了一些论文。感觉所有的只有一条是核心,无他但手熟而。仔细想想自己的一个寒假做了还是挺多的,K210的开发板也算是从入门到入迷,很多东西坚持下来真的不一样,经过这么长时间的沉淀,终于摸清楚自己的路线了,希望自己好好走下去。作一个什么困难都不放弃的,什么问题都能解决的人,很厉害,也很难。我,在路上。此中有真意,欲辨已忘言。在圈子中也认识了很多厉害的人,学习别人的优点,改进自己的短处。就和健身一个道理,锻炼完浑身酸痛,但是当肌肉恢复后,你会更加有力量,当你经历过困难后,解决问题的能力会有进步的。就这样吧,小编该睡觉了,最近就先不更新了,短暂的分别是为了更好的相聚。幸无所爱,无畏山海!