【机器学习】有监督学习算法之:支持向量机

支持向量机

  • 1、引言
  • 2、决策树
    • [2.1 定义](#2.1 定义)
    • [2.2 原理](#2.2 原理)
    • [2.3 实现方式](#2.3 实现方式)
    • [2.4 算法公式](#2.4 算法公式)
    • [2.5 代码示例](#2.5 代码示例)
  • 3、总结

1、引言

小屌丝 :鱼哥,泡澡啊。
小鱼 :不去
小屌丝 :... 此话当真?
小鱼 :此话不假
小屌丝 :到底去还是不去?
小鱼 :我昨天刚泡完澡,今天还去?
小屌丝 :... 你竟然自己去?
小鱼 :没有啊

小屌丝 :... 我不信,我不听,反正你昨天去泡澡没带我。
小鱼 :...那待会咱俩再去呗
小屌丝 : 这还差不多。嘿嘿~ ~
小鱼 :那等我一会
小屌丝 :干啥啊这又?
小鱼 :当然是在忙喽。
小屌丝:...

2、决策树

2.1 定义

支持向量机(Support Vector Machine,简称SVM)是一种分类算法,它试图找到一个超平面来分隔两个类别的数据点,使得两侧的间隔(margin)最大。

当数据点在高维空间中不是线性可分时,SVM通过使用核函数(kernel function)将原始数据映射到更高维的特征空间,使得数据在新的空间中线性可分。

2.2 原理

SVM的基本原理涉及到高维空间中的数据点和一个决策边界(也称为超平面)。它的目标是找到一个超平面,使得不同类别的数据点距离它最远,这个距离称为"间隔"。

工作原理如下:

  • 数据转换:首先,SVM将数据点映射到高维空间,这样它们可以更容易地被一个超平面分开。

  • 超平面选择:然后,SVM尝试找到一个超平面,使得不同类别的支持向量离它最远。这个超平面的方程可以表示为:,其中是超平面的法向量,是偏置。

  • 间隔最大化:SVM的目标是最大化支持向量到超平面的距离,这个距离称为"间隔"。间隔的计算公式是:。

  • 分类:最后,SVM使用这个超平面来进行分类。对于新的数据点,它会根据这个超平面的位置来决定它属于哪个类别。

2.3 实现方式

SVM的实现方式主要包括:

  • 线性可分SVM:当数据集线性可分时,可以直接使用线性SVM进行分类。

  • 线性SVM(软间隔):当数据集近似线性可分时,引入松弛变量和惩罚参数,允许部分样本被错分。

  • 非线性SVM:当数据集非线性可分时,使用核函数将原始数据映射到更高维的特征空间,然后在新的空间中寻找最优超平面。

2.4 算法公式

SVM的公式可能看起来有点吓人,但我们可以用简单的例子来解释它们。

  • 数据点的映射

    • 假设我们在二维空间中有数据点 ((x_1, y_1), (x_2, y_2), \ldots, (x_n, y_n))。
    • 我们可以将它们映射到三维空间,通过增加一个额外的维度 (z),得到新的数据点 ((x_1, y_1, z_1), (x_2, y_2, z_2), \ldots, (x_n, y_n, z_n))。
    • 这个映射可以通过一个函数 (f) 来实现,例如 (z = f(x, y))。
  • 超平面选择

    • 在三维空间中,我们的超平面方程可以表示为:[ w_1x + w_2y + w_3z + b = 0 ]。这里的(w_1, w_2, w_3) 是超平面的法向量的分量,(b) 是偏置项。这个超平面将数据点分隔成两个类别。
  • 间隔最大化

    • 在SVM中,间隔是指数据点到超平面的最短距离。对于任意数据点 ((x, y, z)) 和超平面 (w_1x + w_2y + w_3z + b = 0),其到超平面的距离 (d) 可以计算为:

      [ d = \frac{|w_1x + w_2y + w_3z + b|}{\sqrt{w_1^2 + w_2^2 + w_3^2}} ]

    • 间隔最大化就是要找到这样的超平面,使得所有数据点到这个超平面的距离中的最小值最大。

  • 分类

    • 对于新的数据点 ((x_{\text{new}}, y_{\text{new}}, z_{\text{new}})),我们可以将其映射到三维空间,然后计算它到超平面的距离 (d_{\text{new}})。
    • 根据 (d_{\text{new}}) 的正负以及超平面的位置(由法向量的方向决定),我们可以判断这个数据点属于哪一个类别。

2.5 代码示例

python 复制代码
# -*- coding:utf-8 -*-
# @Time   : 2024-02-21
# @Author : Carl_DJ

'''
实现功能:
    用于生成线性可分的数据集并可视化SVM的分界线

'''
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.svm import SVC

# 生成线性可分的数据集
X, y = datasets.make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=42)

# 创建SVM分类器并拟合数据
clf = SVC(kernel='linear', C=1000)
clf.fit(X, y)

# 绘制数据点
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, marker='o', edgecolors='k')

# 绘制决策边界
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()

# 创建网格来评估模型
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 50), np.linspace(ylim[0], ylim[1], 50))
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

# 绘制决策边界
ax.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('SVM Decision Boundary')
plt.show()

3、总结

支持向量机是一种强大的分类算法,它通过寻找最优超平面来实现分类,并且具有优秀的泛化能力。

SVM对于高维数据的处理效果尤为出色,并且可以通过核函数来处理非线性问题。

然而,SVM的计算复杂度相对较高,尤其是当样本数量很大时,训练过程可能会比较慢。

在实际应用中,需要根据具体问题和数据集特点来选择合适的算法和参数。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 多个名企认证讲师等
  • 认证金牌面试官
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注小鱼 ,学习机器学习领域的知识。

相关推荐
1 9 J5 分钟前
Java 上机实践4(类与对象)
java·开发语言·算法
passer__jw7672 小时前
【LeetCode】【算法】3. 无重复字符的最长子串
算法·leetcode
passer__jw7672 小时前
【LeetCode】【算法】21. 合并两个有序链表
算法·leetcode·链表
sweetheart7-72 小时前
LeetCode22. 括号生成(2024冬季每日一题 2)
算法·深度优先·力扣·dfs·左右括号匹配
封步宇AIGC4 小时前
量化交易系统开发-实时行情自动化交易-3.4.2.Okex行情交易数据
人工智能·python·机器学习·数据挖掘
封步宇AIGC4 小时前
量化交易系统开发-实时行情自动化交易-2.技术栈
人工智能·python·机器学习·数据挖掘
景鹤4 小时前
【算法】递归+回溯+剪枝:78.子集
算法·机器学习·剪枝
_OLi_5 小时前
力扣 LeetCode 704. 二分查找(Day1:数组)
算法·leetcode·职场和发展
丶Darling.5 小时前
Day40 | 动态规划 :完全背包应用 组合总和IV(类比爬楼梯)
c++·算法·动态规划·记忆化搜索·回溯
风影小子5 小时前
IO作业5
算法