机器学习:SVM的代码实现

news2024/9/27 6:45:12

目录

前言

一、完整代码

二、输出结果

三、实现步骤解析

1.读取数据

2.创建模型并训练

3.可视化SVM结果

总结


前言

        支持向量机(SVM,Support Vector Machine)是一种用于分类和回归的监督学习算法。它的核心思想是通过在特征空间中找到一个最佳的分隔超平面来将数据分成不同的类别。

 

一、完整代码

import pandas as pd

# 读取数据
data = pd.read_csv('iris.csv', header=None)

"""
使用SVM进行训练
"""
from sklearn.svm import SVC  # SVC做分类  SVR做回归

# 获取特征和标签
x = data.iloc[:, [1, 3]]
y = data.iloc[:, -1]
svm = SVC(kernel='linear', C=10, random_state=0)   # C=float('inf')将软间隔的惩罚设置为无穷大
svm.fit(x, y)

"""
可视化SVM结果
"""
# 参数w[原始数据为二维数组]
w = svm.coef_[0]
# 偏置项b[原始数据为一维数组]
b = svm.intercept_[0]
# 超平面方程:w1x1+w2x2+b=0
# ->>x2 = -(w1x1+b)/w2
import numpy as np

x1 = np.linspace(0, 7, 300)  # 在0-7内生成300个数据
# 超平面方程
x2 = -(w[0] * x1 + b) / w[1]
# 上超平面方程
x3 = (1 - (w[0] * x1 + b)) / w[1]
# 下超平面方程
x4 = (-1 - (w[0] * x1 + b)) / w[1]

import matplotlib.pyplot as plt

data1 = data.iloc[:50, :]
data2 = data.iloc[50:, :]
# 原数据为四维 无法展示 这里选择两个特征进行二维展示
plt.scatter(data1[1], data1[3], marker='+')
plt.scatter(data2[1], data2[3], marker='o')
# plt.show()

# 可视化超平面
plt.plot(x1, x2, linewidth=2, color='r')
plt.plot(x1, x3, linewidth=1, color='r', linestyle='--')
plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')
# 进行坐标轴限制
plt.xlim(4, 7)
plt.ylim(0, 6)

# 可视化支持向量
vets = svm.support_vectors_
plt.scatter(vets[:, 0], vets[:, 1], c='b', marker='x')
plt.show()

 

二、输出结果

 

三、实现步骤解析

1.读取数据

  • 这里使用的是鸢尾花的数据
import pandas as pd

# 读取数据
data = pd.read_csv('iris.csv', header=None)

 

2.创建模型并训练

  • svm模型里的C参数可以用来控制惩罚力度进而控制软间隔的程度
    • C越大,惩罚越严格,软间隔程度越小,越准确,但也越容易过拟合
    • C越小,惩罚越不严格,软间隔程度越大,越不准确,但也越不容易过拟合
"""
使用SVM进行训练
"""
from sklearn.svm import SVC  # SVC做分类  SVR做回归

# 获取特征和标签
x = data.iloc[:, [1, 3]]
y = data.iloc[:, -1]
svm = SVC(kernel='linear', C=10, random_state=0)   # C=float('inf')将软间隔的惩罚设置为无穷大
svm.fit(x, y)

 

3.可视化SVM结果

  • 获取svm模型里返回的系数和截距
  • 再通过系数和截距求出各直线方程
  • 最后进行二维的展示
"""
可视化SVM结果
"""
# 参数w[原始数据为二维数组]
w = svm.coef_[0]
# 偏置项b[原始数据为一维数组]
b = svm.intercept_[0]
import numpy as np

x1 = np.linspace(0, 7, 300)  # 在0-7内生成300个数据
# 超平面方程
x2 = -(w[0] * x1 + b) / w[1]
# 上超平面方程
x3 = (1 - (w[0] * x1 + b)) / w[1]
# 下超平面方程
x4 = (-1 - (w[0] * x1 + b)) / w[1]

import matplotlib.pyplot as plt

data1 = data.iloc[:50, :]
data2 = data.iloc[50:, :]
# 原数据为四维 无法展示 这里选择两个特征进行二维展示
plt.scatter(data1[1], data1[3], marker='+')
plt.scatter(data2[1], data2[3], marker='o')
# plt.show()

# 可视化超平面
plt.plot(x1, x2, linewidth=2, color='r')
plt.plot(x1, x3, linewidth=1, color='r', linestyle='--')
plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')
# 进行坐标轴限制
plt.xlim(4, 7)
plt.ylim(0, 6)

# 可视化支持向量
vets = svm.support_vectors_
plt.scatter(vets[:, 0], vets[:, 1], c='b', marker='x')
plt.show()

 

总结

        总的来说,SVM可以使用核函数处理非线性问题,通过将数据映射到更高维的空间。正则化参数C控制分类准确性与模型复杂度之间的平衡。SVM广泛应用于文本分类、图像识别、生物信息学和金融预测等领域。

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

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

相关文章

全网最适合入门的面向对象编程教程:39 Python 常用复合数据类型-集合

全网最适合入门的面向对象编程教程:39 Python 常用复合数据类型-集合 摘要: 在 Python 中,集合(set)是一种常用的复合数据类型。集合是一组无序且不重复的元素。与列表和元组不同,集合中的元素是无序的&am…

Webpack中的 HTTP 压缩

http压缩介绍 http压缩,是指一种内置在服务器和客户端之间改进传输速度和带宽利用率的方式。 http 压缩的流程: http 数据在服务器发送前,通过 webpack配置进行压缩;兼容的浏览器在向服务器发送请求时,在请求头中会…

JS Java Script知识简单记录

JS 参考 导入方式 内联样式,和css(style)很像 script标签导入,可以放在head或body标签中 外联样式 打印内容方式 console.log:在控制台显示 alert:网页弹窗 JS变量 var函数作用域,let是块作用域…

OpenCV杂项图像变换(2)线性混合函数blendLinear()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 执行两个图像的线性混合: dst ( i , j ) weights1 ( i , j ) ∗ src1 ( i , j ) weights2 ( i , j ) ∗ src2 ( i , j ) \texttt{…

FaceFormer嘴形同步论文复现

一、项目地址 https://github.com/EvelynFan/FaceFormer 二、复现过程 1、项目环境 系统:Ubuntu 18.04.1 python版本:Python 3.7 使用conda创建一个虚拟环境,安装requirements.txt中所需要的库 2、安装ffmpeg 教程网址:http…

kafka 入门

kafka 有分区和副本的概念,partition 3 表示有3个分区,replication 2 表示有2个副本 通过 --describe --topic test命令可以知道 test这个 主题的分区和副本情况,途中的replicas 表示 其他副本分区的情况,如第一条,t…

Docker 安装 Zookeeper + Kafka 保姆级教程

1.创建 docker-compose.yml 创建一个名为 docker-compose.yml 的文件,并添加以下内容: version: 3.6services:zookeeper:image: zookeeper:3.6container_name: zookeeperports:- "2181:2181"networks:- kafka-networkenvironment:ZOO_STANDA…

策略路由与路由策略

1.策略路由与路由策略 1.1 策略路由(Policy Routing) 1.1.1 定义 策略路由是一种根据特定策略或条件(如源地址、目的地址、协议类型、接口、QoS等)来决定网络包转发路径的技术,而不是单纯依赖传统的最短路径或最优路…

Linux-kubesphere(K8S)小白单机版搭建部署

目录 一、虚拟机环境设置 二、Kubesphere安装 1、安装工具 1)Socat、conntrack、ebtables、ipset 2)Docker 2、下载KubeKey 3、开始安装 参考官网:https://www.kubesphere.io/zh/docs/v3.4/quick-start/all-in-one-on-linux/ 一、虚拟机…

无监督3D场景理解,LLM 在 3D 场景理解中的应用与探索 !

构建能够理解和推理3D场景的模型很难,原因在于缺乏3D监督训练的数据来源和大规模训练策略。 在这项工作中,作者问到:在没有3D预训练的情况下,预训练语言模型中的知识如何被利用来理解和推理3D场景? 本工作的目标是确定…

HTML5有格调的个人介绍网站源码

文章目录 1.设计来源1.1 主界面1.2 个人信息界面1.3 项目统计界面1.4 我的相册界面1.5 朋友评价界面1.6 保持联系界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址&a…

JAVA后端框架--【Mybatis】

框架 框架就是对技术的封装,将基础的技术进行封装,让程序员快速使用,提高开发效率 java后端框架 mybatis 对jdbc进行封装 背景介绍 mybatis是apache下面的一个开源项目,名为ibatis,2010年开发团队转移到谷歌旗下…

unity3d拼图__附带资源

要达到吸附效果则需要每个拼图上挂载碰撞体 达到整张图片的替换效果需要选中所有拼图部件把材质球拖上去 、 制作材料球 脚本挂载到随便一个空物体上 using System.Collections; using System.Collections.Generic; using UnityEngine;public class PinTu : MonoBehaviour …

Qt编写贪吃蛇小游戏完整项目

文章目录 前言一、Qt环境准备二、编写思路三、编写代码1、开始游戏界面代码1.1、绘制界面1.2、界面基本配置 2、选择难度界面代码3、游戏房间界面制作3.1、界面基础配置3.2、提前配置类中的成员变量3.2.1、QRectF 3.3、检测游戏是否结束的方法3.4、蛇移动的实现3.4.1、蛇向上移…

智慧农业——生成式人工智能如何改变农业

在数字化转型时代,农业不再仅仅与土壤、水和阳光有关。随着生成式人工智能的出现,农业正变得更加智能、高效,并且越来越以数据为主导。从以前所未有的准确度预测作物产量到开发抗病植物品种,生成式人工智能使农民能够做出精确的决…

c语言个人笔记

linux嵌入式C语言 课程链接: [史上最强最细腻的linux嵌入式C语言学习教程李慧芹老师] 0. gcc与vim的使用 gcc 指令 -Wall:显示所有警告 gcc默认的警告包括真正的错误:error和 告警warning 执行过程 c源代码.c -> 预处理(E) -> 编译(S) -> 汇编©.o…

Clickhouse集群化(五)clickhouse语法学习

1. 基础 1.1. 建表建库 CREATE DATABASE IF NOT EXISTS helloworld use default; CREATE TABLE IF NOT EXISTS system_cpu_info (uuid String, -- 主机的唯一标识符source String, -- 数据来源标识resource_pool Strin…

011_IO体系

Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输出操作,在Java中把不同的输入/输出源抽象表述为"流"。 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称…

代码随想录 刷题记录-18 动态规划(1)基本理论及习题

一、基本理论 什么是动态规划 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分…

码云 云片滑块 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间头像私信联系我…