【机器学习】支持向量机(实战)

news2024/10/6 16:25:59

支持向量机(实战)



目录

  • 一、准备工作(设置 jupyter notebook 中的字体大小样式等)
  • 二、线性支持向量机(核函数为线性核)
  • 三、数据标准化的影响
  • 四、软间隔
  • 五、非线性支持向量机
    • 5.1 手动升维
    • 5.2 对比试验:手动升维与核函数的差异
      • 方法1:利用 PolynomialFeatures 来对原始数据进行升维,然后再利用线性 SVM 对数据进行训练
      • 方法 2:利用核技巧(选用 poly 核)
      • 方法 3:利用核技巧(选用高斯核)
  • 六、对比试验: 𝛾 和 C 值对 SVM 的影响。

实战部分将结合着 理论部分 进行,旨在帮助理解和强化实操(以下代码将基于 jupyter notebook 进行)。




一、准备工作(设置 jupyter notebook 中的字体大小样式等)

import numpy as np
import os
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
plt.rcParams['axes.labelsize'] = 14
plt.rcParams['xtick.labelsize'] = 12
plt.rcParams['ytick.labelsize'] = 12
import warnings
warnings.filterwarnings('ignore')


二、线性支持向量机(核函数为线性核)


下面将通过鸢尾花数据集来展示线性 SVM 的分类效果。

步骤一:从 sklearn 中导入鸢尾花数据集并构建模型

# 导入相关库函数
from sklearn.svm import SVC
from sklearn import datasets

# 这里选用鸢尾花数据集作为实验数据集
# 为便于查看分类效果,选用数据集中的两个特征(这样画图时就是一个二维平面,直观上看起来更易于理解)
iris = datasets.load_iris()
X = iris['data'][:,(2,3)]
y = iris['target']

# 设置数据的特征和标签
setosa_or_versicolor = (y==0) | (y==1)
X = X[setosa_or_versicolor]
y = y[setosa_or_versicolor]

# 先做一个线性支持向量机模型(不对原数据集做任何特征变换)
# C 值是用于控制过拟合的,由于这里的数据集比较简单,故此不考虑这个参数,因此将其设置为无穷大
svm_clf = SVC(kernel='linear',C=float('inf'))

# 训练模型
svm_clf.fit(X,y)

在这里插入图片描述

步骤二:可视化展示分类结果

# 下面进行画图展示

# 这里设置三条线,作为传统模型的分类结果(以作对比)
x0 = np.linspace(0,5.5,200)
pred_1 = 5*x0 - 20
pred_2 = x0 - 1.8
pred_3 = 0.1*x0 + 0.5

# 定义一个绘制决策边界的函数(注:该函数仅适用于特征数为 2 的数据集)
def plot_svc_decision_boundary(svm_clf,xmin,xmax,sv = True):
    # 通过分类器获取权重参数
    w = svm_clf.coef_[0]
    
    # 通过分类器获取偏置参数
    b = svm_clf.intercept_[0]
    
    # 获取待绘制边界(在 x0 上)的两个端点值
    x0 = np.linspace(xmin,xmax,200)
    
    # 计算划分超平面的方程: w0x0+x1x1+b=0
    # 现在已知 x0 的数据,画图还需要 x1 的值
    x1 = - w[0]/w[1]*x0 - b/w[1]
    
    # 计算“间隔”
    margin = 1/w[1]
    
    # 基于前面的值可得到两条支持向量分别对应的“间隔”边界线
    gutter_up = x1 + margin
    gutter_down = x1 - margin
    
    # 判断是否展示图中的支持向量
    if sv:
        # 获取数据集中的支持向量
        svs = svm_clf.support_vectors_
        
        # 强调支持向量
        plt.scatter(svs[:,0],svs[:,1],s=180,facecolors='#FFAAAA')
        
    # 绘制三条线:支持向量所在决策边界×2、划分超平面
    plt.plot(x0, x1,'k-' , linewidth=2)
    plt.plot(x0, gutter_up, 'k--', linewidth=2)
    plt.plot(x0, gutter_down,'k--', linewidth=2)
# 绘图展示
plt.figure(figsize=(14,4))

# 绘制传统分类算法的决策边界
plt.subplot(121)
plt.plot(X[:,0][y==1],X[:,1][y==1], 'bs')
plt.plot(X[:,0][y==0],X[:,1][y==0], 'ys')
plt.plot(x0, pred_1, 'g--', linewidth=2)
plt.plot(x0, pred_2, 'm-', linewidth=2)
plt.plot(x0, pred_3, 'r-', linewidth=2)
plt.axis([0,5.5,0,2])

# 绘制 SVM 的决策边界
plt.subplot (122)
plot_svc_decision_boundary(svm_clf,0,5.5)
plt.plot(X[:,0][y==1],X[:,1][y==1], 'bs')
plt.plot(X[:,0][y==0],X[:,1][y==0], 'ys')
plt.axis([0,5.5,0,2])

在这里插入图片描述

上图展示了用绘制传统分类算法和 SVM 算法的决策边界,很明显,SVM 的效果更好。



三、数据标准化的影响

如果不对数据标准化,可能会导致支持向量间隔非常小(如一些极端的离群点),从而对最终的分类效果产生影响。

在这里插入图片描述

因此,在实验过程中,一定要注意对原数据集进行标准化。



四、软间隔

软间隔的存在,使得可对数据中的一些离群点进行适当放宽,因而改善最终的分类效果。

采取软间隔的两个好处:

在这里插入图片描述

下面通过一个实验,直观地感受软间隔对 SVM 的影响。

# 导入如工具包
import numpy as np
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

# 依然选用鸢尾花数据集(并使用其 2 个特征)
iris=datasets.load_iris()
X = iris["data"][:,(2,3)]
y = (iris["target"] == 2).astype(np.float64)

# 用流水线封装 SVM 训练模型的过程
svm_clf = Pipeline((
    ('std',StandardScaler()),
    ('linear_svc',LinearSVC(C = 1))
))

# 训练模型
svm_clf.fit(X,y)

在这里插入图片描述

# 执行预测
svm_clf.predict([[4.3,1.4]])
[Out]
 	array([0.])

对比不同 C 值带来的差异(即控制软间隔的程度)

# 定义一个标准化过程
scaler = StandardScaler()

# 定义两个 C 值不同的分类器
svm_clf1 = LinearSVC(C=1,random_state = 42)
svm_clf2 = LinearSVC(C=1000,random_state = 42)

# 分类进行流水线封装
scaled_svm_clf1 = Pipeline((
    ('std',StandardScaler()),
    ('linear_svc',svm_clf1)
))
scaled_svm_clf2 = Pipeline((
    ('std',StandardScaler()),
    ('linear_svc',svm_clf2)
))

# 训练数据
scaler.fit(X,y)
scaled_svm_clf1.fit(X,y)
scaled_svm_clf2.fit(X,y)

在这里插入图片描述

# 按照前面的方式,分别计算出支持向量所在的决策边界和划分超平面的方程
b1 = svm_clf1.decision_function([-scaler.mean_ / scaler.scale_])
b2 = svm_clf2.decision_function([-scaler.mean_ / scaler.scale_])
w1 = svm_clf1.coef_[0] / scaler.scale_
w2 = svm_clf2.coef_[0] / scaler.scale_
svm_clf1.intercept_ = np.array([b1])
svm_clf2.intercept_ = np.array([b2])
svm_clf1.coef_ = np.array([w1])
svm_clf2.coef_ = np.array([w2])
# 画图展示两个分类器的分类效果
plt.figure(figsize=(14,4.2))
plt.subplot(121)
plt.plot(X[:,0][y==1],X[:,1][y==1], "g^", label="Iris-Virginica")
plt.plot(X[:,0][y==0],X[:,1][y==0],"bs", label="Iris-Versicolor")
plot_svc_decision_boundary(svm_clf1,4,6,sv=False)
plt.xlabel("Petal length", fontsize=14)
plt.ylabel("Petal width", fontsize=14)
plt.legend(loc="upper left", fontsize=14)
plt.title("$C = {}$".format(svm_clf1.C), fontsize=16)
plt.axis([4,6,0.8,2.8])

plt.subplot(122)
plt.plot(X[:,0][y==1],X[:,1][y==1],"g^")
plt.plot(X[:,0][y==0],X[:,1][y==0],"bs")
plot_svc_decision_boundary(svm_clf2,4,6,sv=False)
plt.xlabel("Petal length", fontsize=14)
plt.title("$C ={}$".format(svm_clf2.C),fontsize=16)
plt.axis([4,6,0.8,2.8])

在这里插入图片描述

实验结果说明:

  • 左图:使用较低的 C 值(软间隔程度更大),因此其分类结果中会有较多数据落在间隔内;
  • 左图:使用较高的 C 值(软间隔程度更小),因此其分类结果中会有较少数据落在间隔内(但也容易出现过拟合现象)。


五、非线性支持向量机

主要可以通过两种方式来完成对任务的非线性变换:

  • 手动升维(如将原始的 1 维数据变换至 2 维)。
  • 采用核函数。

5.1 手动升维

# 构建一个一维数据集
X1D = np.linspace(-4,4,9).reshape(-1,1)

# 指定该数据的标签
y = np. array ([0,0,1,1,1,1, 1,0,0])

# 手动地将其维度提升
# 此时,采用“将原数据对应元素进行平方操作”的方式,来得到原始数据集在第 2 个维度上的特征值
X2D = np.c_[X1D,X1D**2]

# 下面画图展示这些数据在不同维度下的体现
plt.figure(figsize=(11,4))

# 原始数据( 1 维)
plt.subplot(121)
plt.grid(True, which='both')
plt.axhline(y=0,color='k')
plt. plot(X1D[:,0][y==0], np.zeros(4),"bs")
plt. plot(X1D[:,0][y==1], np.zeros(5),"g^")
plt.gca().get_yaxis().set_ticks([])
plt.xlabel(r"$x_1$",fontsize=20)
plt.axis ([-4.5,4.5,-0.2,0.2])

# 进行升维操作后的数据( 2 维)
plt.subplot(122)
plt.grid(True,which='both')
plt.axhline(y=0,color='k')
plt.axvline(x=0, color='k')
plt.plot(X2D[:,0][y==0],X2D[:,1][y==0],"bs")
plt.plot(X2D[:,0][y==1],X2D[:,1][y==1],"g^")
plt.xlabel(r"$x_1$",fontsize=20)
plt.ylabel(r"$x_2$",fontsize=20,rotation=0)
plt.gca().get_yaxis().set_ticks([0,4,8,12,16])
plt.plot([-4.5,4.5],[6.5,6.5],"r--",linewidth=3)
plt.axis([-4.5,4.5,-1,17])

# 指定图像的标题
plt.subplots_adjust(right=1)

# 展示
plt.show()

在这里插入图片描述

可以很明显地看出,在进行升维操作后,原始数据集变得更容易被分类。

5.2 对比试验:手动升维与核函数的差异

# 接下来创建一份稍有难度的数据(两个相交的月牙)
from sklearn.datasets import make_moons
X, y = make_moons(n_samples=100, noise=0.15, random_state=42)

# 定义绘图函数
def plot_dataset(X, y, axes):
    plt.plot(X[:,0][y==0], X[:,1][y==0],"bs")
    plt.plot(X[:,0][y==1], X[:,1][y==1],"g^")
    plt.axis(axes)
    plt.grid(True, which='both')
    plt.xlabel(r"$x_1$", fontsize=20)
    plt.ylabel(r"$x_2$", fontsize=20,rotation=0)

# 对构建的数据进行可视化展示
plot_dataset(X, y,[-1.5,2.5,-1,1.5])
plt.show()

在这里插入图片描述

方法1:利用 PolynomialFeatures 来对原始数据进行升维,然后再利用线性 SVM 对数据进行训练

# 导入相关库
from sklearn.datasets import make_moons
from sklearn. pipeline import Pipeline
from sklearn. preprocessing import PolynomialFeatures

# 进行流水线封装
polynomial_svm_clf = Pipeline((("poly_features", PolynomialFeatures(degree=3)),
                            ("scaler" , StandardScaler()),
                            ("svm_clf", LinearSVC(C=10,loss="hinge"))
))
  
# 训练模型
polynomial_svm_clf.fit(X, y)

在这里插入图片描述

# 定义用于绘制决策边界的函数
def plot_predictions(clf,axes):
    # 构建坐标棋盘
    x0s = np.linspace(axes[0], axes[1], 100)
    x1s = np.linspace(axes[2], axes[3], 100)
    x0,x1 = np.meshgrid(x0s, x1s)
    
    # 组合得到一份数据集
    X = np.c_[x0.ravel(),x1.ravel()]
    
    # 利用训练好的模型进行预测
    y_pred = clf.predict(X).reshape (x0.shape)
    
    # 绘制决策边界
    plt.contourf(x0,x1,y_pred, cmap = plt.cm.brg, alpha=0.2)
    
# 将数据传入并绘制决策边界
plot_predictions(polynomial_svm_clf,[-1.5,2.5,-1,1.5])

# 同时绘制出训练数据集
plot_dataset(X,y,[-1.5,2.5,-1,1.5])

方法 2:利用核技巧(选用 poly 核)

实际上,poly 核所做的工作就是方法 1 中所执行的。不同的是,当你选用了 poly 核后,就不需要再手动对数据集进行升维处理(此时,对原数据集的升维处理被整合到了整个模型的构建中)。

from sklearn.svm import SVC

# 定义一个 SVM 模型(并进行流水线封装)
# 注:coef0 参数表示偏置项
poly_kernel_svm_clf = Pipeline([
        ("scaler",StandardScaler()),
        ("svm_clf",SVC(kernel="poly", degree=3,coef0 = 10 ,C=5))
])

# 训练模型
poly_kernel_svm_clf.fit(X, y)

# 定义一个对比模型(将 degree 值设置更大一些)
poly100_kernel_svm_clf = Pipeline([
        ("scaler",StandardScaler()),
        ("svm_clf",SVC(kernel="poly", degree=10,coef0 = 10 ,C = 5))
])

# 训练模型
poly100_kernel_svm_clf.fit(X, y)

在这里插入图片描述

# 画图对比两个模型的效果
plt.figure(figsize=(11,4))

# 模型 1
plt.subplot(121)
plot_predictions(poly_kernel_svm_clf,[-1.5,2.5,-1,1.5])
plot_dataset(X, y,[-1.5,2.5,-1,1.5])
plt.title(r"$d=3, r=10,C=5$",fontsize=18)

# 模型 2
plt.subplot(122)
plot_predictions(poly100_kernel_svm_clf,[-1.5,2.5,-1,1.5])
plot_dataset(X, y,[-1.5,2.5,-1,1.5])
plt.title(r"$d=10,r=10,C=5$", fontsize=18)

# 展示
plt.show()

在这里插入图片描述

方法 3:利用核技巧(选用高斯核)

高斯核的本质是(假设原数据集的样本点个数为 n ):

计算样本点 i i i 与其他所有样本点的相似度,从而得到一个长度为 n − 1 n-1 n1 的向量,并以该向量作为该样本点的新特征(此时的特征向量即为 [ x 1 , … , x i − 1 , x i + 1 … , x n ] [x_1,…,x_{i-1},x_{i+1}…,x_n] [x1,,xi1,xi+1,xn])。

因此,在用高斯核函数对数据进行处理后,数据的特征将发生本质改变。而新特征的长度则仅与数据集中的样本点个数相关。

总结:高斯核是通过计算相似度来进行特征替换的。

下面介绍样本点的相似度计算规则(为便于理解和演示,采用一维数据作为原数据集。同时,下面的例子仅将数据的特征长度提升至二维,因此这里随机选择了两个点: x 1 ( j ) = − 2 x_1^{(j)}=-2 x1(j)=2 x 1 ( k ) = 1 x_1^{(k)}=1 x1(k)=1 作为目标点):

  • 为目标点其添加高斯函数;
  • γ = 0.3 \gamma=0.3 γ=0.3 的径向基函数(RBF)作为相似度函数,即:

φ ( x , l ) = e − γ ( x − l ) 2 \varphi(\text{x},l)=e^{-\gamma(\text{x}-l)^2} φ(x,l)=eγ(xl)2

这里演示下对于样本点 x 1 ( i ) x_1^{(i)} x1(i),其相似度是如何得到的:

取样本点 x 1 ( i ) = − 1 x_1^{(i)}=-1 x1(i)=1时,它距离 x 1 ( j ) = − 2 x_1^{(j)}=-2 x1(j)=2的长度为 1 ,距离 x 1 ( k ) = 1 x_1^{(k)}=1 x1(k)=1的长度为2。则得到其新特征 x 2 ( i ) = e x p − 0.3 × 1 2 ≈ 0.74 x_2^{(i)}=exp^{-0.3×1^2}≈0.74 x2(i)=exp0.3×120.74 x 3 ( i ) = e x p − 0.3 × 2 2 ≈ 0.30 x_3^{(i)}=exp^{-0.3×2^2}≈0.30 x3(i)=exp0.3×220.30。此时,样本点由原来的特征 [ − 1 ] [-1] [1] 变为 [ 0.74 , 0.30 ] [0.74,0.30] [0.74,0.30]

下面画图展示这个升维过程:

# 绘图代码
# 定义径向基函数
def gaussian_rbf(x,landmark,gamma):
    return np.exp(-gamma * np.linalg.norm(x - landmark,axis=1)**2)

# 定义 gamma 值
gamma = 0.3

# 设置原始数据集的坐标棋盘
x1s = np.linspace(-4.5,4.5,200).reshape(-1,1)

# 利用径向基函数对原始坐标棋盘进行相似度计算(这里构成的数据主要是用来绘制两个高斯分布的图像)
# 新的维度 1
x2s =gaussian_rbf(x1s,-2,gamma)
# 新的维度 2
x3s =gaussian_rbf(x1s,1,gamma)
     
# 利用径向基函数对原始数据进行相似度计算
XK = np.c_[gaussian_rbf(X1D,-2,gamma), gaussian_rbf(X1D, 1, gamma)]

# 设置指定原始数据的标签值
yk = np.array([0,0,1,1,1, 1, 1,0,0])

# 绘图展示
plt.figure(figsize=(11,4))

# 绘制经计算后得到的原始数据的相似度分布图像
plt.subplot(121)
plt.grid(True, which='both')
plt.axhline(y=0,color='k')
plt.scatter(x=[-2,1], y=[0,0],s=150,alpha=0.5, c="red")
plt.plot(X1D[:,0][yk==0], np.zeros(4),"bs")
plt.plot(X1D[:,0][yk==1], np.zeros(5),"g^")
plt.plot(x1s, x2s,"g--")
plt.plot(x1s, x3s,"b:")
plt.gca().get_yaxis().set_ticks([0,0.25,0.5,0.75,1])
plt.xlabel(r"$x_1$", fontsize=20)
plt.ylabel(r"Similarity",fontsize=14)
plt.annotate(r'$\mathbf{x}$',
             xy=(X1D[3,0],0),
             xytext=(-0.5,0.20),
             ha="center",
             arrowprops=dict(facecolor='black', shrink=0.1),
             fontsize=18,
            )
plt.text(-2,0.9,"$x_2$", ha="center", fontsize=20)
plt.text(1,0.9,"$x_3$", ha="center", fontsize=20)
plt.axis([-4.5,4.5,-0.1,1.1])
  
# 绘制将原始数据进行升维操作后的新数据分布情况
plt.subplot(122)
plt.grid(True,which='both')
plt.axhline(y=0,color='k')
plt.axvline(x=0,color='k')
plt.plot(XK[:,0][yk==0],XK[:,1][yk==0],"bs")
plt.plot(XK[:,0][yk==1],XK[:,1][yk==1],"g^")
plt.xlabel(r"$x_2$", fontsize=20)
plt.ylabel(r"$x_3$", fontsize=20,rotation=0)
plt.annotate(r'$\phi\left(\mathbf {x} \right)$',xy=(XK[3,0],XK[3,1]),
            xytext=(0.65,0.50),
            ha="center",
            arrowprops=dict(facecolor='black', shrink=0.1),
             fontsize=18,
            )

# 根据图像可大致绘制一条分界线
plt.plot([-0.1,1.1],[0.57,-0.1],"r--",linewidth=3)
plt.axis([-0.1,1.1,-0.1,1.1])
plt.subplots_adjust(right=1)
plt.show()

在这里插入图片描述

上示左图,展示了以数据点 x = − 2 x=-2 x=2 x = 1 x=1 x=1 为高斯函数(中心点)的概率密度函数。根据选定的这两个样本点,可以计算其余所有数据点在这两个高斯函数上的取值。因此,对于原始数据集中的每个数据点,都会得到两个新的值。我们视这两个值分别为该数据点到指定数据点 x = − 2 x=-2 x=2 x = 1 x=1 x=1 的相似度,并以这两个值构成原数据点的新特征绘至上示右图中。

此时,我们再来看原始分类任务:

  • 左图是在一维数据中区分出“蓝色”与“绿色”,显然不太容易;
  • 右图是在二维数据中区分出“蓝色”与“绿色”,可以很轻松地找出若干条简单而有效的分界线。
# 现在我们尝试将 gamma 的值减小,看会发生怎样的改变
gamma = 0.1

# 设置原始数据集的坐标棋盘
x1s = np.linspace(-4.5,4.5,200).reshape(-1,1)

# 利用径向基函数对原始坐标棋盘进行相似度计算(这里构成的数据主要是用来绘制两个高斯分布的图像)
# 新的维度 1
x2s =gaussian_rbf(x1s,-2,gamma)
# 新的维度 2
x3s =gaussian_rbf(x1s,1,gamma)
     
# 利用径向基函数对原始数据进行相似度计算
XK = np.c_[gaussian_rbf(X1D,-2,gamma), gaussian_rbf(X1D, 1, gamma)]

# 设置指定原始数据的标签值
yk = np.array([0,0,1,1,1, 1, 1,0,0])

# 绘图展示
plt.figure(figsize=(11,4))

# 绘制经计算后得到的原始数据的相似度分布图像
plt.subplot(121)
plt.grid(True, which='both')
plt.axhline(y=0,color='k')
plt.scatter(x=[-2,1], y=[0,0],s=150,alpha=0.5, c="red")
plt.plot(X1D[:,0][yk==0], np.zeros(4),"bs")
plt.plot(X1D[:,0][yk==1], np.zeros(5),"g^")
plt.plot(x1s, x2s,"g--")
plt.plot(x1s, x3s,"b:")
plt.gca().get_yaxis().set_ticks([0,0.25,0.5,0.75,1])
plt.xlabel(r"$x_1$", fontsize=20)
plt.ylabel(r"Similarity",fontsize=14)
plt.annotate(r'$\mathbf{x}$',
             xy=(X1D[3,0],0),
             xytext=(-0.5,0.20),
             ha="center",
             arrowprops=dict(facecolor='black', shrink=0.1),
             fontsize=18,
            )
plt.text(-2,0.9,"$x_2$", ha="center", fontsize=20)
plt.text(1,0.9,"$x_3$", ha="center", fontsize=20)
plt.axis([-4.5,4.5,-0.1,1.1])
  
# 绘制将原始数据进行升维操作后的新数据分布情况
plt.subplot(122)
plt.grid(True,which='both')
plt.axhline(y=0,color='k')
plt.axvline(x=0,color='k')
plt.plot(XK[:,0][yk==0],XK[:,1][yk==0],"bs")
plt.plot(XK[:,0][yk==1],XK[:,1][yk==1],"g^")
plt.xlabel(r"$x_2$", fontsize=20)
plt.ylabel(r"$x_3$", fontsize=20,rotation=0)
plt.annotate(r'$\phi\left(\mathbf {x} \right)$',xy=(XK[3,0],XK[3,1]),
            xytext=(0.65,0.50),
            ha="center",
            arrowprops=dict(facecolor='black', shrink=0.1),
             fontsize=18,
            )
# 根据图像可大致绘制一条分界线
plt.plot([-0.1,1.1],[0.9,0.2],"r--",linewidth=3)
plt.axis([-0.1,1.1,-0.1,1.1])
plt.subplots_adjust(right=1)
plt.show()

在这里插入图片描述

实际上,当 γ \gamma γ 值减小时,高斯分布会变得“矮胖”,其涵盖的数据范围将大大增加(也就是说会更“公平地”对待每一条数据)。此时,过拟合风险会大大降低。换言之,当 γ \gamma γ 值取得较大时,模型的过拟合风险会增加。

六、对比试验: 𝛾 和 C 值对 SVM 的影响。

from sklearn.svm import SVC

gamma1,gamma2 = 0.1,5
C1,C2 = 0.001,1000
hyperparams = (gamma1,C1),(gamma1,C2),(gamma2,C1),(gamma2,C2)

svm_clfs =[]
for gamma,C in hyperparams:
    rbf_kernel_svm_clf = Pipeline([
        ("scaler", StandardScaler()),
        ("svm_clf", SVC(kernel="rbf", gamma=gamma,C=C))
    ])
    rbf_kernel_svm_clf.fit(X, y)
    svm_clfs.append(rbf_kernel_svm_clf)
    
plt.figure(figsize=(11,7))
    
for i,svm_clf in enumerate(svm_clfs):
    plt.subplot(221 + i)
    plot_predictions(svm_clf,[-1.5,2.5,-1,1.5])
    plot_dataset(X, y,[-1.5,2.5,-1,1.5])
    gamma,C = hyperparams[i]
    plt.title(r"$\gamma = {}, C = {}$".format(gamma,C),fontsize=16)

plt.show()

在这里插入图片描述

从上图可以做出如下总结:

  • 由于增加 γ \gamma γ 会使地高斯函数变窄,因此这将降低其对数据集中各实例的影响范围,从而使得最终的决策边界变得更不规则(仅在个别实例周围摆动)。
  • 增大 C 值,模型的拟合效果会提升,但过拟合风险也会增高。

END


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

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

相关文章

MySQL的索引原理

文章目录 什么是索引?索引的工作原理创建和管理索引索引类型最佳实践总结 🎉欢迎来到数据结构学习专栏~MySQL的索引原理 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒🍹✨博客主页:IT陈寒的博客🎈该系列文章专栏:数据结…

MyBatis篇---第五篇

系列文章目录 文章目录 系列文章目录一、MyBatis 中见过什么设计模式?二、MyBatis 中比如 UserMapper.java 是接口,为什么没有实现类还能调用? 一、MyBatis 中见过什么设计模式? 二、MyBatis 中比如 UserMapper.java 是接口&#…

在10.24这个特殊的日子里,带你详细解读1024!

目录 1.前言 2.重识1024 3.庆祝1024 致谢 1.前言 作为一名程序员,我想大家对于1024这个数字并不陌生。因为 1024 是 2 的 10 次方,与计算机科学紧密相关,所以 10 月 24 日也被称为“程序员节”,这是一个属于每一个程序员…

黔院长 | 邀您一同共筑养生健康项目!

黔院长,作为一家有百年技术传承并致力于打造大健康产业的企业,为更好的践行“为健康而生,助天下无疾”的初心和使命,更好的让健康事业造福百姓,让更多的人能够从这份事业当中获益,现面向全国火热招商&#…

【JAVA学习笔记】35 - 类变量

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/static_ 一、类变量的引出 有一群小孩在玩堆雪人,不时有新的小孩加入,请问如何直到现在共有多少人在玩,编写程序解决 package com.yin…

docker版本的Jenkins安装与更新技巧

因为jenkins/jenkins镜像默认带的jenkins版本比较低,导致安装完以后,很多插件因为版本问题无法安装。以下是最权威,最方便的安装教程。 1. 创建本地挂载目录 mkdir -p /mnt/dockerdata/jenkins/home/2. 修改挂载目录权限 chown -R 1000:10…

PaddleX场景实战:PP-TS在电压预测场景上的应用

时间序列是按照时间发生的先后顺序进行排列的数据点序列,简称时序。时间序列预测即运用历史的多维数据进行统计分析,推测出事物未来的发展趋势。时间序列预测是最常见的时序问题之一,在很多行业都有其应用,且通常时序预测效果对业…

js如何解决跨域问题?

🙂博主:锅盖哒 🙂文章核心:js如何解决跨域问题? 目录 前言:跨域问题的本质 详解:跨域问题的原因和限制 跨域问题的限制包括: 用法:解决跨域问题的方法 1. JSONP(J…

(完全解决)如何输入一个图的邻接矩阵(每两个点的亲密度矩阵affinity),然后使用sklearn进行谱聚类

文章目录 背景输入点直接输入邻接矩阵 背景 网上倒是有一些关于使用sklearn进行谱聚类的教程,但是这些教程的输入都是一些点的集合,然后根据谱聚类的原理,其会每两个点计算一次亲密度(可以认为两个点距离越大,亲密度越…

程序员节1024

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

期 货 分 仓,资 管 分 仓,跟单软件都有哪些特点?

期货分仓软件是一种用于期货交易的软件系统。通过该系统,机构可以在一个主账户中同时使用多个子账户操作多个期货合约,并且可以设置不同资金量的用户不同的开仓比例。 由于目前国内的期货市场对于国际市场的品种还处于不规范阶段:一方面是保证…

怎么去除视频水印?

当今社交媒体环境中,许多用户面临着怎么去除视频水印的挑战尤其是短视频领域的从业者,这些水印不仅影响了视频的美观度也限制了素材的流动性,为了解决这一问题许多人开始积极寻找有效的方法来去除水印,以便更灵活地使用视频内容&a…

经典卷积神经网络 - AlexNet

AlexNet是由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton在2012年ImageNet图像分类竞赛中提出的一种经典的卷积神经网络。当时,AlexNet在 ImageNet 大规模视觉识别竞赛中取得了优异的成绩,把深度学习模型在比赛中的正确率提升到一个前所未有的高度…

基于springboot实现广场舞团平台系统项目【项目源码+论文说明】计算机毕业设计

基于SPRINGBOOT实现广场舞团平台系统演示 摘要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生&am…

38.红黑树(王道第7章查找补充知识)

目录 一. 红黑树的定义 二. 红黑树的性质 三. 红黑树的插入 四. 红黑树的删除(略) 一. 红黑树的定义 红黑树是二叉排序树-左子树结点值≤根结点值≤右子树结点值。 与普通BST相比,有以下要求: ①每个结点或是红色,或是黑色的②根节点是…

探索C++赋值运算符重载的内部机制:手把手教你精通

W...Y的主页 😊 代码仓库分享💕 🍔前言: 前一篇博客中我们已经了解并学习了初始化和清理模块中的构造函数与析构函数,还有拷贝复制中的拷贝复制函数,它们都是类与对象中重要的成员,今天我们要…

构建实时视频聊天应用:使用WebRTC和Netty的完整指南

构建实时视频聊天应用:使用WebRTC和Netty的完整指南 使用WebRTC和Netty构建实时视频聊天应用准备工作步骤1:创建Netty服务器步骤2:创建WebRTC前端应用步骤3:处理WebRTC连接步骤4:处理Netty服务器端步骤5:运…

光流法动目标检测

目录 前言 一、效果展示 二、光流法介绍 三、代码展示 总结 前言 动目标检测是计算机视觉领域的一个热门研究方向。传统的方法主要基于背景建模,但这些方法对于光照变化、遮挡和噪声敏感。因此,研究人员一直在寻找更加鲁棒和有效的技术来解决这一问题。…

如何性能测试中进行业务验证?

在性能测试过程中,验证HTTP code和响应业务code码是比较基础的,但是在一些业务中,这些参数并不能保证接口正常响应了,很可能返回了错误信息,所以这个时候对接口进行业务验证就尤其重要。下面分享一个对某个资源进行业务…

CentOS 7设置固定IP地址

当我们安装了一个虚拟机或者装了一个系统的时候,经常会遇到需要设置固定ip的情况,本文就以Centos 7为例,讲述如何修改固定IP地址。 1、用ifconfig命令查看使用的网卡 如上图所示,我们就会看到我们目前使用的网卡名称 2、编辑网卡…