机器学习算法(三)之支持向量机算法代码

2023-04-28 13:34:08 浏览数 (1)

支持向量机的算法用于对数据进行二分类,大多数用于监督学习的机器学习问题。下面是用支持向量机进行一个实际的分类举例。

导入必要的代码包,涉及矩阵运算与绘图,因此需要导入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的开发板也算是从入门到入迷,很多东西坚持下来真的不一样,经过这么长时间的沉淀,终于摸清楚自己的路线了,希望自己好好走下去。作一个什么困难都不放弃的,什么问题都能解决的人,很厉害,也很难。我,在路上。此中有真意,欲辨已忘言。在圈子中也认识了很多厉害的人,学习别人的优点,改进自己的短处。就和健身一个道理,锻炼完浑身酸痛,但是当肌肉恢复后,你会更加有力量,当你经历过困难后,解决问题的能力会有进步的。就这样吧,小编该睡觉了,最近就先不更新了,短暂的分别是为了更好的相聚。幸无所爱,无畏山海!

0 人点赞