首页 > 其他分享 >机器学习篇-day09-支持向量机SVM

机器学习篇-day09-支持向量机SVM

时间:2024-10-17 14:22:30浏览次数:9  
标签:day09 plt sub label SVM import data 向量 axis

一. 支持向量机介绍

支持向量机

介绍

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

即寻找到一个超平面使样本分成两类,并且间隔最大。

是一种监督学习算法,主要用于分类,也可用于回归

与逻辑回归和决策树等其他分类器相比,SVM 提供了非常高的准确度

优缺点

优点:

适合小样本、高纬度数据,比较强泛化能力

可有效地处理高维数据;可使用不同的核函数来适应不同的数据类型

缺点:

计算复杂度较高,对于大规模数据的处理可能会存在困难

超平面最大间隔

名词解释

硬间隔

如果样本线性可分,在所有样本分类都正确的情况下,寻找最大间隔,这就是硬间隔

如果出现异常值、或者样本不能线性可分,此时硬间隔无法实现。

软间隔

允许部分样本,在最大间隔之内,甚至在错误的一边,寻找最大间隔,这就是软间隔

目标是尽可能在保持间隔宽阔和限制间隔违例之间找到良好的平衡。

通过惩罚系数C来控制这个平衡:C值越小,则间隔越宽,但是间隔违例也会越多

核函数

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

总结

1、下列关于SVM的描述错误的是?(单选题)

A)它的全称为支撑向量机(SupportedVector Machine)

B)它的主要任务是找到一个超平面将不同的样本划分开来

C)硬间隔和软间隔都是SVM分割超平面中的一种

D)SVM模型可以通过调小C参数的取值,来减少间隔违例

答案解析: C值越小,间隔违例越多

答案:D

二. 支持向量机API的使用

API

初步代码演示

plot_util工具

import numpy as np
import matplotlib.pyplot as plt
​
​
def plot_decision_boundary(model, axis):
    x0, x1 = np.meshgrid(
        np.linspace(axis[0], axis[1], int((axis[1] - axis[0]) * 100)).reshape(-1, 1),
        np.linspace(axis[2], axis[3], int((axis[3] - axis[2]) * 100)).reshape(-1, 1)
    )
    X_new = np.c_[x0.ravel(), x1.ravel()]
    y_predict = model.predict(X_new)
    zz = y_predict.reshape(x0.shape)
​
    from matplotlib.colors import ListedColormap
    custom_map = ListedColormap(["#EF9A9A", "#FFF59D", "#90CAF9"])
​
    # plt.contourf(x0,x1,zz,linewidth=5,cmap=custom_map)
    plt.contourf(x0, x1, zz, cmap=custom_map)
​
​
def plot_decision_boundary_svc(model, axis):
    x0, x1 = np.meshgrid(
        np.linspace(axis[0], axis[1], int((axis[1] - axis[0]) * 100)).reshape(-1, 1),
        np.linspace(axis[2], axis[3], int((axis[3] - axis[2]) * 100)).reshape(-1, 1)
    )
    X_new = np.c_[x0.ravel(), x1.ravel()]
    y_predict = model.predict(X_new)
    zz = y_predict.reshape(x0.shape)
​
    from matplotlib.colors import ListedColormap
    custom_map = ListedColormap(["#EF9A9A", "#FFF59D", "#90CAF9"])
​
    # plt.contourf(x0,x1,zz,linewidth=5,cmap=custom_map)
    plt.contourf(x0, x1, zz, cmap=custom_map)
​
    w = model.coef_[0]
    b = model.intercept_[0]
    # w0* x0 + w1* x1+ b = 0
    # =>x1 = -w0/w1 * x0 - b/w1
    plot_x = np.linspace(axis[0], axis[1], 200)
    up_y = -w[0] / w[1] * plot_x - b / w[1] + 1 / w[1]
    down_y = -w[0] / w[1] * plot_x - b / w[1] - 1 / w[1]
    up_index = (up_y >= axis[2]) & (up_y <= axis[3])
    down_index = (down_y >= axis[2]) & (down_y <= axis[3])
    plt.plot(plot_x[up_index], up_y[up_index], color="black")
    plt.plot(plot_x[down_index], down_y[down_index], color="black")

代码

import matplotlib.pyplot as plt
from plot_util import plot_decision_boundary
​
from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
​
​
def demo01_svm():
    # 获取数据
    data, label = load_iris(return_X_y=True)
    # print(data.shape)
    # print(label.shape)
    # print(pd.DataFrame(
    #     data,
    #     columns=[
    #         '花萼长度',
    #         '花萼宽度',
    #         '花瓣长度',
    #         '花瓣宽度']
    # ).head())
​
    # 数据基本处理
    # 特征和标签
    data_sub = data[label < 2, :2]
    label_sub = label[label < 2]
    print(data_sub.shape)
    print(label_sub.shape)
​
    # 数据可视化
    # plt.figure(figsize=(10, 5), dpi=100)
    # plt.scatter(data_sub[label_sub == 0, 0], data_sub[label_sub == 0, 1], c='r')
    # plt.scatter(data_sub[label_sub == 1, 0], data_sub[label_sub == 1, 1], c='c')
    # plt.show()
​
    # 特征工程
    transfer = StandardScaler()
    data_sub = transfer.fit_transform(data_sub)
​
    # 模型训练
    model = LinearSVC(C=100)
    model.fit(data_sub, label_sub)
    y_pred = model.predict(data_sub)
    print(y_pred)
​
    # 绘制模型的边界
    plot_decision_boundary(model, axis=[-3, 3, -3, 3])
    plt.scatter(data_sub[label_sub == 0, 0], data_sub[label_sub == 0, 1], c='r')
    plt.scatter(data_sub[label_sub == 1, 0], data_sub[label_sub == 1, 1], c='b')
    plt.show()
​
​
if __name__ == '__main__':
    demo01_svm()

结果图

惩罚参数的影响

代码

import matplotlib.pyplot as plt
from plot_util import plot_decision_boundary
​
from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
​
​
def demo01_svm():
    # 获取数据
    data, label = load_iris(return_X_y=True)
    # print(data.shape)
    # print(label.shape)
​
    # 数据基本处理
    # 特征和标签
    data_sub = data[label < 2, :2]
    label_sub = label[label < 2]
    print(data_sub.shape)
    print(label_sub.shape)
​
    # 数据可视化
    # plt.figure(figsize=(10, 5), dpi=100)
    # plt.scatter(data_sub[label_sub == 0, 0], data_sub[label_sub == 0, 1], c='r')
    # plt.scatter(data_sub[label_sub == 1, 0], data_sub[label_sub == 1, 1], c='c')
    # plt.show()
​
    # 特征工程
    transfer = StandardScaler()
    data_sub = transfer.fit_transform(data_sub)
​
    # C=100
    # 模型训练
    model1 = LinearSVC(C=100, dual='auto')
    model1.fit(data_sub, label_sub)
    y_pred = model1.predict(data_sub)
    print(y_pred)
​
    # 绘制模型的边界
    plot_decision_boundary(model1, axis=[-3, 3, -3, 3])
    plt.scatter(data_sub[label_sub == 0, 0], data_sub[label_sub == 0, 1], c='r')
    plt.scatter(data_sub[label_sub == 1, 0], data_sub[label_sub == 1, 1], c='b')
    plt.show()
​
    # C=0.1
    # 模型训练
    model2 = LinearSVC(C=0.1, dual='auto')
    model2.fit(data_sub, label_sub)
    y_pred = model2.predict(data_sub)
    print(y_pred)
​
    # 绘制模型的边界
    plot_decision_boundary(model2, axis=[-3, 3, -3, 3])
    plt.scatter(data_sub[label_sub == 0, 0], data_sub[label_sub == 0, 1], c='r')
    plt.scatter(data_sub[label_sub == 1, 0], data_sub[label_sub == 1, 1], c='b')
    plt.show()
​
​
if __name__ == '__main__':
    demo01_svm()

结果图

三. SVM算法原理

SVM思想:要去求一组参数(w,b),使其构建的超平面函数能够最优地分离两个集合。

求解w和b最小

求解最终超平面

四. 核函数

核函数的作用

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

核函数分类

线性核:一般是不增加数据维度,而是预先计算内积,提高速度

多项式核:一般是通过增加多项式特征,提升数据维度,并计算内积

高斯核(RBF、径向基函数):产生将样本投射到无限维空间的运算效果,使得原来不可分的数据变得可分。使用最多其他了解即可

高斯核函数基本原理

高斯核函数API

gama值越大越容易过拟合, gama值与拟合成正比

模型API

解释gama函数

代码演示

# 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.title("gamma=1.0")
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.title("gamma=100")
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.title("gamma=0.1")
plt.show()

结果图

原数据

模型训练后

总结

标签:day09,plt,sub,label,SVM,import,data,向量,axis
From: https://blog.csdn.net/m0_60916732/article/details/143006521

相关文章

  • 机器学习面试笔试知识点-线性回归、逻辑回归(Logistics Regression)和支持向量机(SVM)
    机器学习面试笔试知识点-线性回归、逻辑回归LogisticsRegression和支持向量机SVM一、线性回归1.线性回归的假设函数2.线性回归的损失函数(LossFunction)两者区别3.简述岭回归与Lasso回归以及使用场景4.什么场景下用L1、L2正则化5.什么是ElasticNet回归6.ElasticNet回归......
  • Java 初学 day09
    java091、形式参数基本类型:当基本数据类型作为参数传递的时候,传递是具体的数值引用类型:数组:当数组作为方法的参数类型的时候,将来需要传递数组的地址值具体的类:当你看到一个类作为方法的参数类型的时候,将来调用需要传入该类或该类的子类的对象抽象类:当你看到......
  • 基于网格搜索优化最小二乘向量机(GS-LSSVM)的数据多变量回归预测 Matlab代码(多输入单
    基于网格搜索优化最小二乘向量机(GS-LSSVM)的数据多变量回归预测Matlab代码(多输入单输出)程序已经调试好,无需更改代码替换数据集即可运行!!!数据格式为excel!网格搜索GS优化参数为:sigma、gamma1.购买前GS可以更换为其他的优化算法!需要其他算法的都可以定制!注:1️⃣、运行环境要......
  • [如何实现多向量索引策略提升检索精度:从理论到实战]
    如何实现多向量索引策略提升检索精度:从理论到实战引言在信息检索领域,检索精度往往是衡量系统性能的重要指标之一。多向量索引策略(Multi-VectorIndexingStrategy)是提高检索精度的有效方法之一。本文将详细介绍这种策略的实现方法,并通过具体的代码示例帮助读者在实际项目......
  • 手写持向量机(SVM)实现
    下面是一个简单的支持向量机(SVM)实现,用于解决线性可分问题。这个实现不使用任何机器学习库,只使用NumPy进行矩阵运算。请注意,这个实现主要用于教学目的,实际应用中推荐使用成熟的库,如scikit-learn。importnumpyasnpclassSVM:def__init__(self,learning_rate=0.001,l......
  • 支持向量机 --优化
    支持向量机1.支持向量SVM最优化问题SVM想要的就是找到各类样本点到超平面的距离最远,也就是找到最大间隔超平面。任意超平面可以用下面这个[线性方程]来描述:\[\omega^Tx+b=0\]二维空间点$(x,y)$到直线$Ax+By+C=0$​的距离公式是:\[\frac{|Ax+By+C|}{\sqrt{A^2+B^2}......
  • LLM中词向量的表示和词嵌入的一些疑问
    LLM中词向量的表示和词嵌入的一些疑问词向量的一些特点在3blue1brown的视频【官方双语】GPT是什么?直观解释Transformer|深度学习第5章_哔哩哔哩_bilibili中,在15min左右介绍了LLM的词嵌入的过程.其中提到mother的词向量减去father的词向量,会近似于women的词向量-man的词向......
  • 大模型agent开发之文本向量化
    文本向量化实现方式 在复杂的大模型中文本向量化有很多好处,比如提高检索速度,在大规模数据集上向量通过相似表示可以快速找到相似文本,在处理长文本和跨语言对齐等任务上也可以减少很多开销。在langchain中可以从包langchain.embeddings.openai中可以引入方法OpenAIEmbeddings定义......
  • 更强的RAG:向量数据库和知识图谱的结合
    传统RAG的局限性经典的RAG架构以向量数据库(VectorDB)为核心来检索语义相似性上下文,让大语言模型(LLM)不需要重新训练就能够获取最新的知识,其工作流如下图所示:这一架构目前广泛应用于各类AI业务场景中,例如问答机器人、智能客服、私域知识库检索等等。虽然RAG通过知识增强一......
  • 支持向量机
    一、SVM基本原理SVM(SupportVectorMachine)SVM是机器学习中常用的分类算法。SVM算法可以将......