前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习算法(三)之支持向量机算法代码

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

作者头像
千与编程
发布2023-04-28 13:34:08
3920
发布2023-04-28 13:34:08
举报
文章被收录于专栏:公众号:千与编程

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 千与编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
人脸识别
腾讯云神图·人脸识别(Face Recognition)基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、比对、搜索、验证、五官定位、活体检测等多种功能,为开发者和企业提供高性能高可用的人脸识别服务。 可应用于在线娱乐、在线身份认证等多种应用场景,充分满足各行业客户的人脸属性识别及用户身份确认等需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档