15. 机器学习 - 支持向量机

茶桁的AI秘籍 核心能力基础 15

Hi, 你好。我是茶桁。

逻辑回归预测心脏病

在本节课开始呢,我给大家一份逻辑回归的练习,利用下面这个数据集做了一次逻辑回归预测心脏病的练习。

Alt text

本次练习的代码在「茶桁的AI秘籍」在Github上的代码库内,数据集的获取在文末。这样做是因为我的数据集都是和百度盘同步的,很多数据集过大了,所以也就不传Github了。而且,我直接获取盘内同步数据也更方便。

还有一个原因,有些数据集可能以后会收费获取。

好,让我们进入今天的正课。

因为未来几节课的内容比较多。「核心基础」的这部分内容已经超出我原本的预计,咱们「核心基础」的部分刚刚过半,可是已经写到15节了,本来这部分内容我是想在21节左右结束的,所以,我们还是要压缩一下内容了。

这节课咱们还是继续讲解经典的机器学习。

支持向量机

接下来,要讲解一个非常有趣的方法:支持向量机。

支持向量机的原理其实可以很复杂,但它是一个很经典的思想方法。咱们就把它的核心思想讲明白就行了。其实我们平时在工作中用的也比较少。但是面试中有一些老一代的面试官会比较喜欢问这个问题。

支持向量机的核心思想,假如我们有两堆数据,希望找一根线去把它做分类,那么咱们找哪一根线呢?

Alt text

上图中,我们假设黑色的那根线定义为l,把离这根线最近的点,也就是直线距离最小的点,找到两个这样的点定义为P1、P2。

现在我们是希望离这个l最近的点,假如说是d1,d2,那么我们希望这两个距离加起来最大:max|d1+d2|。

现在再定义蓝色的线为直线b,那直线b做分类就比直线l要好。为什么直线b就比是直线l好呢? 因为直线b离d1,d2普遍都比较远。

现在这里的演示是一个二维平面中用一根线来分割,如果是在多维空间中,SVM的目标就是找到一个最佳的超平面来最大化间隔,同时确保正确分类样本。

假设我们有一组训练样本,每个样本用特征向量x表示,并且标记为正类别+1或负类别-1。

我们可以表示为以下凸优化问题:

m i n w , b 1 2 ∣ ∣ w ∣ ∣ 2 \begin{align*} min_{w, b}\frac{1}{2}||w||^2 \end{align*} minw,b21∣∣w2

其中对所有样本

y i ( w ⋅ x i + b ) ≥ 1 y_i(w \cdot x_i+b) \ge 1 yi(wxi+b)1

w是超平面的法向量,b是截距项,yi是样本xi的标签,也就是+1或者-1。

为了解决这个优化问题,我们引入拉格朗日乘子 a i a_i ai来得到拉格朗日函数:

L ( w , b , a ) = 1 2 ∣ ∣ w ∣ ∣ 2 − ∑ i = 1 N a i [ y i ( w ⋅ x i + b ) − 1 ] L(w,b,a) = \frac{1}{2}||w||^2 - \sum_{i=1}^Na_i[y_i(w\cdot x_i +b) - 1] L(w,b,a)=21∣∣w2i=1Nai[yi(wxi+b)1]

然后我们要最小化拉格朗日函数,首先对w和b求偏导数,令它们等于0,然后代入拉格朗日乘子条件:

a i [ y i ( w ⋅ x i + b ) − 1 ] = 0 a_i[y_i(w\cdot x_i + b)-1] = 0 ai[yi(wxi+b)1]=0

然后我们就可以得到如下这个式子

w = ∑ i = 1 N a i y i x i s u m i = 1 N a i y i = 0 w = \sum_{i=1}^Na_iy_ix_i \\ sum_{i=1}^N a_iy_i = 0 w=i=1Naiyixisumi=1Naiyi=0

使用某种优化算法(例如,SMO算法),求解拉格朗日乘子 a i a_i ai。我们就可以使用求解得到的 a i a_i ai计算超平面参数w和b。

对于新样本x,使用超平面 w ⋅ x + b w\cdot x + b wx+b的符号来预测其类别。

那我们讲了这么半天,都是一个支持向量机的数学演示过程,下面我们来看看具体的代码实现。

我们先来生成两组数据,这两组数据咱们让他距离更大:

import numpy as np
label_a = np.random.normal(6, 2, size=(50, 2))
label_b = np.random.normal(-6, 2, size=(50, 2))

我们现在来观察以下生成的这些点:

import matplotlib.pyplot as plt
plt.scatter(*zip(*label_a))
plt.scatter(*zip(*label_b))

plt.show()

Alt text

然后我们继续:

label_a_x = label_a[:, 0]
label_b_x = label_b[:, 0]

我们就将这两组数据的第一列分别取出来了。

接着我们随机的定义一些w和b

for i in range(100):
    w, b = (np.random.random(size=(1, 2)) * 10 - 5)[0]

然后我们按照之前讲的数学演示来定义一个函数

def f(x):
    return w*x+b

然后我们之前从数学演示里已经知道, y i ( w ⋅ x + b ) ≥ 1 y_i(w\cdot x+b) \ge 1 yi(wx+b)1, 而我们也知道这个说的是距离,也就是说,同样的$y_i(w\cdot x+b) \le -1 $。

也就是说,我们要让函数f小于等于-1,并且大于等于1。当然,为了保证其被分到两边,我们将函数的最大值定义为小于等于-1, 将函数的最小值定义为大于等于1。这样就保证(-1,1)之间是不存在任何函数值:

np.max(f(label_a_x, w, b)) <= -1 and np.min(f(label_b_x, w, b)) >= 1

只有同时满足这两个条件的值,我们才会留下来进行保存。我们可以定义一个变量将其保存

w_and_b = []
for i in range(100):
    w, b = (np.random.random(size=(1, 2)) * 10 - 5)[0]
    if np.min(f(label_a_x, w, b)) >= -1 and np.min(f(label_b_x, w, b)) >= 1:
        w_and_b.append((w, b))

在得到这些w,b之后,我们将这些w,b连起来进行画图:

for w, b in w_and_b:
    x = np.concatenate((label_a_x, label_b_x))
    plt.plot(x, f(x, w, b))

plt.show()

Alt text

这样,我们就拟合出来了很多的曲线。这些个曲线到底哪一个是最好的那一个呢?

现在根据刚刚得到的那个结论,现在所有的 y i ( w ⋅ x i + b ) y_i(w\cdot x_i + b) yi(wxi+b), 那么现在其实就是 m a r g i n = 2 ∣ ∣ w ∣ ∣ margin = \frac{2}{||w||} margin=∣∣w∣∣2

那我们现在就找这个w最小的这个值就可以了。

w, b = min(w_and_b, key = lambda w_b: w_b[0])
all_x = np.concatenate((label_a_x, label_b_x))
plt.plot(all_x, f(all_x, w, b), 'r-o')

plt.show()

Alt text

现在我们就可以看到那个最优的直线了,就是众多红色的点连接起来的那根线。

当然,最后代码执行顺序和讲解顺序有一些不一样,为了避免数据每次重新生成造成的差别,所以最开始是生成数据,之后是定义函数、过滤参数以及生成图像。

这个就是支持向量机的原理,我们找到离它所有的点的一个距离,让它这个边距最大,最后得到一个简化结果。

核函数

然后我们再来看另外一个点:「核函数」:

核函数是支持向量机里面非常重要的一个东西。

如果支持向量机只要数据是线性可分的,那么我们一定能够找到它的分割线。但是在实际的现实生活中有很多点并不是线性可分的。

举个例子,我们来画一张图:

Alt text

就比如图中的这种数据,是无论如何用一条直线无法分割的,不管怎么画,都无法把蓝色和红色的点分割开。

就像我们下面这张图:

Alt text

但是,我们我们可以做这样一件事情,假设我们在一个坐标轴上拥有8个点,A、B、C、D为一组,a,b,c,d为一组。如下图:

Alt text

分别为A(-1,1), B(1,1), C(1, -1), D(-1,-1); a(-0.5, 0.5), b(0.5, 0.5), c(0.5, -0.5), d(-0.5, -0.5)。

现在我们ABCD和abcd是无法用一根直线来分割的,然后我们令:

f ( x ) = > { x 2 y 2 } \begin{align*} f(x) => \begin{Bmatrix} x^2 \\ y^2 \end{Bmatrix} \end{align*} f(x)=>{x2y2}

那在这种情况下,八个点分别就变成了A(1, 1),B(1, 1),C(1, 1),D(1, 1), a(0.25, 0.25),b(0.25, 0.25),c(0.25, 0.25),d(0.25, 0.25)。

那这样的情况下,我们就完全可以用一根直线去分割了:

Alt text

那现在找到这根线是w2 = wx+b,那我们遇到新数据应用到这个函数里边,再应用到这个线里面做分割就可以了。我们把原本线性不可分的东西,变成线性可分的。那么这个就是核函数神奇的地方。

支持向量机通过某非线性变换 φ(x) ,将输入空间映射到高维特征空间。特征空间的维数可能非常高。如果支持向量机的求解只用到内积运算,而在低维输入空间又存在某个函数 K(x, x′) ,它恰好等于在高维空间中这个内积,即K(x, x′) =φ(x)⋅φ(x’) ; 。那么支持向量机就不用计算复杂的非线性变换,而由这个函数K(x, x′) 直接得到非线性变换的内积,使大大简化了计算。我们就将这种函数函数 K(x, x′) 称为核函数。

φ ( x ) = [ x x 2 x 3 ] \varphi (x) = \begin{bmatrix} x \\ x^2 \\ x^3 \end{bmatrix} φ(x)= xx2x3

那其实,就类似的事情,已经有人总结了一些相应的公式来使用:

Alt text

这些是一些常见的核函数。

一般在使用的时候调用它就可以,如果在用SVM的时候,它会有一个参数。可以自己定义一个核函数,但一般不自己定义,调用现有的就够了。

SVM其实也有弊端,当数据量很复杂的时候,现有的核函数就没有作用了。因为它会失效,所以我们需要很多的人工分析,整个效率很低。

但是在整个机器学习的发展史上,它曾经有非常重要的一段历史。有一段时间它的论文量非常的多,做科研的非常爱做SVM,不是因为快速,是因为可以提出来各种各样的Kerno函数。

假如有一组数据不好分割,但是你提出了一种新的核函数,这个函数量可以比较复杂啊
然后提升了分割率,提高了效果。

但是这种方法其实曾经一度让机器学习非常不受人待见,在学术圈非常不受人待见。搞机器学习的人就是每天就是发论文,说我的曲线比你的曲线强,这就是他们干的事。

所以10年左右,做机器学习、做人工智能的人都不说自己是做机器学习,做人工智能的。都换个名字,说做文本挖掘等等。

SVM因为要做各种升维,当数据量比较大的时候,计算量非常的复杂,计算需求量非常的大。

但是SVM它有个好处,就是它比较直观,还有就是SVM对于不平衡的数据比较有用。

好,这节课我们就讲到这里,下一节课我们来看「决策树」。

链接: https://pan.baidu.com/s/1Rl8xkQG4c-XSjL6cB4B1XQ?pwd=e8wi 提取码: e8wi 复制这段内容后打开百度网盘手机App,操作更方便哦
–来自百度网盘超级会员v6的分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/109502.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pytorch深度学习实践(一):线性模型y=w*x和y=w*x+b的代码和绘图实现

目录 题目描述1. yw*x2. yw*xb 代码第一题: y w*x第二题:y wxb 绘图工具 学习视频&#xff1a; 刘二大人pytorch1-线性模型 题目描述 1. yw*x 使用线性模型y w*x计算模型的损失值并且使用matplotlib给出cost function图像。 2. yw*xb 使用线性模型y w*xb给出cost funct…

计算机网络基础三

课程目标 理解路由表的作用 能够读懂路由表信息 能够使用图形抓包工具 wireshark 进行数据包的抓取 &#xff0c;如&#xff08; TCP/IP 的三次握手四次断开&#xff09; 一、路由表 思考&#xff1a; 什么是交换,什么是路由,什么是路由表&#xff1f;1. 交换是指同网络访…

外卖跑腿小程序开发如何满足不断变化的用户需求?

外卖跑腿小程序市场竞争激烈&#xff0c;用户需求不断演变。为了保持竞争力&#xff0c;开发团队需要不断适应变化&#xff0c;提供新功能和改进用户体验。本文将讨论如何通过技术手段来满足不断变化的用户需求。 1. 灵活的后端服务 后端服务是外卖跑腿小程序的核心&#xf…

如何优雅地单元测试 Kotlin/Java 中的 private 方法?

翻译自 https://medium.com/mindorks/how-to-unit-test-private-methods-in-java-and-kotlin-d3cae49dccd ❓如何单元测试 Kotlin/Java 中的 private 方法❓ 首先&#xff0c;开发者应该测试代码里的 private 私有方法吗&#xff1f; 直接信任这些私有方法&#xff0c;测试到…

css画一条虚线,用到background-image:linear-gradient线性渐变的属性

CSS实现虚线的方法_css 虚线_saltlike的博客-CSDN博客 渐变属性(background-image)全解析_background-image linear_大聪明码农徐的博客-CSDN博客 Background:linear-gradient()详解_background: linear-gradient_小白白中之白的博客-CSDN博客 注意&#xff1a; 必须要写高…

最短路径:迪杰斯特拉算法

简介 英文名Dijkstra 作用&#xff1a;找到路中指定起点到指定终点的带权最短路径 核心步骤 1&#xff09;确定起点&#xff0c;终点 2&#xff09;从未走过的点中选取从起点到权值最小点作为中心点 3&#xff09;如果满足 起点到中心点权值 中心点到指定其他点的权值 < 起…

C++进阶语法——智能指针【学习笔记(五)】

文章目录 1、智能指针简介1.1 原始指针&#xff08;raw pointer&#xff09;的⼀些问题1.2 智能指针&#xff08;smart pointers&#xff09; 2、智能指针&#xff08;smart pointers&#xff09;——unique_ptr2.1 unique_ptr 的声明2.2 unique_ptr 的函数2.3 ⾃定义类型使⽤ …

基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类 计算机竞赛

文章目录 1 前言2 情感文本分类2.1 参考论文2.2 输入层2.3 第一层卷积层&#xff1a;2.4 池化层&#xff1a;2.5 全连接softmax层&#xff1a;2.6 训练方案 3 实现3.1 sentence部分3.2 filters部分3.3 featuremaps部分3.4 1max部分3.5 concat1max部分3.6 关键代码 4 实现效果4.…

【HTML/CSS学习】margin和padding的区别

1. margin margin&#xff08;外边距&#xff09;属性定义元素周围的空间。 margin主要在元素的外部创建空白区域&#xff0c;用于分隔元素与其相邻元素之间的距离。 用处&#xff1a;可以用于调整两个元素之间的间隔。 2. padding padding&#xff08;填充&#xff09;定义…

IDE的组成

集成开发环境&#xff08;IDE&#xff0c;Integrated Development Environment &#xff09;是用于提供程序开发环境的应用程序&#xff0c;一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务…

拿下国家级信创认证 中科驭数KPU SWIFT-2200N成为国内首款满足金融业严苛要求的DPU产品

近日&#xff0c;中科驭数KPU SWIFT-2200N低时延DPU卡&#xff0c;在中国人民银行旗下金融信创生态实验室完成测试并取得测试报告&#xff0c;这意味着中科驭数低时延网络代表性产品的应用领域从证券进一步拓展到了银行业&#xff0c;成为国内首款满足金融行业严苛要求的DPU产品…

iis前端代理后台tomcat

1)tomcat服务器配置运行好&#xff0c;服务地址位于 localhost:8080/wechat 2)iis 绑定了域名 api.abc.com 希望访问 api.abc.com/wechat时&#xff0c;实际由tomcat的服务处理; 3)iis上需要添加组件 requestRouter_amd64.msi rewrite_amd64_zh-CN.msi 4)iis进行相关配置…

记录linux运行服务提示报错/bin/java: 没有那个文件或目录

描述&#xff1a;在执行jar启动命令时候提示 没有/bin/java 这个文件或者目录&#xff1b;然后我vi /usr/bin/java&#xff0c;是存在该文件的&#xff1b;那到底是什么问题呢&#xff0c;该不是没有创建软连接吧&#xff1f; 1、执行下述命令先测试下软链接是否有创建 ln -s …

用软件模拟IPC的RTSP流,对接烟火识别算法服务,做实时的烟火检测、人员入侵检测、抽烟检测等算法

最近在研发烟火识别的算法&#xff0c;想要检验算法集成到视频分析服务之后的效果&#xff0c;发现线上的摄像机很难发现火情&#xff0c;有的很长时间都不会有检测的结果&#xff0c;于是我就需要用已经被检验过的视频文件&#xff0c;模拟一路IPC的RTSP流&#xff0c;来测试烟…

jenkins如何安装?

docker pull jenkins/jenkins:lts-centos7-jdk8 2.docker-compose.yml version: 3 services:jenkins:image: jenkins/jenkins:lts-centos7-jdk8container_name: my-jenkinsports:- "8080:8080" # 映射 Jenkins Web 界面端口volumes:- jenkins_home:/var/jenkins_h…

【MySQL数据库】初识MySQL数据库、安装MySQL

文章目录 前言一、什么是 MySQL&#xff1f;二、MySQL 的强大之处三、Ubuntu安装MySQL步骤 1: 更新包列表步骤 2: 安装 MySQL步骤 3: 启动 MySQL 服务步骤 4: 验证 MySQL 安装步骤 5: 确保 MySQL 安全性 总结 前言 在今天的数字化世界中&#xff0c;数据是企业和个人的重要资产…

matlab 中的基本绘图指令与字符串操作指令

字符串指令 创建字符串 使用单引号将字符序列括起来创建字符串使用单引号创建的字符串是一个字符数组&#xff0c;每个字符都被视为一个独立的元素 可以通过索引访问每个字符使用双引号创建的字符串是一个字符串数组&#xff0c;整个字符串被视为一个元素 无法通过索引访问单个…

【SEC 学习】美化 Linux 终端

一、步骤 1. 进入 /etc/bash.bashrc vim /etc/bash.bashrc2. 重新加载 bash.bashrc source /etc/bash.bashrc二、各参数指标 符号含义\u当前用户的账号名称\h仅取主机的第一个名字&#xff0c;如上例&#xff0c;则为fc4&#xff0c;.linux则被省略\H完整的主机名称。例如&…

一文详解防御DDoS攻击的几大有效办法

伴随互联网的飞速发展&#xff0c;网络安全问题变得越来越突出&#xff0c;其中最常见的就是DDoS攻击&#xff0c;也就是分布式拒绝服务攻击。DDoS攻击者利用计算机或其他设备的协作&#xff0c;以发送大量请求的方式导致目标超负荷&#xff0c;导致不能正常运转或“宕机”。以…

【Linux】NTP服务器配置、时间修改

查看当前系统时间date修改当前系统时间date -s "2018-2-22 19:10:30"查看硬件时间hwclock --show修改硬件时间hwclock --set --date "2018-2-22 19:10:30"同步系统时间和硬件时间hwclock --hctosys保存时钟clock –w1.设置NTP Server服务检查系统是否安装n…