Py学习  »  机器学习算法

【机器学习】通透!十大支持向量机最强总结!!

机器学习初学者 • 3 月前 • 80 次点击  

今天把最近同学们呼声最高的支持向量机进行了全面的总结,作为基础类模型,建议大家有空可以看看~

简单来说,支持向量机(SVM)是有监督学习算法,可用于分类和回归任务。它通过在特征空间中找到最佳的分隔超平面,实现高效的数据分类。SVM在处理高维数据、处理非线性问题以及具有较少训练样本时表现突出,因此在机器学习和模式识别中具有重要的地位。

今天内容比较多,建议大家可以先在文末收藏起来,遇到重要的地方可以划线,后面慢慢学习~

今天涉及到的支持向量机算法有~

  • 线性支持向量机

  • 非线性支持向量机

  • 多类别支持向量机

  • 软间隔支持向量机

  • 核函数支持向量机

  • 径向基函数支持向量机

  • 多核支持向量机

  • 自适应支持向量机

  • 稀疏支持向量机

  • 增量式支持向量机

咱们一起来看看支持向量机所有的内容~

线性支持向量机

支持向量机主要用于分类和回归问题。线性支持向量机是SVM中最简单也是最基础的形式之一。

核心原理

线性支持向量机的目标是找到一个最优的超平面来分割数据空间,使得两个不同类别的数据点能够被正确分类,并且保持分类边界到最近的数据点的距离(即间隔)最大化。

核心公式

分类决策函数

对于输入数据点,线性支持向量机的分类决策函数可以表示为:

其中,是超平面的法向量,是偏置项,表示向量的点积运算,函数输出为1或-1,表示正类或负类。

超平面的方程

超平面可以表示为:

特点和适用场景

特点:

  • 线性支持向量机具有良好的泛化性能。
  • 适用于处理高维数据和数据样本数量不平衡的情况。
  • 可以通过核函数扩展到非线性问题。
  • 对于稀疏数据的表现很好。

适用场景:

  • 二分类问题
  • 数据维度高、样本数量较小的情况
  • 稀疏数据集

代码案例

实现线性支持向量机代码,根据注释大家可以理解起来:

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

# 生成样本数据
X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1)

# 训练线性支持向量机模型
svm = SVC(kernel='linear')
svm.fit(X, y)

# 绘制决策边界
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm)
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 = svm.decision_function(np.c_[xx.ravel(), yy.ravel()])

# 绘制决策边界和支持向量
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z, colors='k', levels=[-11], alpha=0.5,
            linestyles=['--''-''--'])
plt.scatter(svm.support_vectors_[:, 0], svm.support_vectors_[:, 1], s=100,
            linewidth=1, facecolors='none', edgecolors='k')
plt.show()

线性支持向量机是一种有效的分类算法,通过寻找最优的超平面来划分数据空间,并在保持分类准确性的同时最大化分类间隔。它适用于二分类问题,尤其在高维数据和数据样本不平衡的情况下表现良好。

非线性支持向量机

非线性支持向量机(Nonlinear Support Vector Machine)通过引入核函数来处理非线性可分的数据。

核心原理

非线性支持向量机的主要思想是将输入空间中的数据通过一个非线性映射(核函数)映射到一个高维特征空间,在高维特征空间中寻找一个线性超平面来进行分类。

核心公式

决策函数

非线性支持向量机的分类决策函数可以表示为:

其中,是支持向量的拉格朗日乘子,是对应支持向量的类别标签,是核函数,是偏置项。

核函数

核函数的选择是非线性支持向量机的关键。常用的核函数包括线性核、多项式核、高斯径向基函数(RBF)等。

特点和适用场景

特点:

  • 能够处理非线性可分的数据。
  • 引入核函数后可以在高维特征空间中进行线性分类。
  • 避免了直接对高维空间进行计算,节省了计算成本。

适用场景:

  • 当数据不是线性可分时,使用非线性支持向量机能够获得更好的分类效果。
  • 数据集维度较高,线性分类效果不佳时。
  • 需要灵活选择核函数以适应不同的数据分布情况。

代码案例

非线性支持向量机代码实现~

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

# 生成非线性可分的样本数据
X, y = make_circles(n_samples=100, noise=0.1, factor=0.4, random_state=42)

# 训练非线性支持向量机模型
svm = SVC(kernel='rbf', gamma=1)
svm.fit(X, y)

# 绘制决策边界
plt.figure(figsize=(86))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm, s=50, edgecolors='k')

# 绘制支持向量
plt.scatter(svm.support_vectors_[:, 0], svm.support_vectors_[:, 1],
            s=200, facecolors='none', edgecolors='k')

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

xx, yy = np.meshgrid(np.linspace(xlim[0 ], xlim[1], 200),
                     np.linspace(ylim[0], ylim[1], 200))
Z = svm.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), Z.max(), 10), alpha=0.3, cmap=plt.cm.coolwarm)

plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Nonlinear SVM Classification')
plt.show()

非线性支持向量机通过引入核函数来处理非线性可分的数据,能够在高维特征空间中寻找一个线性超平面来进行分类,从而取得更好的分类效果。适用于处理非线性可分的数据和高维特征空间下的分类问题。通过选择不同的核函数可以适应不同的数据分布情况。

多类别支持向量机

多类别支持向量机(Multiclass Support Vector Machine)是支持向量机在处理多类别分类问题时的扩展。

核心原理

多类别支持向量机通过将多个二分类支持向量机组合来处理多类别分类问题。常见的方法包括一对一(One-vs-One)和一对其余(One-vs-Rest)。

核心公式

One-vs-One

在一对一的方法中,对于K个类别,需要训练个二分类支持向量机。对于第类和第类之间的分类,训练一个支持向量机

分类时,通过投票方式确定每个数据点的类别:

One-vs-Rest

在一对其余的方法中,对于每个类别,训练一个二分类支持向量机,将该类别视为正类,其他类别视为负类。

分类时,将每个数据点分别送入所有二分类支持向量机,最终将数据点分配给具有最高决策函数值的类别。

特点和适用场景

特点:

  • 可以处理多类别分类问题。
  • 可以使用与二分类支持向量机相同的技术和核函数。
  • 一对一方法通常需要更多的模型训练和内存开销,但在某些情况下可能更有效。
  • 一对其余方法通常更简单直观,但可能存在类别不平衡问题。

适用场景:

  • 多类别分类问题。
  • 适用于各类别之间相互独立的情况。
  • 数据集较小的情况下,一对一方法可能更适用;数据集较大的情况下,一对其余方法可能更有效。

代码案例

实现多类别支持向量机(一对一方法)代码~

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.svm import SVC
from itertools import combinations

# 生成样本数据
X, y = make_classification(n_samples=100, n_features=2, n_classes=3, n_clusters_per_class=1, n_informative=2, n_redundant=0)

# 训练多类别支持向量机模型(一对一方法)
classifiers = {}
class_pairs = list(combinations(np.unique(y), 2))
for pair in class_pairs:
    X_pair, y_pair = X[np.where(np.isin(y, pair))], y[np.where(np.isin(y, pair))]
    svm = SVC(kernel='linear')
    svm.fit(X_pair, y_pair)
    classifiers[pair] = svm

# 绘制决策边界
plt.figure(figsize=(8 6))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm, s=50, edgecolors='k')

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

xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 200),
                     np.linspace(ylim[0], ylim[1], 200))
for pair, clf in classifiers.items():
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contour(xx, yy, Z, colors='k', levels=[-11], alpha=0.5,
                linestyles=['--''-''--'])

plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Multiclass SVM Classification (One-vs-One)')
plt.show()

多类别支持向量机通过扩展二分类支持向量机来处理多类别分类问题。常用的方法包括一对一和一对其余。可以使用不同的核函数和技术来实现多类别支持向量机。适用于多类别分类问题,选择适当的方法取决于数据集的大小和特性。

软间隔支持向量机

软间隔支持向量机(Soft Margin Support Vector Machine)是一种在训练数据中允许一定程度的分类错误的支持向量机。

核心原理

在硬间隔支持向量机中,要求所有的训练样本都被正确分类,但在实际情况中,数据可能存在噪音或异常点。软间隔支持向量机通过引入松弛变量(slack variables)来容忍一些错误,从而提高模型的鲁棒性。

核心公式

原始优化问题

软间隔支持向量机的目标是最小化以下原始优化问题:

其中,是超平面法向量,是偏置项,是松弛变量,是正则化参数。

约束条件

 

特点和适用场景

特点:

  • 允许一定程度的分类错误,提高模型的鲁棒性。
  • 适用于训练数据中存在噪音或异常点的情况。
  • 超参数控制了松弛变量的惩罚力度,可以通过调整来平衡间隔的最大化和错误的最小化。

适用场景:

  • 数据集中存在噪音或异常点的情况。
  • 对于硬间隔支持向量机无法完全分离的数据集。

代码案例

实现软间隔支持向量机代码~

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

# 生成样本数据
X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1)

# 训练软间隔支持向量机模型
svm = SVC(kernel='linear', C=1)
svm.fit(X, y)

# 绘制决策边界
plt.scatter(X[:, 0 ], X[:, 1], c=y, cmap=plt.cm.coolwarm)
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 = svm.decision_function(np.c_[xx.ravel(), yy.ravel()])

# 绘制决策边界和支持向量
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z, colors='k', levels=[-11], alpha=0.5,
            linestyles=['--''-''--'])
plt.scatter(svm.support_vectors_[:, 0], svm.support_vectors_[:, 1], s=100,
            linewidth=1, facecolors='none', edgecolors='k')
plt.show()

软间隔支持向量机通过引入松弛变量来容忍一定程度的分类错误,提高了模型的鲁棒性。适用于数据集中存在噪音或异常点的情况,通过调整正则化参数来平衡最大化间隔和最小化分类错误。在实际应用中,软间隔支持向量机更灵活,可以适应更多的复杂情况。

核函数支持向量机

核函数支持向量机(Kernel Support Vector Machine)是支持向量机的扩展,通过引入核函数来处理非线性可分的数据。其原理和核心公式如下所述。

核心原理

核函数支持向量机通过将输入空间中的数据点映射到一个高维特征空间,在高维特征空间中寻找一个线性超平面来进行分类,从而实现对非线性可分数据的分类。

核心公式

决策函数

核函数支持向量机的分类决策函数可以表示为:

其中,是支持向量的拉格朗日乘子,是对应支持向量的类别标签,是核函数,是偏置项。

核函数

核函数是核心公式的关键。常用的核函数包括线性核、多项式核、高斯径向基函数(RBF)等。

特点和适用场景

特点:

  • 能够处理非线性可分的数据。
  • 引入核函数后可以在高维特征空间中进行线性分类。
  • 避免了直接对高维空间进行计算,节省了计算成本。

适用场景:

  • 数据集中存在非线性关系的情况。
  • 高维特征空间下的分类问题。
  • 数据集维度较高,线性分类效果不佳时。

代码案例

实现核函数支持向量机的代码~

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

# 生成非线性可分的样本数据
X, y = make_moons(n_samples=100, noise=0.1, random_state=42)

# 训练核函数支持向量机模型(使用高斯径向基函数RBF作为核函数)
svm = SVC(kernel='rbf', gamma=1)
svm.fit(X, y)

# 绘制决策边界
plt.figure(figsize=(86))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm, s=50, edgecolors='k')

# 绘制支持向量
plt.scatter(svm.support_vectors_[:, 0], svm.support_vectors_[:, 1],
            s=200, facecolors='none', edgecolors='k')

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

xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 200),
                     np.linspace(ylim[0], ylim[1], 200))
Z = svm.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), Z.max(), 10), alpha=0.3, cmap=plt.cm.coolwarm)

plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Kernel SVM Classification (RBF Kernel)')
plt.show()

核函数支持向量机通过引入核函数来处理非线性可分的数据,能够在高维特征空间中寻找一个线性超平面来进行分类。适用于处理非线性可分的数据和高维特征空间下的分类问题。选择合适的核函数对模型的性能影响较大,需要根据具体问题选择合适的核函数。

径向基函数支持向量机

径向基函数(Radial Basis Function, RBF)支持向量机是很常用的核函数支持向量机,它通过径向基函数来将数据映射到高维特征空间。

核心原理

径向基函数支持向量机通过使用径向基函数将数据映射到高维特征空间,并在该空间中寻找一个线性超平面来进行分类。其核心思想是通过计算数据点与支持向量之间的距离来判断其类别。

核心公式

决策函数

径向基函数支持向量机的分类决策函数可以表示为:

其中,是支持向量的拉格朗日乘子,是对应支持向量的类别标签,是径向基函数,通常采用高斯核函数。

高斯核函数

高斯核函数的形式为:

其中,是高斯核函数的带宽参数,决定了数据在高维空间中的分布情况。

特点和适用场景

特点:

  • 能够处理非线性可分的数据。
  • 通过调整高斯核函数的带宽参数可以控制决策边界的复杂度。
  • 对于高维数据和复杂数据集具有较好的分类性能。

适用场景:

  • 非线性可分的数据集。
  • 高维特征空间下的分类问题。
  • 对分类性能要求较高的应用场景。

代码案例

用Python实现径向基函数支持向量机代码~

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

# 生成非线性可分的样本数据
X, y = make_moons(n_samples=100, noise=0.1, random_state=42)

# 训练径向基函数支持向量机模型
svm = SVC(kernel='rbf', gamma=1)
svm.fit(X, y)

# 绘制决策边界
plt.figure(figsize=(86))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm, s=50, edgecolors='k')

# 绘制支持向量
plt.scatter(svm.support_vectors_[:, 0], svm.support_vectors_[:, 1],
            s=200, facecolors='none', edgecolors='k')

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

xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 200),
                     np.linspace(ylim[0], ylim[1], 200))
Z = svm.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), Z.max(), 10), alpha=0.3, cmap=plt.cm.coolwarm)

plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('RBF SVM Classification')
plt.show()

径向基函数支持向量机通过使用高斯核函数将数据映射到高维特征空间,并在该空间中寻找一个线性超平面来进行分类。适用于处理非线性可分的数据集和高维特征空间下的分类问题。调整高斯核函数的带宽参数可以控制决策边界的复杂度,从而适应不同的数据分布情况。

多核支持向量机

多核支持向量机(Multiple Kernel Support Vector Machine)是支持向量机的一种扩展,允许在训练过程中使用多个不同的核函数。

核心原理

多核支持向量机通过结合多个核函数的计算结果来构建分类模型,以提高模型的鲁棒性和性能。通过学习各个核函数的权重来确定最终的决策函数。

核心公式

决策函数

多核支持向量机的分类决策函数可以表示为:

其中,是各个核函数的权重,是第个核函数的决策函数,是偏置项。

多核函数

多核支持向量机允许使用多个不同的核函数,常用的核函数包括线性核、多项式核、高斯径向基函数(RBF)等。

权重学习

通过训练数据学习各个核函数的权重,以使得模型在训练集上的性能达到最佳。

特点和适用场景

特点:

  • 能够充分利用多个核函数的优势,提高分类性能。
  • 可以根据具体问题选择合适的核函数组合。
  • 允许在训练过程中动态地学习核函数的权重。

适用场景:

  • 数据集具有复杂的非线性结构。
  • 对分类性能要求较高的情况。
  • 需要根据具体问题选择合适的核函数组合。

代码案例

实现多核支持向量机代码~

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

# 生成非线性可分的样本数据
X, y = make_moons(n_samples=100, noise=0.1, random_state=42)

# 训练多核支持向量机模型
svm = SVC(kernel='linear', C=1)
svm.fit(X, y)

# 绘制决策边界
plt.figure(figsize=(86))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm, s=50, edgecolors='k')

# 绘制支持向量
plt.scatter(svm.support_vectors_[:, 0], svm.support_vectors_[:, 1],
            s=200, facecolors='none', edgecolors='k')

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

xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1],  200),
                     np.linspace(ylim[0], ylim[1], 200))
Z = svm.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), Z.max(), 10), alpha=0.3, cmap=plt.cm.coolwarm)

plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Multiple Kernel SVM Classification')
plt.show()

多核支持向量机允许在训练过程中使用多个不同的核函数,通过结合多个核函数的计算结果来构建分类模型,提高模型的性能和鲁棒性。适用于处理具有复杂非线性结构的数据集,并且对分类性能要求较高的情况。在实际应用中,可以根据具体问题选择合适的核函数组合来构建多核支持向量机模型。

自适应支持向量机

自适应支持向量机(Adaptive Support Vector Machine,ASVM)是一种能够自适应地调整核函数参数的支持向量

核心原理

自适应支持向量机通过优化核函数参数,使得模型在训练集上的性能达到最佳。通常采用交叉验证等技术来选择最优的核函数参数。

核心公式

自适应支持向量机的核心公式与传统的支持向量机相同,但核函数参数需要经过优化得到。常用的核函数参数优化方法包括网格搜索、贝叶斯优化等。

特点和适用场景

特点:

  • 能够自适应地调整核函数参数,提高模型的性能。
  • 具有一定的鲁棒性,能够适应不同的数据分布情况。
  • 可以根据具体问题选择合适的核函数类型和参数。

适用场景:

  • 数据集具有复杂的非线性结构。
  • 对分类性能要求较高的情况。
  • 需要在训练过程中动态地调整核函数参数的情况。

代码案例

用Python实现自适应支持向量机~

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

# 生成非线性可分的样本数据
X, y = make_moons(n_samples=100, noise=0.1, random_state=42)

# 使用网格搜索选择最优的核函数参数
param_grid = {'C': [0.110100], 'gamma': [0.110100]}
grid_search = GridSearchCV(SVC(kernel='rbf'), param_grid, cv=5)
grid_search.fit(X, y)
best_params = grid_search.best_params_

# 训练自适应支持向量机模型
svm = SVC(kernel='rbf', C=best_params['C'], gamma=best_params['gamma'])
svm.fit(X, y)

# 绘制决策边界
plt.figure(figsize=(86))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm, s=50, edgecolors='k')

# 绘制支持向量
plt.scatter(svm.support_vectors_[:, 0], svm.support_vectors_[:, 1],
            s=200, facecolors='none', edgecolors='k')

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

xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 200),
                     np.linspace(ylim[0], ylim[ 1], 200))
Z = svm.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), Z.max(), 10), alpha=0.3, cmap=plt.cm.coolwarm)

plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Adaptive SVM Classification')
plt.show()

自适应支持向量机能够自适应地调整核函数参数,提高模型的性能。适用于处理具有复杂非线性结构的数据集,并且对分类性能要求较高的情况。在实际应用中,可以通过网格搜索等技术选择最优的核函数参数,从而构建性能更好的分类模型。

稀疏支持向量机

稀疏支持向量机(Sparse Support Vector Machine)是支持向量机的一种变体,其目的是通过限制支持向量的数量来提高模型的可解释性和计算效率。

核心原理

稀疏支持向量机通过引入正则化项,同时最小化模型的损失函数和支持向量的数量,从而使得模型在保持较高分类性能的同时具有更少的支持向量。

核心公式

优化目标

稀疏支持向量机的优化目标是:

其中,是超平面法向量,是偏置项,是松弛变量,是正则化参数。

稀疏性惩罚

在优化目标中,通过调整正则化参数来平衡间隔的最大化和错误的最小化,从而控制支持向量的数量,实现模型的稀疏性。

特点和适用场景

特点:

  • 通过限制支持向量的数量,提高模型的可解释性和计算效率。
  • 适用于大规模数据集和高维特征空间下的分类问题。
  • 通过调整正则化参数可以灵活控制模型的稀疏程度。

适用场景:

  • 对模型的可解释性和计算效率要求较高的情况。
  • 大规模数据集和高维特征空间下的分类问题。

代码案例

以下是使用Python实现稀疏支持向量机并画出分类边界的示例代码:

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

# 生成样本数据
X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1)

# 训练稀疏支持向量机模型
svm = SVC(kernel='linear', C=0.1)
svm.fit(X, y)

# 绘制决策边界
plt.figure(figsize=(86))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm, s=50, edgecolors='k')

# 绘制支持向量
plt.scatter(svm.support_vectors_[:, 0], svm.support_vectors_[:, 1],
            s=200, facecolors='none', edgecolors='k')

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

xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 200),
                     np.linspace(ylim[0], ylim[1], 200))
Z = svm.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), Z.max(),  10), alpha=0.3, cmap=plt.cm.coolwarm)

plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Sparse SVM Classification')
plt.show()

稀疏支持向量机通过限制支持向量的数量来提高模型的可解释性和计算效率。适用于大规模数据集和高维特征空间下的分类问题,对模型的可解释性和计算效率要求较高的情况。通过调整正则化参数可以灵活控制模型的稀疏程度。

增量式支持向量机

增量式支持向量机(Incremental Support Vector Machine,ISVM)是一种能够在线学习的支持向量机算法,可以在不断接收新样本时更新模型参数。以下是详细的原理、核心公式、特点、适用场景、代码案例演示。

核心原理

增量式支持向量机通过逐步学习新样本并调整模型参数,实现对新数据的快速适应,而无需重新训练整个模型。其核心思想是利用新样本的信息来更新原有模型,从而提高模型的性能。

核心公式

更新规则

增量式支持向量机的更新规则通常是基于梯度下降或增量优化方法来更新模型参数。更新规则的具体形式取决于选择的优化算法。

损失函数

增量式支持向量机通常采用与传统支持向量机相同的损失函数,例如Hinge Loss。损失函数的选择影响了模型的性能和收敛速度。

特点和适用场景

特点:

  • 能够在线学习,适用于连续接收新数据的场景。
  • 可以快速地适应新样本,无需重新训练整个模型。
  • 可以有效地处理大规模数据集。

适用场景:

  • 需要实时更新模型以适应新数据的应用场景。
  • 处理数据量大、维度高的数据集。

代码案例

使用Python实现增量式支持向量机~

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.linear_model import SGDClassifier

# 生成样本数据
X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1)

# 初始化增量式支持向量机模型
svm = SGDClassifier(loss='hinge', penalty='l2', alpha=0.001, max_iter=100)

# 逐步接收新样本并更新模型
for i in range(0, len(X), 10):
    X_batch = X[i:i+10]
    y_batch = y[i:i+10]
    svm.partial_fit(X_batch, y_batch, classes=np.unique(y))

# 绘制决策边界
plt.figure(figsize=(86))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.coolwarm, s=50, edgecolors='k')

# 绘制支持向量
plt.scatter(svm.coef_[00], svm.coef_[01], s=200, facecolors='none', edgecolors='k')

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

xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 200),
                     np.linspace(ylim[0], ylim[1], 200))
Z = svm.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), Z.max(), 10), alpha=0.3, cmap=plt.cm.coolwarm)

plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Incremental SVM Classification')
plt.show()

这段代码画出的是二维特征空间中的数据点以及基于增量学习的线性支持向量机(SVM)的决策边界。具体来说:

  • 数据点:生成了包含两个特征的二维数据集,并且使用散点图将这些数据点在特征空间中可视化。不同类别的数据点使用不同的颜色表示。

  • 决策边界:通过对特征空间中的网格点进行预测,然后绘制等高线来显示SVM的决策边界。等高线表示决策函数的值,在决策函数为0的地方就是决策边界。

  • 支持向量:在决策边界附近绘制了支持向量。这些是在训练过程中被SVM选中作为最接近决策边界的训练样本点。

通过观察上述图像,可以了解到SVM如何在特征空间中划分不同类别的数据点,并且理解SVM的决策边界是如何确定的。

最后说说增量式支持向量机,它是能够在线学习并逐步更新模型,适用于连续接收新数据的场景。通过不断接收新样本并更新模型参数,从而有效地提高模型的性能,并且无需重新训练整个模型。适用于处理大规模数据集和需要实时更新模型的应用场景。


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/190919