首页 > 其他分享 >【机器学习】支持向量机SVM|高斯核 讲解及代码实现

【机器学习】支持向量机SVM|高斯核 讲解及代码实现

时间:2024-10-21 21:19:46浏览次数:3  
标签:plot plt 高斯 tran SVM import scatter 向量 sklearn

支持向量机 SVM

支持向量机介绍

  • SVM全称是Supported Vector Machine(支持向量机)

    • 即寻找到一个超平面使样本分成两类,并且间隔最大。
    • 是一种监督学习算法,主要用于分类,也可用于回归
    • 与逻辑回归和决策树等其他分类器相比,SVM 提供了非常高的准确度

    在这里插入图片描述

  • 优点:

    • 适合小样本 高纬度数据 比较强泛化能力
    • 可有效的处理高纬度数据;可使用不同和核函数来适应不同的数据类型
  • 缺点:

    • 计算复杂度高,对于大规模数据处理肯会存在困难
  • 超平面最大间隔

在这里插入图片描述

  • 硬间隔 Hard Margin
    • 如果样本线性可分,在所有样本分类都正确的情况下,寻找最大间隔,这就是硬间隔
    • 如果出现异常值或样本不能线性可分,此时硬间隔无法实现

在这里插入图片描述

  • 软间隔 Soft Margin 和惩罚系数

    • 允许部分样本,在最大间隔之内,甚至在错误的一边,寻找最大间隔,这就是软间隔
    • 目标是尽可能在保持间隔宽度和限制间违例之间找到良好的平衡
    • 通过惩罚系数C来控制职工平衡:C值越小,则间隔越宽,短时间隔违例也会越多
  • 核函数 Kernel

    • 核函数将原始输入空间映射到新的特征空间,使得原本线性不可分的样本在核空间可分

    在这里插入图片描述

支持向量机API的使用

sklearn.svm.LinearSVC(C = 1.0)
  • C: 惩罚系数, 类似于线性回归的正则化系数
  • LinearSVC API 的使用方式:
from sklearn.svm import LinearSVC
mysvc = LinearSVC(C = 30)
mysvc.fit(X_standard,y)
print(mysvc.score(X_standard, y))

代码实现

import numpy as np  # numpy
import matplotlib.pyplot as plt  # 数据可视化
from sklearn import datasets  # 数据集
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import StandardScaler  # 数据预处理
from sklearn.svm import LinearSVC  # 线性SVM
from plot_util import plot_decision_boundary

def demo01():
    '''
    鸢尾花分类
    :return:
    '''
    # 2.加载数据及数据预处理
    # 2.1 加载数据
    X, y = load_iris(return_X_y=True)

    print(y.shape)
    print(X.shape)
    # 2.2 数据降维
    x = X[y < 2, :2]
    y = y[y < 2]
    print(y.shape)

    plt.scatter(x[y == 0, 0], x[y == 0, 1], c='red')
    plt.scatter(x[y == 1, 0], x[y == 1, 1], c='blue')
    plt.show()

    # 2.3 数据预处理,标准化
    transform = StandardScaler()
    x_tran = transform.fit_transform(x)

    # 3.模型训练
    model = LinearSVC(C=10, dual='auto')
    model.fit(x_tran, y)

    # 4.模型预测
    y_pred = model.predict(x_tran)

    # 5.模型评估
    # 5.1 准确率
    print(accuracy_score(y_pred, y))
    # 5.2 可视化
    plot_decision_boundary(model, axis=[-3, 3, -3, 3])
    plt.scatter(x_tran[y == 0, 0], x_tran[y == 0, 1], c='red')
    plt.scatter(x_tran[y == 1, 0], x_tran[y == 1, 1], c='blue')
    plt.show()

if __name__ == '__main__':
    demo01()

运行结果

在这里插入图片描述

惩罚参数C对超平面影响代码实现

"""
## C值测试
# 1.导入依赖包
# 2.加载数据及数据预处理
# 2.1 加载数据
# 2.2 数据降维
# 2.3 数据预处理,标准化
# 3.模型训练
# 4.模型预测
# 5.模型评估
# 5.1 准确率
# 5.2 可视化
"""

# 1.导入依赖包
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
from sklearn.metrics import accuracy_score
from plot_util import plot_decision_boundary, plot_decision_boundary_svc

# 2.加载数据及数据预处理
# 2.1加载数据
X, y = load_iris(return_X_y=True)

# print(y.shape)
# print(X.shape)
# 2.2 数据降维
x = X[y < 2, :2]
y = y[y < 2]
# print(y.shape)

plt.scatter(x[y == 0, 0], x[y == 0, 1], c='red')
plt.scatter(x[y == 1, 0], x[y == 1, 1], c='blue')
plt.show()

# 2.3 数据的预处理,标准化
transform = StandardScaler()
x_tran = transform.fit_transform(x)

# --------------------测试一:C=30--------------------------------------------------- #
# 3.模型训练
model = LinearSVC(C=30, dual='auto')
model.fit(x_tran, y)

# 4.模型预测
y_pred = model.predict(x_tran)

# 5.模型评估
# 5.1 准确率
print(accuracy_score(y_pred, y))
# 5.2 可视化
plot_decision_boundary_svc(model, axis=[-3, 3, -3, 3])
plt.scatter(x_tran[y == 0, 0], x_tran[y == 0, 1], c='red')
plt.scatter(x_tran[y == 1, 0], x_tran[y == 1, 1], c='blue')
plt.show()

# --------------------测试二:C=0.01--------------------------------------------------- #

# 3.模型训练
model = LinearSVC(C=0.01, dual='auto')
model.fit(x_tran, y)

# 4.模型预测
y_pred = model.predict(x_tran)

# 5.模型评估
# 5.1 准确率
print(accuracy_score(y_pred, y))
# 5.2 可视化
plot_decision_boundary_svc(model, axis=[-3, 3, -3, 3])
plt.scatter(x_tran[y == 0, 0], x_tran[y == 0, 1], c='red')
plt.scatter(x_tran[y == 1, 0], x_tran[y == 1, 1], c='blue')
plt.show()

运行结果:

在这里插入图片描述

可以看见当惩罚参数不合适时,超参平面包含了较多错误

SVM的算法原理

支持向量机推导过程

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

SVM 核函数

​ 核函数将原始输入空间映射到新的特征空间,从而,使原本线性不可分的样本可能在核空间可分。

在这里插入图片描述

核函数分类

在这里插入图片描述

  • 线性核:一般是不增加数据维度,而是预先计算内积,提高速度
  • 多项式核:一般是通过增加多项式特征,提升数据维度,并计算内积
  • 高斯核(RBF、径向基函数):产生将样本投射到无限维空间的运算效果,使得原来不可分的数据变得可分。使用最多
  • 其他了解即可
高斯核

高斯核 Radial Basis Function Kernel (径向基函数,又称RBF核)

在这里插入图片描述

结论:gamma越大,高斯分布越窄,gamma越小,高斯分布越宽

  • 举例

在这里插入图片描述

高斯核API
from sklearn.svm import SVC
SVC(lernel='rbf',gamma=gamma)
高斯核对模型的影响:

在这里插入图片描述

gamma参数

在这里插入图片描述

代码实现
"""
## RBF参数测试
# 1.导入依赖包
# 2.获取数据
# 3.构建函数
# 4.实验测试【0.5,1.0,100,0.1】,模型训练
"""

# 1.导入依赖包
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from plot_util import plot_decision_boundary

# 2.获取数据
x, y = make_moons(noise=0.15)
plt.scatter(x[y == 0, 0], x[y == 0, 1])
plt.scatter(x[y == 1, 0], x[y == 1, 1])
plt.show()

# 3.构建函数
def RBFsvm(gamma=0.1):
    return Pipeline(
        [
            ('std_scalar', StandardScaler()),
            ('svc', SVC(kernel='rbf', gamma=gamma))
        ]
    )


## 4.实验测试【0.5,1.0,100,0.1】,模型训练
# svc1 = RBFsvm(0.5)
# x_std=svc1['std_scalar'].fit_transform(x)
# svc1.fit(x_std,y)
# plot_decision_boundary(svc1,axis=[-3,3,-3,3])
# plt.scatter(x_std[y==0,0],x_std[y==0,1])
# plt.scatter(x_std[y==1,0],x_std[y==1,1])
# plt.show()

svc1 = RBFsvm(1.0)
svc1.fit(x, y)
plot_decision_boundary(svc1, axis=[-1.5, 2.5, -1, 1.5])
plt.scatter(x[y == 0, 0], x[y == 0, 1])
plt.scatter(x[y == 1, 0], x[y == 1, 1])
plt.show()

svc2 = RBFsvm(100)
svc2.fit(x, y)
plot_decision_boundary(svc2, axis=[-1.5, 2.5, -1, 1.5])
plt.scatter(x[y == 0, 0], x[y == 0, 1])
plt.scatter(x[y == 1, 0], x[y == 1, 1])
plt.show()

svc3 = RBFsvm(0.1)
svc3.fit(x, y)
plot_decision_boundary(svc3, axis=[-1.5, 2.5, -1, 1.5])
plt.scatter(x[y == 0, 0], x[y == 0, 1])
plt.scatter(x[y == 1, 0], x[y == 1, 1])
plt.show()

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

标签:plot,plt,高斯,tran,SVM,import,scatter,向量,sklearn
From: https://blog.csdn.net/weixin_57336987/article/details/143133779

相关文章

  • 高斯混合概率假设密度滤波器(GM-PHD)研究(Matlab代码实现)
     ......
  • 线性可分支持向量机的原理推导【补充知识部分】9-10最大化函数max α,β L(x,α,β)关
    本文是将文章《线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析,便于初学者更好的理解。在主文章中,有一个部分是关于补充拉格朗日对偶性的相关知识,此公式即为这部分里的内容。公式9-10是基于公式9-9的进一步引申,它通过引入拉格朗日乘子,将约束优化问......
  • 基于支持向量机和降维PCA的人脸识别实战
    公众号:尤而小屋编辑:Peter作者:Peter大家好,我是Peter~今天给大家介绍一个基于支持向量机SVM和PCA降维的人脸识别的实战案例,主要包含:人脸数据lfw数据集下载PCA降维基于SVM的分类模型构建模型分类预测结果可视化效果如下图:基于SVM和PCA算法的人脸识别使用数据为fetch_l......
  • 图片与向量的关系
    黑白图片黑白图片(灰度图)通过2维向量(矩阵)来表达。2个维度的长度分别代表了图片的高度和宽度(以像素为单位),向量元素记录着每一个像素的灰度(数值越大,颜色越浅)例如下面右图矩阵标注了左图像素点的灰度分布:彩色图片彩色图片通过3维向量来表达。3个维度的长度分别代表了......
  • 线性代数--向量
    向量n个数a1a2......an组成的有序数组(a1a2......an)a1..又称为分量维数行向量列向量只是形式不同零向量分量全是0负向量相反数两个向量相等同维向量向量相加减k是数另一个是向量向量间的线性关系线性关系:用某些向量能表示一个向量线性组合:β,α1,......
  • 用大模型或者向量模型比如huggingface上的模型,处理一批图片,对该图片进行分类,检索
    要使用大模型或向量模型对图片进行分类和检索,通常可以采用以下几种方法:1.**图像分类**:使用预训练的图像分类模型(如ResNet、EfficientNet等)对图片进行分类。2.**图像特征提取**:使用预训练的模型(如CLIP、ResNet等)提取图像的特征向量,然后进行相似度检索。以下是使用HuggingF......
  • 【人工智能-初级】第5章 支持向量机(SVM):原理解析与代码实现
    文章目录一、支持向量机简介二、支持向量机的数学原理2.1线性可分支持向量机2.2软间隔与非线性支持向量机2.3核函数三、SVM的优缺点3.1优点3.2缺点四、Python实现支持向量机4.1导入必要的库4.2生成数据集并进行预处理4.3创建SVM分类器并进行训练4.4模型预测与......
  • 支持向量机SVM原理详解
    SVM原理详解1、超平面2、SVM原理1.问题定义2.分类决策得到约束条件3.最大化间隔4.优化目标3、凸优化问题1.原始优化问题优化目标约束条件2.拉格朗日乘子法3.拉格朗日函数分析4.求解对w......
  • 计量经济学(九)——向量自回归VAR模型检验
    向量自回归(VAR,VectorAutoregression)模型是一种广泛用于时间序列分析的统计工具,特别是在经济学和金融学领域中。VAR模型的关键优势在于其可以捕捉多个变量之间的相互依赖关系,而无需预设变量之间的因果顺序。这使得VAR模型在处理复杂动态系统时极具灵活性。VAR模型的基本结构是将......
  • 机器学习篇-day09-支持向量机SVM
    一.支持向量机介绍支持向量机介绍SVM全称是SupportedVectorMachine(支持向量机)即寻找到一个超平面使样本分成两类,并且间隔最大。是一种监督学习算法,主要用于分类,也可用于回归与逻辑回归和决策树等其他分类器相比,SVM提供了非常高的准确度优缺点优点:适合小样本、高......