Python28-2 机器学习算法之SVM(支持向量机)

news2024/11/26 12:23:27

SVM(支持向量机)

支持向量机(Support Vector Machine,SVM)是一种用于分类和回归分析的监督学习模型,在机器学习领域中被广泛应用。SVM的目标是找到一个最佳的分割超平面,将不同类别的数据分开,使得两个类别之间的间隔(即边界)最大化。下面是对SVM的详细解释:

SVM的基本概念
  1. 超平面(Hyperplane)

    • 在二维空间中,超平面是将平面分为两部分的直线

    • 在三维空间中,超平面是将空间分为两部分的平面

    • 在更高维度的空间中,超平面是将该空间分为两部分的一个n-1维的子空间

  2. 支持向量(Support Vectors)

    • 支持向量是离分割超平面最近的那些数据点

    • 这些点是最重要的,因为它们定义了超平面的位置和方向

    • 移动这些点将会改变超平面的位置

  3. 间隔(Margin)

    • 间隔是指支持向量与超平面之间的距离

    • SVM的目标是最大化这个间隔,以提高分类器的鲁棒性和泛化能力

SVM的核函数(Kernel Function)

SVM可以通过使用核函数将输入数据映射到高维空间,在高维空间中,原本非线性可分的数据可以变成线性可分的。常见的核函数包括:

  1. 线性核(Linear Kernel):适用于线性可分的数据。

  2. 多项式核(Polynomial Kernel):用于非线性数据。

  3. 径向基函数核(RBF Kernel):也称高斯核,常用于非线性数据。

  4. Sigmoid核(Sigmoid Kernel):模拟神经网络的激活函数。

SVM算法工作原理
  1. 训练阶段

    • 给定训练数据集,SVM通过求解一个优化问题,找到最大化间隔的分割超平面。

    • 该优化问题通常是一个凸二次规划问题,可以通过各种优化算法求解。

  2. 分类阶段

    • 对于新的数据点,SVM根据其与分割超平面的相对位置进行分类。

    • 数据点落在超平面一侧的属于一个类别,落在另一侧的属于另一个类别。

SVM的数学描述

假设我们有一个训练数据集 ( (x_1, y_1), (x_2, y_2), ···, (x_n, y_n) ),其中 ( x_i ) 是特征向量,( y_i ) 是对应的类别标签,取值为 ( {+1, -1} )。

SVM的优化目标是:

其中,( w ) 是超平面的法向量,( b ) 是偏置项。

SVM的优缺点

优点

  • 能够有效处理高维空间的数据。

  • 在样本数量远大于特征数量的情况下仍然有效。

  • 具有较好的泛化能力,能够防止过拟合。

缺点

  • 对于大规模数据集,训练时间较长。

  • 对于含有噪声的数据表现较差,尤其是在类别重叠的情况下。

  • SVM的参数选择和核函数的选择需要经验和实验。

示例代码1

使用Python的scikit-learn库实现SVM分类器进行二维点的分类。

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import classification_report, accuracy_score
import matplotlib.pyplot as plt

# 加载Iris数据集
iris = datasets.load_iris()
X = iris.data[:, :2]  # 仅使用前两个特征进行可视化
y = iris.target

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 创建和训练SVM分类器
clf = SVC(kernel='linear', C=1.0)
clf.fit(X_train, y_train)

# 预测测试集
y_pred = clf.predict(X_test)

# 计算准确率和分类报告
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
print(classification_report(y_test, y_pred))

# 可视化决策边界
def plot_decision_boundary(clf, X, y):
    h = .02  # 网格步长
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o')
    plt.xlabel('Sepal length')
    plt.ylabel('Sepal width')
    plt.title('SVM Decision Boundary')
    plt.show()

plot_decision_boundary(clf, X_test, y_test)

结果可视化:

图片

上图中有部分点被错误的分类了,分类错误可能由以下原因引起:数据中存在噪声和异常值、数据本身在当前维度下不可分、训练数据量不足或特征选择不当、模型参数设置不合理、类别不平衡问题、以及模型过拟合或欠拟合。这些因素都会影响模型的准确性和泛化能力,导致在某些数据点上出现分类错误。

示例代码2

使用SVM进行三维数据分割。

import numpy as np
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 在Jupyter Notebook中启用交互模式
%matplotlib notebook

# 生成合成数据集
np.random.seed(42)
X, y = datasets.make_classification(
    n_samples=100, n_features=3, n_informative=3, n_redundant=0, n_clusters_per_class=1
)

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 创建和训练SVM分类器
clf = SVC(kernel='linear', C=1.0)
clf.fit(X_train, y_train)

# 预测测试集
y_pred = clf.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')

# 可视化决策边界
def plot_decision_boundary_3d(clf, X, y):
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')

    # 设置网格范围
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    z_min, z_max = X[:, 2].min() - 1, X[:, 2].max() + 1
    xx, yy = np.meshgrid(
        np.arange(x_min, x_max, 0.1),
        np.arange(y_min, y_max, 0.1)
    )

    # 计算平面上的决策函数值
    zz = (-clf.intercept_[0] - clf.coef_[0][0] * xx - clf.coef_[0][1] * yy) / clf.coef_[0][2]

    # 绘制决策平面
    ax.plot_surface(xx, yy, zz, alpha=0.3, color='r', edgecolor='none')

    # 绘制数据点
    scatter = ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap=plt.cm.viridis, edgecolors='k')
    legend1 = ax.legend(*scatter.legend_elements(), title="Classes")
    ax.add_artist(legend1)

    ax.set_xlabel('Feature 1')
    ax.set_ylabel('Feature 2')
    ax.set_zlabel('Feature 3')
    ax.set_title('SVM Decision Boundary in 3D')

    # 允许图形旋转
    ax.view_init(elev=30, azim=30)
    plt.show()

plot_decision_boundary_3d(clf, X_test, y_test)

结果可视化:

图片

从上面的结果可以看出SVM正确分割了两类空间中的点。以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

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

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

相关文章

【详细】CNN中的卷积计算是什么-实例讲解

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、 CNN的基础卷积计算1.1.一个例子了解CNN的卷积计算是什么1.2.卷积层的生物意义 二、卷积的拓展:多输入通道与多输出通道2.1.多输入通道卷积2.2.多输出通道卷积 三、卷积的实现3.1.pytorch实现卷积…

夏令营1期-对话分角色要素提取挑战赛-第①次打卡

零基础入门大模型技术竞赛 简介: 本次学习是 Datawhale 2024 年 AI 夏令营第一期,学习活动基于讯飞开放平台“基于星火大模型的群聊对话分角色要素提取挑战赛”开展实践学习。 适合想 入门并实践大模型 API 开发、了解如何微调大模型的学习者参与 快来…

Windows系统开启自带虚拟机功能Hyper-V

前言 最近有小伙伴咨询:Windows系统上有自带的虚拟机软件吗? 答案肯定是有的。它就是Hyper-V,但很多小伙伴都不知道怎么打开这个功能。 今天小白就带大家来看看如何正确打开这个Windows自带的虚拟机功能Hyper-V。 开始之前,你…

基于STM32的智能花园灌溉系统

目录 引言环境准备智能花园灌溉系统基础代码实现:实现智能花园灌溉系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景:花园灌溉管理与优化问题解决方案与优化收尾与总结 1. 引言 智能花园灌溉系统通过使用ST…

PacBio or Nanopore:测序技术简单对比

前言 在基因组学和生命科学领域,追求知识的旅程不断演变,由揭示DNA和RNA奥秘的技术创新推动。我们熟知的两大测序技术——PacBio和Nanopore,正位于这一领域的前沿。这些由 Pacific Biosciences 和 Oxford Nanopore Technologies 分别开发的先…

【验收支撑】项目验收计划书(Word原件)

软件验收相关的文档通常包括以下,这些文档在软件项目的不同阶段和验收过程中起着关键作用: 1、概要设计说明书: 描述了软件系统的整体架构、主要模块及其相互关系。 2、详细设计说明书: 提供了软件系统中各个模块的详细设计信息&a…

Python | Leetcode Python题解之第204题计数质数

题目: 题解: MX5000000 is_prime [1] * MX is_prime[0]is_prime[1]0 for i in range(2, MX):if is_prime[i]:for j in range(i * i, MX, i):#循环每次增加iis_prime[j] 0 class Solution:def countPrimes(self, n: int) -> int:return sum(is_prim…

基于PI控制的三相整流器控制系统的simulink建模与仿真,包含超级电容充电和电机

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于PI控制的三相整流器控制系统的simulink建模与仿真,用MATLAB自带的PMSM电机设为发电机,输入为转速,后面接一个可以调节电流的三相整流器&#xff0c…

双指针法——快慢指针

前言 Hello,CSDN的小伙伴们,今天我来给大家分享关于双指针方法之一的快慢指针问题 ,希望你们看了这一篇博客,对快慢指针会有更深刻的理解。 移除元素 题目如下: 移除元素 思路一:创建新的数组&#xff…

expandtabs()方法——tab符号转为空格

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 expandtabs()方法把字符串中的tab(\t)符号转为空格,tab(\t)符号默认的空格数是…

Android Lint

文章目录 Android Lint概述工作流程Lint 问题问题种类警告严重性检查规则 用命令运行 LintAndroidStudio 使用 Lint忽略 Lint 警告gradle 配置 Lint查找无用资源文件 Android Lint 概述 Lint 是 Android 提供的 代码扫描分析工具,它可以帮助我们发现代码结构/质量…

解决403 Forbidden错误的全面指南,快速解决403 Forbidden错误

在浏览互联网时,遭遇到“403 Forbidden”错误可以说是既常见又令人困惑。这个错误提示通常意味着服务器理解请求但拒绝授权访问。尽管它可能看起来让人无从下手,但通过一些方法通常可以找到原因并解决这个问题。 什么是403 Forbidden错误? “…

使用AI工具 Baidu Comate 辅助编码 快速定位修改Bug

一、Baidu Comate 概述 Baidu Comate(百度智能编码助手)是一款基于文心大模型的新一代编码辅助工具。它结合了百度多年积累的编程现场大数据和外部优秀开源数据,旨在为用户提供高质量的编程代码生成和优化服务。Comate的主要目标是提升编码效…

【PL理论深化】(8) Ocaml 语言:元组和列表 | 访问元组中的元素 | 列表中的 head 和 tail | 基本列表操作符

💬 写在前面:本章我们将探讨 OCaml 中的元组(tuple)和列表(list),它们是函数式编程语言中最常用的数据结构。 目录 0x00 元组(Tuple) 0x01 访问元组中的元素 0x02 列表&…

LabVIEW项目外协时选择公司与个人兼职的比较

​在选择LabVIEW项目外协合作伙伴时,外协公司和个人兼职各有优劣。个人兼职成本较低且灵活,但在可靠性、技术覆盖面、资源和风险管理上存在不足。而外协公司拥有专业团队、丰富资源、完善的项目管理和风险控制,尽管成本较高,但能提…

上海六十中学多功能气膜馆项目:轻空间全速推进

项目进展捷报频传 上海六十中学多功能气膜馆项目土建工作已基本完工,今天轻空间团队正式进场,展开气膜部分的施工。我们将为上海六十中学打造一个现代化、环保、高效的多功能气膜馆,提供优质的运动和活动场所。 现场施工一片繁忙 在施工现场&…

C++ | Leetcode C++题解之第204题计数质数

题目&#xff1a; 题解&#xff1a; class Solution { public:int countPrimes(int n) {vector<int> primes;vector<int> isPrime(n, 1);for (int i 2; i < n; i) {if (isPrime[i]) {primes.push_back(i);}for (int j 0; j < primes.size() && i …

【方案+源码】srm供应商招投标管理系统建设方案及源码实现

SRM供应商管理系统功能建设涵盖&#xff1a; 供应商管理&#xff1a;整合供应商信息&#xff0c;实现全生命周期管理。 采购需求管理&#xff1a;精准把握采购需求&#xff0c;优化采购计划。 采购寻源管理&#xff1a;智能寻源&#xff0c;匹配最佳供应商。 采购合同管理&…

【入门】5分钟了解卷积神经网络CNN是什么

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、卷积神经网络的结构1.1.卷积与池化的作用2.2.全连接层的作用 二、卷积神经网络的运算2.1.卷积层的运算2.2.池化的运算2.3.全连接层运算 三、pytorch实现一个CNN例子3.1.模型的搭建3.2.CNN完整训练代码 CNN神…

Golang | Leetcode Golang题解之第203题移除链表元素

题目&#xff1a; 题解&#xff1a; func removeElements(head *ListNode, val int) *ListNode {dummyHead : &ListNode{Next: head}for tmp : dummyHead; tmp.Next ! nil; {if tmp.Next.Val val {tmp.Next tmp.Next.Next} else {tmp tmp.Next}}return dummyHead.Next …