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

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的分享

相关文章:

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

Hi, 你好。我是茶桁。 逻辑回归预测心脏病 在本节课开始呢&#xff0c;我给大家一份逻辑回归的练习&#xff0c;利用下面这个数据集做了一次逻辑回归预测心脏病的练习。 本次练习的代码在「茶桁的AI秘籍」在Github上的代码库内&#xff0c;数据集的获取在文末。这样做是因为我…...

如何根据进程号查询服务的端口号

ps -ef | grep nacos ps -ef | grep nacos 命令是用于查找系统中所有包含 "nacos" 关键字的进程。这个命令的含义如下&#xff1a; ps: 这是一个用于显示当前正在运行的进程的命令。 -ef: 这两个选项一起使用&#xff0c;表示显示所有进程的详细信息。 -e 选项表示显…...

2.10、自定义量化优化过程

introduction 如何自定义量化优化过程&#xff0c;以及如何手动调用优化过程 code from typing import Callable, Iterableimport torch import torchvision from ppq import QuantizationSettingFactory, TargetPlatform from ppq.api import (ENABLE_CUDA_KERNEL, Quantiz…...

MySQL如何添加自定义函数

深入MySQL&#xff1a;学习如何添加自定义函数 MySQL 是一种流行的开源关系型数据库管理系统&#xff0c;它支持很多内置函数来完成各种操作。不过有时候这些内置函数无法满足我们的需求&#xff0c;这时候就需要自定义函数了。在 MySQL 中&#xff0c;可以通过编写自定义函数…...

超融合数据库:解锁全场景数据价值的钥匙

前言 近日&#xff0c;四维纵横对外官宣已完成上亿元 B 轮融资。作为超融合数据库理念的提出者&#xff0c;三年来 YMatrix 持续在超融合数据库领域中保持精进与迭代&#xff0c;对于超融合数据库在行业、场景中的应用和理解也更为深刻。 本篇文章&#xff0c;我们将基于 YMa…...

Pap.er for Mac:高清壁纸应用打造你的专属视觉盛宴

在浩瀚的互联网海洋中&#xff0c;你是否曾为寻找一张心仪的高清壁纸而烦恼&#xff1f;或者是在大量的壁纸应用中感到困扰&#xff0c;不知道哪一个能满足你的需求&#xff1f;今天&#xff0c;我要向你介绍的&#xff0c;是一款独特的5K高清壁纸应用——Pap.er for Mac。 Pa…...

AI:46-基于深度学习的垃圾邮件识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌本专栏包含以下学习方向: 机器学习、深度学…...

【骑行贝丘渔场】一场与海的邂逅,一段难忘的旅程

在这个渐凉的秋日&#xff0c;我们校长骑行队一行人骑着自行车&#xff0c;从大观公园门口出发&#xff0c;开始了一段别开生面的海滩之旅。沿途穿越草海隧道湿地公园、迎海路、海埂公园西门&#xff08;第二集合点&#xff09;、宝丰湿地公园、斗南湿地公园、蓝光城&#xff0…...

消息中间件——RabbitMQ(一)Windows/Linux环境搭建(完整版)

前言 最近在学习消息中间件——RabbitMQ&#xff0c;打算把这个学习过程记录下来。此章主要介绍环境搭建。此次主要是单机搭建&#xff08;条件有限&#xff09;&#xff0c;包括在Windows、Linux环境下的搭建&#xff0c;以及RabbitMQ的监控平台搭建。 环境准备 在搭建Rabb…...

Mysql 表读锁与表写锁

表读锁 加锁&#xff1a;lock table table_name read 释放锁&#xff1a;unlock tables 当事务一用表读锁锁住某张表后&#xff0c; 1.事务一必须释放表读锁才能访问其他表 2.期间事务2可以访问该表&#xff0c;但是修改事会遇到阻塞等待&#xff0c;只有等到事务一释放锁后…...

目标检测概述

1.是什么&#xff1f; 目标检测是计算机视觉领域的核心问题之一&#xff0c;其任务就是找出图像中所有感兴趣的目标&#xff0c;确定他们的类别和位置。由于各类不同物体有不同的外观&#xff0c;姿态&#xff0c;以及不同程度的遮挡&#xff0c;加上成像是光照等因素的干扰&a…...

10月31日星期二今日早报简报微语报早读

10月31日星期二&#xff0c;农历九月十七&#xff0c;早报微语早读分享。 1、广西官宣&#xff1a;做试管婴儿费用可报销&#xff1b; 2、港媒&#xff1a;4名港大学生承认“煽惑他人蓄意伤人罪”&#xff0c;被判监禁2年&#xff1b; 3、331名中国维和官兵全部获联合国勋章…...

【Linux】虚拟机项目部署与发布

目录 一、Linux部署单机项目 1.1 优缺点 1.2 将项目共享到虚拟机 1.3 解压后将war包放入tomcat 1.4 数据库导入脚本 1.5 Tomcat启动项目 二、部署前后端分离项目 2.1 准备工作 2.2 部署SPA项目 2.2.1 nginx反向代理 2.2.2 SPA项目宿主机访问 一、Linux部署单机项目…...

边缘计算技术的崭新篇章:赋能未来智能系统

边缘计算是近年来云计算和物联网技术发展的重要趋势。通过将数据处理和分析从云端迁移到设备边缘&#xff0c;边缘计算能够实现更低的延迟和更高的数据安全。本文将探索边缘计算技术的最新进展及其在不同行业中的应用场景。 1. 实时数据处理与决策 在需要快速响应的场景中&…...

Mac/Linux类虚拟机_CrossOver虚拟机CrossOver 23.6正式发布2024全新功能解析

CodeWeivers 公司于今年 10 月发布了 CrossOver 23.6 测试版&#xff0c;重点添加了对 DirectX 12 支持&#xff0c;从而在 Mac 上更好地模拟运行 Windows 游戏。 该公司今天发布新闻稿&#xff0c;表示正式发布 CrossOver 23 稳定版&#xff0c;在诸多新增功能中&#xff0c;最…...

RabbitMQ 运维 扩展

1、集群管理与配置 1.1、集群搭建 关于Rabbitmq 集群的搭建&#xff0c;详见以下文章。简单说来就是将多个单机rabbitmq服务&#xff0c;通过给到一致的密钥&#xff08;.erlang.cookie&#xff09;并且开放rabbitmq服务的 25672 端口&#xff0c;允许多节点间进行互相通讯&am…...

[量化投资-学习笔记003]Python+TDengine从零开始搭建量化分析平台-Grafana画K线图

在前面两个笔记&#xff1a; PythonTDengine从零开始搭建量化分析平台-数据存储 PythonTDengine从零开始搭建量化分析平台-MA均线的多种实现方式 中有提到使用 Grafana 画图&#xff0c;不过画的都是均线。除了均线&#xff0c;Grafana 非常人性的提供了 K线图模块 搭配 TDeng…...

前端接口请求支持内容缓存和过期时间

前端接口请求支持内容缓存和过期时间 支持用户自定义缓存时间&#xff0c;在规则时间内读取缓存内容&#xff0c;超出时间后重新请求接口 首先封装一下 axios&#xff0c;这一步可做可不做。但是在实际开发场景中都会对 axios 做二次封装&#xff0c;我们在二次封装的 axios …...

【计算机网络】数据链路层——以太网

文章目录 前言什么是以太网以太网帧格式6位目的地址和源地址2位类型数据长度CRC 校验和 数据在数据链路层是如何转发的 前言 前面我们学习了关于应用层——自定义协议、传输层——UDP、TCP协议、网络层——IP协议&#xff0c;今天我将为大家分享关于数据链路层——以太网方面的…...

【Spring】Spring MVC请求响应

文章目录 1. 请求1.1 传递单个参数1.2 传递多个参数1.3 传递对象1.4 后端参数重命名1.5 传递数组1.6 传递集合1.7 传递JSON对象1.8 获取URL中参数1.9 上传⽂件1.10 获得Cookie1.11 获得Session1.12 获得Header 2. 响应2.1 返回静态界面2.2 返回数据2.3 返回HTML代码片段2.4 返回…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...