当前位置: 首页 > news >正文

【机器学习】分类算法-支持向量机

一、前言

   前面讲了KNN算法,这里我们来学习一下支持向量机的模型使用,看一下用支持向量机的方法,是否可以完成了之前KNN算法中的那个“约会网站配对”的算法实现嘞。

二、什么为支持向量机

f0330dbaa5714e379b2ac89ae0847be3.png

我们跟着老师的要求来,从四个层次来理解一下支持向量机的操作:

(1)支持向量

就是我们在两堆数据中,找到一个超平面,它可以使两堆数据尽可能多的正确的分开,同时使分开的两堆数据点距离我们的这个平面的分类距离最远。

(2)允许误差

10d02ba5b4ef4622b7377c7ead012d1d.png

即我们在划分的时候,可能出现一些数据,划分的并不是很准确,可能会有一定的误差,但是这些误差都是允许出现的。

(3)非线性可分

指的是有些非线性的数据,它杂糅在平面中,我们不能用一条线,将这两类数据分开时,我们可以尝试通过将数据映射到三维的空间,此时在三维空间,找到一个划分平面,再将这个平面映射到二维平面(此时的线就可能不是直线了),也是可以的,这是一种降维打击的思考方向。

(4)使用核函数

核函数的做法也是将数据从低纬度映射到高纬度,但是核函数可以事先在低纬度进行计算,实现的效果可以直接展示在高纬度,去除了在高纬度计算的过程。

PS:这个其实不好理解,我下来看哈相关资料后,看哈能不能做一个核函数的推理过程来看看。

三、实现支持向量机

使用我们的scikit-learn库来实现我们的支持向量机的操作。

下载语句,在pycharm终端输入等待即可

pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple/

SKlearn的简单使用

1、导入库

from sklearn import svm

2、定义模型

# 原始的支持向量集,还没有设置核函数等操作
model = svm.SVC()

3、模型函数

# trainingMat为训练(样本)数据,hWLabels为数据的标签
model.fit(trainingMat, hWLabels)

4、模型测试

# vectorUnderTest为我们的测试数据
model.predict(vectorUnderTest)

四、支持向量机实践

这里我们就用KNN算法中的“约会网站配对”的例子来测试我们支持向量机的准确性,完整代码如下:

import numpy as np
import KNN_Package as K
from sklearn import svmdef file2matrix(filename):fr = open(filename)numberOfLines = len(fr.readlines())# 定义一个numberOfLines行,3列的零矩阵# 一定要加两个括号returnMat = np.zeros((numberOfLines, 3))# 标签向量classLabelVector = []fr.close()fr = open(filename)index = 0for line in fr.readlines():# 去掉每一行的前后空格line = line.strip()# 根据tab将数据切割出来,listFromLine就成了一个字符串列表listFromLine = line.split("\t")# listFromLine[0:3]将listFromLine的前三列赋值给returnMat[]数组,因为returnMat有numberOfLines行,就会执行numberOfLines次操作returnMat[index, :] = listFromLine[0:3]# listFromLine[-1]表示最后一列if listFromLine[-1] == 'didntLike':classLabelVector.append(1)elif listFromLine[-1] == 'smallDoses':classLabelVector.append(2)elif listFromLine[-1] == 'largeDoses':classLabelVector.append(3)index += 1fr.close()return returnMat, classLabelVectordatingDataMat, datingLabels = file2matrix("D:/python工具/素材处/KNN(二)/DataText.txt")# 数据归一化处理
# 0-1标注化
def autoNorm(dataSet):# min(0)按特征的列选取,min(1)按照特征的行选取minVals = dataSet.min(0)maxVals = dataSet.max(0)# shape记录了dataSet的行和列normDataSet = np.zeros(dataSet.shape)normDataSet = (dataSet - minVals) / (maxVals - minVals)return normDataSetdataSet = autoNorm(datingDataMat)m = 0.8
# shape[0]表示行、shape[1]表示列
dataSize = dataSet.shape[0]
print("数据集的总行数:", dataSize)
# 80%作为训练 20%作为测试
trainSize = int(m * dataSize)
testSize = int((1 - m) * dataSize)# 原始的支持向量集,还没有设置核函数等操作
model = svm.SVC()
model.fit(dataSet[0:trainSize, :], datingLabels[0:trainSize])result = []
error = 0
# 调用封装好的KNN函数
for i in range(testSize):# dataSet[trainSize + i - 1, :]表示dataSet矩阵中的第trainSize + i - 1行元素(包含对应的所有列)# dataSet[0:trainSize, :]表示一个从0~trainSize行,包含对应所有列的矩阵# datingLabels[0:trainSize]表示截取列表datingLabels中的0~trainSize个元素# 通过reshape函数规整一下数据result = model.predict(dataSet[trainSize + i - 1, :].reshape(1, -1))if result != datingLabels[trainSize + i - 1]:error += 1print('错误率:', error / testSize)

效果:

b4eeb5e0820742a5bf432354e3f5c908.png

从效果来看,原生的支持向量机的操作的错误率为6.03%要比我们的KNN算法的准确性要差一点,但是,别忘了我们的支持向量机的模型定义的时候,是用的原生的,还没有设置我们的核函数那些操作的,所以具体情况要具体分析。

五、总结

   博主也是初学者,有很多不懂的地方,如果有说错的地方,欢迎大家指正。最后,该内容是跟着B站up主【abilityjh】老师学习的,大家可以去看该老师的视频学习!

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深入理解 Vue.js 中的 nextTick:原理与应用
  • mysql高版本(8.0+)group_by报错的处理方法
  • XBOX360-玩体感游戏时提示:您必须进行系统更新,才能使用Kinect
  • Mysql解忧杂货铺
  • STM32第九课:STM32-基于标准库的42步进电机的简单I/O控制(附电机教程,看到即赚到)
  • 一五六、Node+Vue 使用七牛上传图片,并配置个人域名
  • C#面:ASP.NET Core项目如何设置IP地址和端口号
  • 《学会 SpringBoot · 定制 SpringMVC》
  • Java的数组
  • Python与MQTT:构建物联网通信的桥梁
  • PostgreSQL使用(三)
  • Vue和Element UI 路由跳转
  • 【C语言】详解结构体(上)
  • 通过Dockerfile构建镜像
  • 用HTML和CSS实现提示工具(tooltip)及HTML元素的定位
  • hexo+github搭建个人博客
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Bytom交易说明(账户管理模式)
  • CSS 专业技巧
  • DOM的那些事
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • uni-app项目数字滚动
  • 大主子表关联的性能优化方法
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 飞驰在Mesos的涡轮引擎上
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于webpack 的 vue 多页架构
  • 浏览器缓存机制分析
  • 前端性能优化——回流与重绘
  • 详解移动APP与web APP的区别
  • 栈实现走出迷宫(C++)
  • 从如何停掉 Promise 链说起
  • ​马来语翻译中文去哪比较好?
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (1)Android开发优化---------UI优化
  • (175)FPGA门控时钟技术
  • (2)Java 简介
  • (4) PIVOT 和 UPIVOT 的使用
  • (7)摄像机和云台
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (vue)页面文件上传获取:action地址
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (差分)胡桃爱原石
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计ssm电影分享网站
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)拼包函数及网络封包的异常处理(含代码)
  • ***检测工具之RKHunter AIDE
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException