机器学习之支持向量机SVM及测试

目录

    • 1 支持向量机SVM
      • 1.1 概念
      • 1.2 基本概念
      • 1.3 主要特点
      • 1.4 优缺点
      • 1.5 核函数
      • 1.6 常用的核函数
      • 1.7 函数导入
      • 1.8 函数参数
    • 2 实际测试
      • 2.1 二维可视化测试代码
      • 2.2 多维测试

1 支持向量机SVM


1.1 概念

支持向量机(Support Vector Machine,简称SVM)是一种二分类模型,它的基本模型定义为特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的学习策略就是间隔最大化,可形式化为一个求解凸二次规划问题的过程。

1.2 基本概念

  • 支持向量:在分类问题中,支持向量是那些离分隔超平面最近的数据点。
  • 间隔:间隔是指分隔超平面与最近的训练数据点之间的距离,最大化间隔可以增加模型的泛化能力。
  • 核函数:用于将输入数据映射到更高维的空间,以便可以找到合适的分隔超平面。

1.3 主要特点

  • 有效性与准确性:在中小规模的数据集上,SVM表现出色。
  • 适用于高维数据:即使数据维度比样本数量还要高,SVM也可以有效工作。
  • 不同核函数的选择:线性的、非线性的(例如多项式核、径向基函数核等)都可以使用。

1.4 优缺点

  • 优点

    • 有严格的数学理论支持,可解释性强,不同于传统的统计方法能简化我们遇到的问题。
    • 能找出对任务有关键影响的样本,即支持向量。
    • 软间隔可以有效松弛目标函数。
    • 核函数可以有效解决非线性问题。
    • 最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。
    • SVM在小样本训练集上能够得到比其它算法好很多的结果。
  • 缺点

    • 对大规模训练样本难以实施。
      SVM的空间消耗主要是存储训练样本和核矩阵,当样本数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间,超过十万及以上不建议使用SVM。

    • 对参数和核函数选择敏感。
      支持向量机性能的优劣主要取决于核函数的选取,所以对于一个实际问题而言,如何根据实际的数据模型选择合适的核函数从而构造SVM算法。目前没有好的解决方法解决核函数

    • 模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。

在机器学习领域,SVM是一种非常强大且常用的工具,它的数学理论基础坚实,实践效果良好。在应用SVM时,合理选择核函数和调整参数是提高模型性能的关键。

1.5 核函数

在这里插入图片描述
在这里插入图片描述

1.6 常用的核函数

在这里插入图片描述

  • 多项式核函数
    在这里插入图片描述

  • 高斯核函数
    在这里插入图片描述
    在这里插入图片描述

1.7 函数导入

from sklearn.svm import SVC

1.8 函数参数

  • C :惩罚因子【浮点数,默认为1.】【软间隔】
    (1)C越大,对误分类的惩罚增大,希望松弛变量接近0,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱
    (2)C值小,对误分类的惩罚减小允许容错,将他们当成噪声点,泛化能力较强
    ->>建议通过交叉验证来选择

  • kernel: 核函数【默认rbf(径向基核函数|高斯核函数)】
    可以选择线性(linear)、多项式(poly)、sigmoid

    ->>多数情况下选择rbf

  • degree:【整型,默认3维】
    多项式poly函数的维度,默认是3,选择其他核函数时会被忽略

    ->>按默认【选择rbf之后,此参数不起作用】

  • gamma: ‘rbf’,‘poly’ 和‘sigmoid’的核函数参数,默认是’auto’
    (1)如果gamma是’auto’,那么实际系数是1 / n_features,也就是数据如果有10个特征,那么gamma值维0.1。(sklearn0.21版本)
    (2)在sklearn0.22版本中,默认为’scale’,此时gamma=数据集所有值的方差。
    (3)gamma越大,过拟合风险越高,gamma越小,过拟合风险越低
    ->>建议通过交叉验证来选择

  • coef0:核函数中的独立项。多项式的偏置项。它只在’poly’和’sigmoid’中很重要

  • probability :是否启用概率估计。允许在模型训练完成后,使用predict_proba方法来预测每个类别的概率,而不是仅仅给出类别的预测结果。必须在调用fit之前启用它,并且会减慢该方法的速度。默认为False,按默认即可【选择rbf之后,不起作用】

  • cache_size :核函数cache缓存大小,默认为200MB,不用调整

  • class_weight :类别的权重,字典形式传递。默认’balanced’,按默认设置

重要的参数有:C、kernel、degree、gamma。

2 实际测试


2.1 二维可视化测试代码

数据
在这里插入图片描述

代码展示:

import matplotlib.pyplot as plt
import pandas as pd

data = pd.read_csv('iris.csv',header=None)
data0 = data.iloc[:50,:]
data1 = data.iloc[50:,:]
plt.scatter(data0[1],data0[3],marker='+')
plt.scatter(data1[1],data1[3],marker='o')
plt.show()

from sklearn.svm import SVC

x = data.iloc[:,[1,3]]
y = data.iloc[:,-1]
svm = SVC(kernel='linear',C=float('inf'),random_state=0)
svm.fit(x,y)
# 可视化
w = svm.coef_[0]
b = svm.intercept_[0]

import numpy as np
x1 = np.linspace(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]

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,5)
vets = svm.support_vectors_
plt.scatter(vets[:,0],vets[:,1],c='b',marker='x')
plt.xlim(4,7)
plt.ylim(0,5)
plt.show()

运行结果:
在这里插入图片描述
在这里插入图片描述

2.2 多维测试

部分数据:
在这里插入图片描述
在这里插入图片描述

代码展示:

import cv2
import numpy as np

# 只能是灰度图
img1 = cv2.imread('tu_data.png')
img = cv2.imread('tu_data.png',0)
# print(type(img1),type(img))
# 每个数字区域为20*20,每5行都是同一个数字
# hsplit 竖向切分,vsplit 沿行横向切分
# 列表生成式,先横向切分切50行,再将横向行数据竖向切分,每行切100列,共50*100=5000个图片数据,每个都是一个1000/50=20,2000/100=20
#每个图片都是20*20的数值
cells = [np.hsplit(row,100) for row in np.vsplit(img,50)]
# print(cells)
# 图片数据转np矩阵
data_img = np.array(cells)
# print(data_img)
# 切分数据一半,一半作为历史数据培训模型,一半作为测试数据,检测
# 切分后的是一半是5000/2=2500个,从中间竖切一半变为50*50
train_x = data_img[:,:50]
test_x = data_img[:,50:100]
# 根据图片结果构建0-9的y类别标签
# 生成0-9的np矩阵
k = np.arange(10)
# 复制标签
# 从0到9,依次复制250个,50*5=250
lab = np.repeat(k,250)

t1 = cv2.imread('t1.png',0)
t2 = cv2.imread('t2.png',0)
t3 = cv2.imread('t3.png',0)
t4 = cv2.imread('t4.png',0)
t5 = cv2.imread('t5.png',0)
t6 = cv2.imread('t6.png',0)
t7 = cv2.imread('t7.png',0)
t8 = cv2.imread('t8.png',0)
t9 = cv2.imread('t9.png',0)
t0 = cv2.imread('t0.png',0)
tt = np.array([t0,t1,t2,t3,t4,t5,t6,t7,t8,t9])
k = np.array([0,1,2,3,4,5,6,7,8,9])
from sklearn.metrics import confusion_matrix
import matplotlib.pyplot as plt
def cm_plot(y,y_pr):
    cm = confusion_matrix(y,y_pr)
    plt.matshow(cm,cmap=plt.cm.Blues)
    plt.colorbar()
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x,y],xy=(y,x),horizontalalignment='center',verticalalignment='center')
            plt.ylabel('TRUE label')
            plt.xlabel('PREDICTED label')
    return plt

from sklearn.svm import SVC
tr_x = (train_x.reshape(-1,400)).astype(np.float32)
te_x = (test_x.reshape(-1,400)).astype(np.float32)
t_lab = lab
svm = SVC(kernel='linear',C=float('inf'),random_state=0)
svm.fit(tr_x,t_lab)

tr_pr = svm.predict(tr_x)
te_pr = svm.predict(te_x)
from sklearn import metrics
print(metrics.classification_report(t_lab,te_pr,digits=6))
c_range = [0.01,0.1,0.5,0.8,1,5,10,100]
## 循环测试带入因子
from sklearn.model_selection import cross_val_score
scores = []
for i in c_range:
    # start_time = time.time()
    svm = SVC(kernel='linear',C=i,random_state=0)
    # 模型迭代5次后的所有模型的值
    score = cross_val_score(svm,tr_x,t_lab,cv=5)
    # score的平均值
    score_m = sum(score)/len(score)
    # scores列表添加均值
    scores.append(score_m)
    print(f'{i}: {score_m}')

best_c = c_range[np.argmax(scores)]
svm = SVC(kernel='linear',C=best_c,random_state=0)
svm.fit(tr_x,t_lab)
tr_pr = svm.predict(tr_x)
cm_plot(tr_pr,t_lab).show()
te_pr = svm.predict(te_x)
print(metrics.classification_report(t_lab,te_pr,digits=6))
vets = svm.support_vectors_
svm = SVC(kernel='rbf',C=best_c,random_state=0)
svm.fit(tr_x,t_lab)
te_pr = svm.predict(te_x)
print(metrics.classification_report(t_lab,te_pr,digits=6))

运行结果:在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

云服务信息安全管理体系认证,守护云端安全

在数据驱动的时代,云计算已成为企业业务的超级引擎,推动着企业飞速发展。然而,随着云计算的广泛应用,信息安全问题也日益凸显,如同暗流涌动下的礁石,时刻威胁着企业的航行安全。这时,云服务信息…

服务器数据恢复—Zfs文件系统数据恢复案例

服务器数据恢复环境&故障: 一台zfs文件系统的服务器,管理员误操作删除了服务器上的数据。 服务器数据恢复过程: 1、将故障服务器中所有硬盘做好标记后取出,硬件工程师检测后没有发现有硬盘存在硬件故障。以只读方式将所有硬盘…

​​​​​​​​​​​​​​★3.3 事件处理

★3.3.1 ※MouseArea Item <-- MouseArea 属性 acceptedButtons : Qt::MouseButtons containsMouse : bool 【书】只读属性。表明当前鼠标光标是否在MouseArea上&#xff0c;默认只有鼠标的一个按钮处于按下状态时才可以被检测到。 containsPress : bool curs…

GIS大模型:三维重建与建模

文章目录 数据收集预处理特征提取深度估计点云生成表面重建纹理映射大模型的角色 大模型在三维重建与建模方面&#xff0c;尤其是在处理低空地图数据时&#xff0c;展现了其强大的能力。通过使用深度学习算法&#xff0c;特别是那些基于卷积神经网络&#xff08;CNNs&#xff0…

wireshark抓路由器上的包 抓包路由器数据

文字目录 抓包流程概述设置抓包配置选项 设置信道设置无线数据包加密信息设置MAC地址过滤器 抓取联网过程 抓包流程概述 使用Omnipeek软件分析网络数据包的流程大概可以分为以下几个步骤&#xff1a; 扫描路由器信息&#xff0c;确定抓包信道&#xff1b;设置连接路由器的…

阿里云无影云电脑的使用场景

阿里云无影云电脑是一种安全、高效的云上虚拟桌面服务&#xff0c;广泛应用于多种场景&#xff0c;包括教育、企业办公、设计与视频制作、客服中心等。以下是九河云总结的无影云电脑的几个典型使用场景&#xff1a; #### 1. 教育机构 - **业务痛点**&#xff1a; - 学生实践操…

力扣 查找元素的位置

二分查找经典例题。 题目 要是只是从数组中用二分查找对应的元素&#xff0c;套一下模板一下就可以得出了&#xff0c;然后这题就在于其中会有多个目标元素&#xff0c;要用不同的方式在找到第一个元素时再做偏移。 时间复杂度&#xff1a;O(log n)&#xff0c;空间复杂度&am…

Profibus DP转Modbus TCP协议转换网关模块功能详解

Profibus DP 和 Modbus TCP 是两种不同的工业现场总线协议&#xff0c;Profibus DP 常用于制造业自动化领域&#xff0c;而 Modbus TCP 则在工业自动化和楼宇自动化等领域广泛应用。实现 Profibus DP 转 Modbus TCP 功能&#xff0c;通常需要特定的网关设备&#xff0c;以下为你…

SQL Prompt 插件

SQL Prompt 插件 注&#xff1a;SQL Prompt插件提供智能代码补全、SQL格式化、代码自动提示和快捷输入等功能&#xff0c;非常方便&#xff0c;可以自行去尝试体会。 1、问题 SSMS&#xff08;SQL Server Management Studio&#xff09;是SQL Server自带的管理工具&#xff0c…

OpenCV基础:矩阵的创建、检索与赋值

本文主要是介绍如何使用numpy进行矩阵的创建&#xff0c;以及从矩阵中读取数据&#xff0c;修改矩阵数据。 创建矩阵 import numpy as npa np.array([1,2,3]) b np.array([[1,2,3],[4,5,6]]) #print(a) #print(b)# 创建全0数组 eros矩阵 c np.zeros((8,8), np.uint8) #prin…

【Flink系列】9. Flink容错机制

9. 容错机制 在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 9.1 检查点&#xff08;Checkpoint&#xff09; 9.1.1 检查点的保存 1&#xff09;周期性的触发保存 “随时存档”确实恢复起来方便&#xff0c;可是需要我…

于灵动的变量变幻间:函数与计算逻辑的浪漫交织(上)

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 这一节我们主要来学习函数的概念&#xff0c;了解库函数中的标准库、头文件&#xff0c;了解自定义函数…

【CSS】---- CSS 实现超过固定高度后出现展开折叠按钮

1. 实现效果 2. 实现方法 使用 JS 获取盒子的高度&#xff0c;来添加对应的按钮和样式&#xff1b;使用 CSS 的浮动效果&#xff0c;参考CSS 实现超过固定高度后出现展开折叠按钮&#xff1b;使用容器查询 – container 语法&#xff1b;使用 clamp 函数进行样式判断。 3. 优…

STM32F407接HX711称重传感器

在许多嵌入式项目中&#xff0c;如智能家居、物流管理等&#xff0c;都需要用到精确的重量测量功能。STM32F407作为一款高性能的微控制器&#xff0c;搭配HX711称重传感器&#xff0c;可以轻松实现这一需求。本文将详细介绍如何将STM32F407与HX711称重传感器进行连接和编程&…

大模型UI:Gradio全解11——Chatbot:融合大模型的聊天机器人(4)

大模型UI&#xff1a;Gradio全解11——Chatbot&#xff1a;融合大模型的聊天机器人&#xff08;4&#xff09; 前言本篇摘要11. Chatbot&#xff1a;融合大模型的多模态聊天机器人11.4 使用Blocks创建自定义聊天机器人11.4.1 简单聊天机器人演示11.4.2 流式传输Chatbot11.4.3 添…

卷积神经网络——食物分类

整体框架&#xff1a; 导入库 导入了各种必需的Python库&#xff0c;用于数据处理、图像读取、模型构建和训练。 设置随机种子 seed_everything: 用于设置所有随机数生成器的种子&#xff0c;确保每次运行时的结果都是相同的。 图像预处理&#xff08;transform&#xff09; 对…

Dify应用-工作流

目录 DIFY 工作流参考 DIFY 工作流 2025-1-15 老规矩感谢参考文章的作者,避免走弯路。 2025-1-15 方便容易上手 在dify的一个桌面上,添加多个节点来完成一个任务。 每个工作流必须有一个开始和结束节点。 节点之间用线连接即可。 每个节点可以有输入和输出 输出类型有,字符串,…

LLM实现视频切片合成 前沿知识调研

1.相关产品 产品链接腾讯智影https://zenvideo.qq.com/可灵https://klingai.kuaishou.com/即梦https://jimeng.jianying.com/ai-tool/home/Runwayhttps://aitools.dedao.cn/ai/runwayml-com/Descripthttps://www.descript.com/?utm_sourceai-bot.cn/Opus Cliphttps://www.opu…

ASP.NET Core - 依赖注入(四)

ASP.NET Core - 依赖注入&#xff08;四&#xff09; 4. ASP.NET Core默认服务5. 依赖注入配置变形 4. ASP.NET Core默认服务 之前讲了中间件&#xff0c;实际上一个中间件要正常进行工作&#xff0c;通常需要许多的服务配合进行&#xff0c;而中间件中的服务自然也是通过 Ioc…

刷刷题刷题刷题

springaop 和 aspect aop的区别 springaop 是动态代理增强 aspect aop 是静态代理&#xff0c;在编译阶段生成aop代理类。这个时候是编译时增强 aop通知执行顺序 AOP 、OOP是啥 aop是面向切面 oop是面向对象 ComponentScan 不设置 basepackage也能进行扫描 没有配置&…