机器学习知识总结 —— 16.如何实现一个简单的SVM算法

news2024/9/27 12:10:54

文章目录

  • 创建具有特征的二维数据
  • 实现SVM算法
    • 线性核函数
    • 梯度下降和损失函数
    • 训练
    • 实验效果
  • 总结

在前面的章节里,已经简要的介绍了SVM算法的工作原理,现在在这篇文章里,我们来看看SVM算法的一些简单实现。

创建具有特征的二维数据

一般来说,要实现SVM算法对数据的分类任务,我们需要数据至少具备二维的属性(properties)或者标签(attributes)。这里,我们使用numpy中可生成正态分布的随机数生成工具 np.random.normal 大致具体用法如下:

import numpy as np

# 生成随机数据
np.random.seed(0)

# 特征数据1
upper_x = np.random.normal(3, 1.5, (1000, 1))
upper_y = np.random.normal(3, 1.5, (1000, 1))

# 特征数据2
lower_x = np.random.normal(-3, 1.5, (1000, 1))
lower_y = np.random.normal(-3, 1.5, (1000, 1))

# 生成数据集
X = np.concatenate((upper_x, lower_x), axis=0)
y = np.concatenate((upper_y, lower_y), axis=0)

我们把数据PLOT出来看看这些数据生成后是什么样

在这里插入图片描述
这种样子可以看到大多数数据聚集在两个部分,少部分个别数据可能会有点重合而不是那么明显可以判断出它属于哪一类,这种形态的数据在我们日常数据分析中也是非常常见的一种样子。

实现SVM算法

Python可以使用 scikit-learn 这个库来做大量传统机器学习的任务,但是既然我的系列一直秉承知其然更要知其所以然,所以我们还是一如既往使用最基础的 numpy 工具库来实现我们所有的机器学习算法。

大致上来说,一个SVM算法,主要由以下几部分组成

线性核函数

def linear_kernel(x1, x2):
    return np.dot(x1, x2.T)

在前面介绍了SVM分类算法,其中最关键的不是使用什么曲线或者更复杂的方程来实现分类任务,而是十分干脆简单的在不同数据集中找到分类平面。因此对于二维数据,它的分类平面就是线性方程。

梯度下降和损失函数

# 梯度下降与损失函数
def svm_loss(W, X, y, C=1.0):
    n_samples, n_features = X.shape
    margins = np.maximum(0, 1 - y * np.dot(X, W))
    loss = (np.sum(margins) + 0.5 * C * np.dot(W, W)) / n_samples
    return loss

def svm_grad(W, X, y, C=1.0):
    n_samples, n_features = X.shape
    margins = np.maximum(0, 1 - y * np.dot(X, W))
    grad = -(np.dot(X.T, y * (margins > 0))) / n_samples + C * W
    return grad

这个对于我们非常重要,如果你看过我其他博文,就能知道在较为高等的算法中,为了找到数据最合适的解,我们一般会引入梯度下降算法。

训练

然后就是对实验数据的训练函数

def train(X, y, C=1.0, max_iter=1000, tol=1e-5):
    n_samples, n_features = X.shape
    W = np.zeros((n_features,))
    for i in range(max_iter):
        loss = svm_loss(W, X, y, C)
        grad = svm_grad(W, X, y, C)
        W -= grad
        if np.linalg.norm(grad) < tol:
            break
    return W

然后有了这些重要的组成部分后,我们可以来看看实验效果了

实验效果

首先依然生成一堆随机数据

# 预测
test_x = np.random.normal(0, 1, (100, 1))
test_y = np.random.normal(0, 1, (100, 1))

然后我们实现一个预测函数,其实主要是把上述数据与生成的模型进行乘积,然后结果用正负号进行区分

def predict(X, W):
    return np.sign(np.dot(X, W))
    
pred = predict(test_x, W)

然后把结果绘制出来

# 可视化
import matplotlib.pyplot as plt
plt.scatter(test_x[pred == 1], test_y[pred == 1], c='red')
plt.scatter(test_x[pred == -1], test_y[pred == -1], c='green')
plt.show()

输出图像如下

在这里插入图片描述

还不错,大致上和我们希望的差不多。当然上述实现方法简单而粗糙,但对于深入理解SVM是怎么工作能有一定的帮助。

总结

此外,如果需要对不平衡的数据进行分类,那么可能需要使用更高级的方法来调整损失函数。例如,对于少数类别,可以使用不同的权重来调整损失函数。

如果需要对高维数据进行分类,那么可能需要使用核技巧来解决该问题。在这种情况下,可以使用高斯核函数代替线性核函数。

如果需要对大规模的数据进行分类,那么可能需要使用分布式计算来解决该问题。在这种情况下,可以使用类似于Apache Spark或Hadoop之类的工具来处理数据。

还有一些其他的因素需要考虑,例如模型的正则化,模型的结构等等,在实际应用中需要根据具体情况来调整参数和数据的处理方式。

此外,如果你希望使用更高级的优化算法来训练模型,例如拉格朗日乘数法或者共轭梯度法,也不是不可以,但是吧到这种情况自己实现起来特别复杂,所以最好还是直接使用工具库比较好点。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【闪电侠学netty】第8章 客户端与服务端通信协议编解码

【Netty】读书笔记 - 跟闪电侠学 1. 内容概要 1.1 总结 1.1.1 编码与解码定义 编码&#xff1a;把java对象根据协议封装成二进制数据包的过程 解码&#xff1a;从二进制数据包中解析出Java对象的过程 1.1.2 设计了如下几个类 文件名类型描述Serializerinterface 作用&#…

MacOS Docker 安装和运行原理

本文讲述主要是基于Mac电脑安装教程&#xff0c;使用的是homebrew安装&#xff0c;未安装homebrew的请先自行安装下 一、使用 Homebrew 安装 macOS 我们可以使用 Homebrew 来安装 Docker。Homebrew 的 Cask 已经支持 Docker for Mac&#xff0c;因此可以很方便的使用 Homebrew…

【代码实验】CNN实验——利用Imagenet子集训练分类网络(AlexNet/ResNet)

文章目录前言一、数据准备二、训练三、结果前言 Imagenet是计算机视觉的经典分类比赛&#xff0c;但是Imagenet数据集本身太大了&#xff0c;我们穷学生没有这么大的算力&#xff0c;2016年google DeepMind团队从Imagnet数据集中抽取的一小部分&#xff08;大小约3GB&#xff…

DBCO-PEG-Methacrylate_DBCO-PEG-MA_二苯并环辛炔-PEG-甲基丙烯酸酯

一、试剂基团反应特点&#xff08;Reagent group reaction characteristics&#xff09;&#xff1a;DBCO&#xff08;二苯并环辛炔&#xff09;是一种环炔烃&#xff0c;可以通过在水溶液中通过应变促进的1,3-偶极环加成反应与叠氮化物反应&#xff0c;这种生物正交反应也称为…

Crack:MindFusion.Diagramming for ASP.NET V7.0

MindFusion.Diagramming for ASP.NET V7.0 MindFusion.Diagramming for ASP.NET 为 Web 应用程序提供图表功能。它包括丰富的预定义图表节点以及具有无限行数和列数的表节点。您可以在容器中组织节点&#xff0c;形状设计器 UI 工具可帮助您快速轻松地生成自己的图表节点。 添加…

GD32F450工程模板创建

一、新建工程目录 序号文件夹备注1Project存放工程文件&#xff0c;编译文件等。2Firmware存放ARM内核文件&#xff0c;标准外设库文件等。3Hardware存放开发板的硬件驱动文件。4App存放应用层文件。5User存放main函数&#xff0c;gd32f4xx_it文件&#xff0c;systick文件。6D…

【GD32F427开发板试用】07-硬件SPI驱动0.96LCD

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;Stark_GS SPI 简介及特点 具有全双工、半双工和单工模式的主从操作。16位宽度&#xff0c;独立的发送和接收缓冲区。8位或16位数据帧格式。低…

火出圈的《中国奇谭》,如果浪浪山的小妖怪们也用WorkPlus

你会被一只小妖怪感动到破防吗&#xff1f; 最近&#xff0c;由上海美术电影制片厂和B站联合推出的动画片《中国奇谭》火了&#xff0c;仅仅一上线就被打出9.9的高分&#xff0c;频繁登上微博热搜。 其中&#xff0c;第一集《小妖怪的夏天》取材自《西游记》&#xff0c;却从…

Unity编辑器右键菜单实现多平台游戏资源打包—AssetBundle的构建

文章目录&#x1f449;一、初识AssetBundle&#x1f449;二、创建AssetBundle&#x1f449;三、动手操作&#xff1a;实现右键菜单打包AssetBundle&#x1f449;一、初识AssetBundle AssetBundle是Unity提供的一种打包资源的文件格式&#xff0c;比如模型、纹理和音频文件等的各…

大数据导论

数据是什么数据是指对客观事件进行记录并可以鉴别的符号&#xff0c;是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合&#xff0c;它是可识别的、抽象的符号。它不仅指狭义上的数字&#xff0c;还可以是具有一定意义的文字、字母、数字符号的组…

python学习 --- 元组基础

目录 一、什么是元组 1、不可变序列和可变序列 2、元组 二、 元组的创建方式 1、小括号&#xff08;可省略&#xff09; 2、内置函数tuple() 三、元组的获取与遍历 1、元组的获取 2、元组的遍历 一、什么是元组 1、不可变序列和可变序列 不可变序列&#xff1a;没有增…

使用streamlit记录

官方网址&#xff1a;https://docs.streamlit.io/ 官方网址&#xff1a;https://discuss.streamlit.io/t/streamlit-components-community-tracker/4634 官方网址&#xff1a;https://github.com/streamlit/streamlit 第三方插件网址&#xff1a;https://github.com/arnaudmiri…

Solidity 中的数学(第 2 部分:溢出)

本文是关于在 Solidity 中进行数学运算的系列文章中的第二篇。这次的主题是&#xff1a;溢出。 介绍 每次我看到、*或**审计另一个 Solidity 智能合约时&#xff0c;我都会开始写以下评论&#xff1a;“这里可能会溢出”。我需要几秒钟来写这四个字&#xff0c;在这几秒钟内&a…

【Pandas】18 小练习

#【Pandas】18 小练习 2023.1.16 两个pandas小练习 18.1 疫情数据分析 18.1.1 观察数据 import pandas as pd import osdf pd.read_csv("data/covid19_day_wise.csv") dfDateConfirmedDeathsRecoveredActiveNew casesNew deathsNew recoveredDeaths / 100 CasesR…

日常渗透刷洞的一些小工具

SecurityServiceBox&#xff1a;一个Windows平台下既可以满足安服仔日常渗透工作也可以批量刷洞的工具盒子 0x00 更新题外话—终端选取 在盒子的tools当中&#xff0c;很多工具运行都是带有颜色标识的&#xff0c;例如nuclei&#xff0c; vulmap&#xff0c;原生的cmd终端虽然…

MD5有哪些特性,常用的MD5加密真的安全吗

在密码学中&#xff0c;MD5是比较常用的算法之一。大家都知道MD5曾一度被认为十分安全&#xff0c;并且在国内外得到广泛适用。然而&#xff0c;王小云教授的研究证明利用MD5算法的磕碰能够严重威胁信息体系安全&#xff0c;因此引发了密码学界的轩然大波。那么&#xff0c;关于…

为什么JDK中String类的indexof不使用KMP或者Boyer-Moore等时间复杂度低的算法编辑器

indexOf底层使用的方法是典型的BF算法。 1、KMP算法 由来 外国人&#xff1a; Knuth&#xff0c;Morris和Pratt发明了这个算法&#xff0c;然后取它三个的首字母进行了命名。所以叫做KMP。 KMP真的很难理解&#xff0c;建议多看几遍 B站代码随想录&#xff0c;文章也的再好 …

【蓝桥杯备赛系列 | 真题 | 简单题】2014年第五届真题-分糖果

&#x1f935;‍♂️ 个人主页: 计算机魔术师 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 蓝桥杯竞赛专栏 | 简单题系列 &#xff08;一&#xff09; 作者&#xff1a; 计算机魔术师 版本&#xff1a; 1.0 &#xff08…

【博客597】iptables如何借助连续内存块通过xt_table结构管理流量规则

iptables如何借助连续内存块通过xt_table结构管理流量规则 1、iptables 分为两部分&#xff1a; 用户空间的 iptables 命令向用户提供访问内核 iptables 模块的管理界面。内核空间的 iptables 模块在内存中维护规则表&#xff0c;实现表的创建及注册。 2、iptables如何管理众…

第十二章 数据库设计

前言 本文章为看视频所写。 视频链接&#xff1a;168. 14.1 数据库设计前言_哔哩哔哩_bilibili 目录 前言 章节提要 一、数据库设计过程 二、E-R模型 三、答题技巧 四、案例分析 1、案例1 二、案例2 章节提要 一、数据库设计过程 ER模型&#xff1a;是实体联系模型&#x…