首页 > 其他分享 >机器学习之支持向量机SVM及测试

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

时间:2025-01-15 19:32:39浏览次数:3  
标签:plt 函数 cv2 SVM 测试 np 向量 svm

目录

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))

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

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

在这里插入图片描述

标签:plt,函数,cv2,SVM,测试,np,向量,svm
From: https://blog.csdn.net/m0_64588135/article/details/145098820

相关文章

  • C18.【C++ Cont】OJ测试用例的各种输入情况汇总
    目录1.思维导图2.单组测试用例3.多组测试用例1.测试数据组已知(输入)类模版例题2.测试数据组未知模版3.特殊值结束测试数据模版1.逐个字符处理2.一次读一行例题4.应对空格的处理方法1.一次读一行模板2.一次读一个单词5.应对数字的处理方法两个认知1.呈现在......
  • HackMyVM-XMAS靶机的测试报告
    目录一、测试环境1、系统环境2、使用工具/软件二、测试目的三、操作过程1、信息搜集2、Getshell3、提权四、结论一、测试环境1、系统环境渗透机:kali2021.1(192.168.159.127)靶 机:ubuntu23.04(192.168.159.158)注意事项:①该类型靶场只能在virtualBox上搭建......
  • 老司机带你聊聊向量数据库
    随着人工智能、大数据技术的发展,传统数据库已经难以满足某些复杂应用场景的需求,尤其是在图像、语音、文本等非结构化数据的处理上,传统的精确匹配方式已经显得力不从心。最近几年,向量数据库应运而生,成为了热门话题。向量数据库的核心优势在于它可以通过将数据转化为高维向量,在相似......
  • 实用键盘按键测试工具
    分享给大家一个windows实用小工具键盘按键测试工具工具功能很直接,就是键盘按键测试,能直观看到键盘的按键是否可用,有没有失灵,一般用不到,但用到的时候绝对可以帮到你界面如下你只管按,其他交给它,功能正常的按键会改变颜色,右下角reset可以重置界面,theme是设置界面风格,黑的......
  • 电源检测设备测试均衡性能
    电源检测设备是确保电力系统稳定运行的重要工具,它能够对电源的性能进行全面的测试和评估。在众多测试项目中,均衡性能测试是一个关键环节,它主要关注电源在不同负载条件下输出电压的稳定性和一致性。首先,我们需要了解什么是均衡性能。在电源系统中,均衡性能指的是电源在向多个负载供......
  • 为什么软件测试开发需要智能体(AI Agent)?
    随着人工智能技术的快速发展,AIAgent(智能体)已经成为软件测试开发中的一项颠覆性技术。从自动化测试到智能化缺陷检测,AIAgent正在改变传统的测试方式。那么,AIAgent到底有多强?它如何提升软件测试的效率与质量?本文将为你深入解析AIAgent在软件测试中的应用及其带来的巨大优......
  • (ICLR-2024)VERA:基于向量的随机矩阵自适应
    VERA:基于向量的随机矩阵自适应paper是阿姆斯特丹大学发表在ICLR2024的工作papertitle:VERA:VECTOR-BASEDRANDOMMATRIXADAPTATIONABSTRACT低秩自适应(LoRA)是一种流行的方法,可在微调大型语言模型时减少可训练参数的数量,但在扩展到更大的模型或部署大量按用户......
  • 渗透测试怎么做?看看大神一次完整的渗透测试实战
    渗透测试就是利用我们所掌握的渗透知识,对网站进行一步一步的渗透,发现其中存在的漏洞和隐藏的风险,然后撰写一篇测试报告,提供给我们的客户。客户根据我们撰写的测试报告,对网站进行漏洞修补,以防止黑客的入侵!渗透测试的前提是我们得经过用户的授权,才可以对网站进行渗透。如果我......
  • 【网络安全渗透测试零基础入门】一文带你0基础挖到逻辑漏洞(非常详细),轻松成为朋友眼中
    前言这是七海给粉丝盆友们整理的网络安全渗透测试入门阶段逻辑漏洞渗透与防御教程本文主要讲解如何从零基础带你挖到逻辑漏洞喜欢的朋友们,记得给我点赞支持和收藏一下,关注我,学习黑客技术。逻辑漏洞概述由于程序逻辑不严谨或逻辑太过复杂,导致一些逻辑分支不能正常处理或......
  • Windows 行为测试 删除 FileStream 正在读写文件可以继续读写
    测试结论:使用FileShare带Delete的共享方式打开的FileStream正在对文件进行读写过程中,可以对正在读写的文件进行删除。文件删除之后,不影响已经打开的FileStream的读写。且此时使用File.Exists方法判断文件是否存在,返回的是不存在如果删除之后,再次在外部新建同名文件,则......