当前位置: 首页 > news >正文

算法基础知识——核函数

简介:个人学习分享,如有错误,欢迎批评指正

核函数(Kernel Function)是机器学习中一种重要的工具,特别是在支持向量机(SVM)、核岭回归、核主成分分析(KPCA)等核方法中被广泛应用。核函数的核心思想是将输入数据从原始的低维空间映射到一个高维空间,使得在高维空间中可以更容易地进行线性分割或其他线性操作。这种方法避免了直接计算高维空间中数据的坐标,从而减少了计算复杂度。以下是对核函数的详细介绍:
在这里插入图片描述

一、核函数的定义

核函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj) 是一个函数,用来度量输入空间中两个数据点 x i x_i xi x j x_j xj 之间的相似性。它通过计算这两个数据点在某个特征空间中的内积来实现这一点。形式上,核函数可以表示为:

K ( x i , x j ) = ⟨ ϕ ( x i ) , ϕ ( x j ) ⟩ K(x_i, x_j) = \langle \phi(x_i), \phi(x_j) \rangle K(xi,xj)=ϕ(xi),ϕ(xj)⟩

其中:

  • x i x_i xi x j x_j xj 是输入空间中的数据点。
  • ϕ ( x ) \phi(x) ϕ(x) 是将数据点从原始空间映射到特征空间的映射函数。
  • ⟨ ⋅ , ⋅ ⟩ \langle \cdot, \cdot \rangle , 表示在特征空间中的内积。

通过核函数,计算机可以在不显式计算 ϕ ( x ) \phi(x) ϕ(x) 的情况下直接计算高维空间中映射后数据点的内积,这就是所谓的“核技巧”(Kernel Trick)。

二、核技巧(Kernel Trick)

核技巧(Kernel Trick)是机器学习中一种重要的方法,特别是在支持向量机(SVM)等核方法中被广泛应用。核技巧的核心思想是利用核函数在不显式计算高维映射的情况下,直接在低维空间中计算出高维空间中的内积。这一技巧使得算法能够处理非线性数据,从而在高维空间中实现线性分类或回归。

1. 核技巧的基本概念

在许多机器学习问题中,数据在原始空间中可能是非线性分布的,这使得简单的线性分类器无法很好地分割数据。例如,在二维空间中,数据点可能呈现弯曲的形状,无法通过一条直线将两类数据点分开。

核技巧通过将数据从低维空间映射到高维空间,使得在高维空间中这些数据点可能是线性可分的。具体而言,核技巧不需要显式地计算数据从低维到高维的映射函数 ϕ ( x ) \phi(x) ϕ(x),而是通过定义一个合适的核函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj),直接计算数据点在高维空间中映射后的内积:

K ( x i , x j ) = ⟨ ϕ ( x i ) , ϕ ( x j ) ⟩ K(x_i, x_j) = \langle \phi(x_i), \phi(x_j) \rangle K(xi,xj)=ϕ(xi),ϕ(xj)⟩

这样,原本在低维空间中非线性分布的数据,可以通过核技巧在高维空间中实现线性分割。

2. 核技巧的工作原理

为了理解核技巧的工作原理,我们可以考虑以下步骤:

  1. 非线性映射:假设我们有一个映射函数 ϕ ( x ) \phi(x) ϕ(x),它将数据点从低维空间(例如二维空间)映射到高维空间(例如三维空间)。在高维空间中,原本的非线性问题可能变为线性问题。

  2. 内积计算:在高维空间中,我们通常需要计算数据点之间的内积来构建分类器或进行回归分析。通过核函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj),我们可以直接计算高维空间中映射后的内积,而无需显式地计算每个数据点的高维坐标。

  3. 应用核技巧:通过核技巧,我们可以在低维空间中进行计算,但实际上是在高维空间中实现了内积计算。这使得我们可以利用线性算法(如线性分类器)来解决非线性问题。

3. 核技巧的举例说明

例子:二维空间到三维空间的映射

假设我们有一组二维数据点 ( x 1 , x 2 ) (x_1, x_2) (x1,x2),这些数据点不能通过一条直线分开。我们可以通过核技巧将这些数据点映射到三维空间,在这个三维空间中,数据点可能是线性可分的。

非线性映射:

考虑一个映射函数:

ϕ ( x 1 , x 2 ) = ( x 1 2 , 2 x 1 x 2 , x 2 2 ) \phi(x_1, x_2) = (x_1^2, \sqrt{2}x_1x_2, x_2^2) ϕ(x1,x2)=(x12,2 x1x2,x22)

这里, ( x 1 , x 2 ) (x_1, x_2) (x1,x2) 是二维空间中的一个点,映射后,它变成了三维空间中的一个点 ( x 1 2 , 2 x 1 x 2 , x 2 2 ) (x_1^2, \sqrt{2}x_1x_2, x_2^2) (x12,2 x1x2,x22)

内积计算:

在三维空间中,两个映射后的点之间的内积为:

⟨ ϕ ( x ) , ϕ ( y ) ⟩ = x 1 2 y 1 2 + 2 x 1 x 2 y 1 y 2 + x 2 2 y 2 2 \langle \phi(x), \phi(y) \rangle = x_1^2y_1^2 + 2x_1x_2y_1y_2 + x_2^2y_2^2 ϕ(x),ϕ(y)⟩=x12y12+2x1x2y1y2+x22y22

如果我们直接在二维空间中计算这个内积,需要对每个数据点进行三维映射,并计算高维空间中的内积。这显然是非常繁琐的。

应用核技巧:

通过选择一个合适的核函数,我们可以在二维空间中直接计算这个内积,而不需要显式地进行三维映射。例如,选择多项式核函数:

K ( x , y ) = ( x 1 y 1 + x 2 y 2 ) 2 K(x, y) = (x_1y_1 + x_2y_2)^2 K(x,y)=(x1y1+x2y2)2

展开后可以发现,这个核函数等价于在三维空间中计算映射后的内积:

K ( x , y ) = ⟨ ϕ ( x ) , ϕ ( y ) ⟩ K(x, y) = \langle \phi(x), \phi(y) \rangle K(x,y)=ϕ(x),ϕ(y)⟩

总结:

通过核函数 K ( x , y ) K(x, y) K(x,y),我们在二维空间中直接计算出在三维空间中的内积,而无需显式地进行复杂的三维映射操作。这就是核技巧的核心优势:通过巧妙的核函数设计,在低维空间中高效地完成高维空间中的计算任务

三、核函数的性质

核函数的性质在机器学习中尤为重要,因为它决定了我们能否使用某一函数作为核函数,并影响了算法的稳定性和表现。以下是对核函数性质的详细介绍:

1. 对称性 (Symmetry)

核函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj) 是对称的,即:

K ( x i , x j ) = K ( x j , x i ) K(x_i, x_j) = K(x_j, x_i) K(xi,xj)=K(xj,xi)

对称性意味着,对于任意两个数据点 x i x_i xi x j x_j xj核函数的输出值不依赖于数据点的顺序。这是核函数的一个基本性质,因为它反映了相似性或内积的对称性。

2. 正定性 (Positive Definiteness)

核函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj) 对于任意非零函数 g ( x ) g(x) g(x) 必须满足以下条件:

∑ i = 1 n ∑ j = 1 n g ( x i ) g ( x j ) K ( x i , x j ) ≥ 0 \sum_{i=1}^{n}\sum_{j=1}^{n}g(x_i)g(x_j)K(x_i, x_j) \geq 0 i=1nj=1ng(xi)g(xj)K(xi,xj)0

换句话说,对于任意非零的实数序列 { c 1 , c 2 , ⋯ , c n } \{c_1, c_2, \cdots, c_n\} {c1,c2,,cn},核矩阵 K K K 满足:

∑ i = 1 n ∑ j = 1 n c i c j K ( x i , x j ) ≥ 0 \sum_{i=1}^{n}\sum_{j=1}^{n}c_ic_jK(x_i, x_j) \geq 0 i=1nj=1ncicjK(xi,xj)0

正定性确保了核矩阵 $K$ 是半正定的,即它的所有特征值非负。这一点非常重要,因为在许多核方法(如支持向量机、核岭回归)中,正定核函数可以确保优化问题有唯一解,并且算法的数学性质(如收敛性)得以保证

3. Mercer 定理

Mercer 定理是核函数理论的核心定理之一。它表明,一个对称函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj) 是一个有效的核函数(即正定核),当且仅当它对应的核矩阵是半正定的。具体来说,Mercer 定理给出了一个条件,使得核函数能够被用于支持向量机等机器学习算法中。

Mercer 定理的内容:

对于任何对称函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj),它是一个有效的核函数,当且仅当对于任意函数 g ( x ) g(x) g(x),以下条件成立:

∬ g ( x ) K ( x , y ) g ( y ) d x d y ≥ 0 \iint g(x)K(x,y)g(y) \,dx\,dy \geq 0 g(x)K(x,y)g(y)dxdy0

这意味着 K ( x i , x j ) K(x_i, x_j) K(xi,xj) 必须是一个正定核函数,才能确保对应的核矩阵是半正定的,从而可以被用作核方法中的核函数。

4. 闭合性 (Closure Properties)

核函数具有闭合性,即若 K 1 ( x i , x j ) K_1(x_i, x_j) K1(xi,xj) K 2 ( x i , x j ) K_2(x_i, x_j) K2(xi,xj) 是两个有效的核函数,则以下几种操作后所生成的函数仍然是有效的核函数:

  1. 加法: K ( x i , x j ) = K 1 ( x i , x j ) + K 2 ( x i , x j ) K(x_i, x_j) = K_1(x_i, x_j) + K_2(x_i, x_j) K(xi,xj)=K1(xi,xj)+K2(xi,xj)
  2. 乘法: K ( x i , x j ) = K 1 ( x i , x j ) ⋅ K 2 ( x i , x j ) K(x_i, x_j) = K_1(x_i, x_j) \cdot K_2(x_i, x_j) K(xi,xj)=K1(xi,xj)K2(xi,xj)
  3. 常数乘法: K ( x i , x j ) = c ⋅ K 1 ( x i , x j ) K(x_i, x_j) = c \cdot K_1(x_i, x_j) K(xi,xj)=cK1(xi,xj),其中 c ≥ 0 c \geq 0 c0
  4. 核函数的和: K ( x i , x j ) = ∑ k K k ( x i , x j ) K(x_i, x_j) = \sum_k K_k(x_i, x_j) K(xi,xj)=kKk(xi,xj)
  5. 核函数的积: 对于一个参数化核函数 K ( x i , x j ; θ ) K(x_i, x_j; \theta) K(xi,xj;θ),核函数 K ( x i , x j ) = ∫ f ( K ( x i , x j ; θ ) ) d θ K(x_i, x_j) = \int f(K(x_i, x_j; \theta)) d\theta K(xi,xj)=f(K(xi,xj;θ))dθ 仍然是有效的。

这些闭合性使得我们可以将简单的核函数来构建复杂的核函数,增强模型的灵活性和适用性。

5. 核函数的平滑性 (Smoothness)

核函数通常具有较好的平滑性,即输入点的微小变化不会导致输出的急剧变化。例如,高斯核函数(RBF核函数)是一种常见的平滑核函数,表达式为:

K ( x i , x j ) = exp ⁡ ( − γ ∥ x i − x j ∥ 2 ) K(x_i, x_j) = \exp(-\gamma \|x_i - x_j\|^2) K(xi,xj)=exp(γxixj2)

这里的 γ \gamma γ 参数控制核函数的平滑度。较大的 γ \gamma γ 值使得核函数的变化更快,较小的 γ \gamma γ 值则使核函数的变化更缓慢。 这种平滑性有助于防止模型过拟合,并提高模型的泛化能力。

6. 局部性 (Locality)

某些核函数,例如径向基函数(RBF核),具有局部性。局部性意味着核函数的值主要由数据点之间的距离决定,当两个数据点的距离较近时,核函数的值较大;当距离较远时,核函数的值迅速衰减为零

这种性质使得核函数在处理具有局部结构的数据时非常有效。例如,在图像处理或文本分类等任务中,局部结构非常重要,因此局部性核函数可以捕捉到数据中的局部模式。

7. 尺度不变性 (Scale Invariance)

某些核函数具有尺度不变性,例如线性核函数和多项式核函数。尺度不变性指的是核函数的值不随输入向量的尺度变化而改变。这在处理不同尺度的数据或特征时非常有用。

例如,对于线性核函数 K ( x i , x j ) = x i ⋅ x j K(x_i, x_j) = x_i \cdot x_j K(xi,xj)=xixj,无论输入向量 x i x_i xi x j x_j xj 如何缩放,内积的比例始终保持不变。

四、常见的核函数类型

1.线性核函数(Linear Kernel)

a.定义:
线性核函数是一种直接计算输入向量之间内积的核函数。在支持向量机(SVM)和其他线性分类问题中,线性核函数常用于度量样本之间的相似性。
线性核函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj) 的值等于两个输入向量 x i x_i xi x j x_j xj 的内积。

b.公式

线性核函数的数学公式如下:

K ( x i , x j ) = x i ⋅ x j = ∑ k = 1 K x i k ⋅ x j k K(x_i, x_j) = x_i \cdot x_j = \sum_{k=1}^{K} x_{ik} \cdot x_{jk} K(xi,xj)=xixj=k=1Kxikxjk

其中:

  • x i x_i xi x j x_j xj 是输入空间中的两个 n n n 维向量。
  • x i k x_{ik} xik x j k x_{jk} xjk 分别表示 x i x_i xi x j x_j xj 的第 k k k 个分量。

c.python代码
不调包

# 定义线性核函数,不使用任何外部库
def linear_kernel_no_lib(x1, x2):result = 0for i in range(len(x1)):result += x1[i] * x2[i]return result# 示例数据
x_i = [1, 2, 3]
x_j = [4, 5, 6]# 计算线性核函数值
kernel_value_no_lib = linear_kernel_no_lib(x_i, x_j)
print("Linear Kernel Value (without numpy):", kernel_value_no_lib)

调包

import numpy as np# 定义线性核函数
def linear_kernel(x1, x2):return np.dot(x1, x2)# 示例数据
x_i = np.array([1, 2, 3])
x_j = np.array([4, 5, 6])# 计算线性核函数值
kernel_value = linear_kernel(x_i, x_j)
print("Linear Kernel Value (with numpy):", kernel_value)

d.优缺点
优点:

  1. 计算简单:线性核函数的计算只涉及向量的内积,计算复杂度低,尤其适合大规模数据集。
  2. 无超参数:线性核函数不需要调节任何超参数,这使得它在实际应用中易于使用,减少了调参的复杂性。
  3. 模型可解释性强:使用线性核函数训练的模型在原始特征空间中操作,因此模型的输出与输入特征之间的关系是直接可解释的。
  4. 适合高维数据:在线性核函数下,特征空间维度越高,模型的表现通常越好,因此它在处理高维数据(如文本分类)时表现出色。

缺点:

  1. 无法处理非线性问题:线性核函数只能处理线性可分的数据,对于复杂的非线性分布,它的表现通常不佳。
  2. 模型能力有限:由于线性核函数的简单性,它可能无法捕捉到输入数据中的复杂关系,导致模型性能有限。在非线性数据上,它可能需要更多特征才能实现良好的分类。
  3. 不适用于低维复杂数据:在线性不可分的数据集中,线性核函数可能无法找到合适的分类边界,这时需要更复杂的核函数(如RBF核函数)来捕捉数据的非线性结构。

2.多项式核函数(Polynomial Kernel)

a.定义:
多项式核函数是一种将输入向量映射到高维空间的核函数,它可以捕捉到输入数据中的非线性关系。与线性核函数不同,多项式核函数通过对输入向量的各个分量进行多项式组合,形成更复杂的特征表达,从而能够更好地处理非线性可分的数据。

多项式核函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj) 是通过计算输入向量的内积并将其结果提升到一个指定的次幂,同时可以加上一个常数项来控制模型的复杂度。

b.公式

多项式核函数的数学公式如下:

K ( x i , x j ) = ( γ ⋅ x i ⋅ x j + c ) d K(x_i, x_j) = (\gamma \cdot x_i \cdot x_j + c)^d K(xi,xj)=(γxixj+c)d

其中:

  • x i x_i xi x j x_j xj 是输入空间中的两个向量。
  • γ \gamma γ 是可调的超参数,用来缩放向量的内积值(通常取 γ = 1 \gamma = 1 γ=1)。
  • c c c 是常数项,用来控制模型的复杂度,避免模型过于复杂(过拟合)。
  • d d d 是多项式的阶数,决定了模型的非线性程度。

c.python代码
不调包

# 定义多项式核函数,不使用任何外部库
def polynomial_kernel_no_lib(x1, x2, degree=3, gamma=1, coef0=1):dot_product = 0for i in range(len(x1)):dot_product += x1[i] * x2[i]return (gamma * dot_product + coef0) ** degree# 示例数据
x_i = [1, 2, 3]
x_j = [4, 5, 6]# 计算多项式核函数值
kernel_value_no_lib = polynomial_kernel_no_lib(x_i, x_j, degree=3, gamma=1, coef0=1)
print("Polynomial Kernel Value (without numpy):", kernel_value_no_lib)

调包

import numpy as np# 定义多项式核函数
def polynomial_kernel(x1, x2, degree=3, gamma=1, coef0=1):return (gamma * np.dot(x1, x2) + coef0) ** degree# 示例数据
x_i = np.array([1, 2, 3])
x_j = np.array([4, 5, 6])# 计算多项式核函数值
kernel_value = polynomial_kernel(x_i, x_j, degree=3, gamma=1, coef0=1)
print("Polynomial Kernel Value (with numpy):", kernel_value)

d.优缺点
优点:

  1. 能够处理非线性数据:多项式核函数通过将数据映射到高维空间,使得在原始空间中非线性可分的数据在高维空间中变得线性可分。
  2. 可调节复杂度:通过调整多项式的阶数 d d d 和常数项 c c c,可以控制模型的复杂度,从而适应不同数据集的特性。
  3. 适用于不同类型的数据:多项式核函数适合用于特征之间存在非线性关系的数据集,如图像分类、文本分类等任务。

缺点:

  1. 计算复杂度较高:随着多项式阶数的增加,计算量显著增大,尤其是在处理高维数据时,计算复杂度可能会成为一个瓶颈。
  2. 容易过拟合:如果选择的多项式阶数过高,模型可能会过拟合训练数据,从而在测试集上的表现不佳。
  3. 参数调节复杂:多项式核函数引入了多个超参数,如 γ \gamma γ c c c d d d,这些参数的选择对模型性能有重要影响, 需要通过交叉验证等方法来确定最佳参数组合。

3.径向基函数核(RBF核函数)

a.定义:
径向基函数核(Radial Basis Function Kernel,简称 RBF 核)是机器学习中一种常用的核函数,它通过计算输入样本之间的欧氏距离,来衡量样本之间的相似度。RBF 核是一种高斯核函数,能够将输入数据映射到一个无限维的特征空间,从而捕捉到数据的复杂非线性关系。
径向基函数核 K ( x i , x j ) K(x_i, x_j) K(xi,xj) 的值依赖于两个输入向量 x i x_i xi x j x_j xj 之间的欧氏距离,其值随距离的增大而减少。

b.公式

径向基函数核的数学公式如下:

K ( x i , x j ) = exp ⁡ ( − γ ∥ x i − x j ∥ 2 ) K(x_i, x_j) = \exp(-\gamma \|x_i - x_j\|^2) K(xi,xj)=exp(γxixj2)

其中:

  • x i x_i xi x j x_j xj 是输入空间中的两个向量。
  • ∥ x i − x j ∥ 2 \|x_i - x_j\|^2 xixj2 是两个向量之间的欧氏距离的平方。
  • γ \gamma γ 是一个超参数,控制核函数的宽度,通常 γ > 0 \gamma > 0 γ>0;较大的 γ \gamma γ 值对应较小的影响范围,较小的 γ \gamma γ 值对应较大的影响范围。

c.python代码
不调包

import math# 定义径向基函数核,不使用任何外部库
def rbf_kernel_no_lib(x1, x2, gamma=0.1):distance_squared = 0for i in range(len(x1)):distance_squared += (x1[i] - x2[i]) ** 2return math.exp(-gamma * distance_squared)# 示例数据
x_i = [1, 2, 3]
x_j = [4, 5, 6]# 计算径向基函数核值
kernel_value_no_lib = rbf_kernel_no_lib(x_i, x_j, gamma=0.1)
print("RBF Kernel Value (without numpy):", kernel_value_no_lib)

调包

import numpy as np# 定义径向基函数核
def rbf_kernel(x1, x2, gamma=0.1):distance_squared = np.sum((x1 - x2) ** 2)return np.exp(-gamma * distance_squared)# 示例数据
x_i = np.array([1, 2, 3])
x_j = np.array([4, 5, 6])# 计算径向基函数核值
kernel_value = rbf_kernel(x_i, x_j, gamma=0.1)
print("RBF Kernel Value (with numpy):", kernel_value)

d.优缺点
优点:

  1. 处理非线性数据能力强:RBF 核能够将数据映射到一个无限维的特征空间,捕捉复杂的非线性关系,非常适合处理非线性可分的数据集。
  2. 适用范围广:RBF 核函数可以应用于各种类型的数据,不需要对数据进行太多的假设,因此在许多实际应用中表现良好。
  3. 参数较少:与多项式核相比,RBF 核的参数较少,主要通过调节 γ \gamma γ 来控制模型的复杂度。

缺点:

  1. 参数调节复杂:虽然参数较少,但 γ \gamma γ 的选择对模型的性能有很大影响,通常需要通过交叉验证等方法来确定最优的 γ \gamma γ 值。
  2. 计算复杂度较高:RBF 核涉及到指数运算,计算复杂度相对较高,尤其是在大规模数据集上,计算时间可能会显著增加。
  3. 容易过拟合:如果 γ \gamma γ 选择不当,RBF 核可能会导致模型过拟合,尤其是在数据集较小或噪声较大的情况下。

4.Sigmoid核函数

a.定义:

Sigmoid核函数,也称为双曲正切核函数(Tanh Kernel),在神经网络中具有重要意义。它模拟了神经元的激活函数,通过对输入向量进行非线性变换,将其映射到一个新的特征空间中。虽然在支持向量机(SVM)中较少使用,但Sigmoid核函数仍然适用于一些特定的分类问题。
Sigmoid核函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj) 是通过计算两个输入向量的内积后,应用一个双曲正切函数或逻辑函数来生成相似性度量。
b.公式

Sigmoid核函数的数学公式如下:

K ( x i , x j ) = tanh ⁡ ( α ⋅ x i ⋅ x j + c ) K(x_i, x_j) = \tanh(\alpha \cdot x_i \cdot x_j + c) K(xi,xj)=tanh(αxixj+c)

其中:

  • x i x_i xi x j x_j xj 是输入空间中的两个向量。
  • α \alpha α 是一个可调的缩放参数,控制输入向量内积的缩放。
  • c c c 是一个偏置项,调整核函数的输出范围和非线性程度。
  • tanh ⁡ ( ⋅ ) \tanh(\cdot) tanh() 是双曲正切函数,定义为 tanh ⁡ ( z ) = exp ⁡ ( z ) − exp ⁡ ( − z ) exp ⁡ ( z ) + exp ⁡ ( − z ) \tanh(z) = \frac{\exp(z) - \exp(-z)}{\exp(z) + \exp(-z)} tanh(z)=exp(z)+exp(z)exp(z)exp(z)

c.python代码
不调包

import math# 定义Sigmoid核函数,不使用任何外部库
def sigmoid_kernel_no_lib(x1, x2, alpha=0.1, coef0=0):dot_product = 0for i in range(len(x1)):dot_product += x1[i] * x2[i]return math.tanh(alpha * dot_product + coef0)# 示例数据
x_i = [1, 2, 3]
x_j = [4, 5, 6]# 计算Sigmoid核函数值
kernel_value_no_lib = sigmoid_kernel_no_lib(x_i, x_j, alpha=0.1, coef0=0)
print("Sigmoid Kernel Value (without numpy):", kernel_value_no_lib)

调包

import numpy as np# 定义Sigmoid核函数
def sigmoid_kernel(x1, x2, alpha=0.1, coef0=0):return np.tanh(alpha * np.dot(x1, x2) + coef0)# 示例数据
x_i = np.array([1, 2, 3])
x_j = np.array([4, 5, 6])# 计算Sigmoid核函数值
kernel_value = sigmoid_kernel(x_i, x_j, alpha=0.1, coef0=0)
print("Sigmoid Kernel Value (with numpy):", kernel_value)

d.优缺点
优点:

  1. 神经网络的物理意义:Sigmoid核函数在神经网络中具有重要意义,其形式类似于神经元的激活函数(如 sigmoid 或 tanh),因此在与神经网络相关的任务中可能具有特定优势。
  2. 非线性映射能力:与线性核函数相比,Sigmoid核函数可以将输入数据映射到非线性空间,使得原始数据在新空间中可能变得线性可分。
  3. 参数化灵活性:通过调整参数 α \alpha α c c c,可以控制核函数的非线性程度和输出范围,从而适应不同类型的任务。

缺点:

  1. 不满足Mercer定理:在某些情况下,Sigmoid核函数不满足Mercer定理,这意味着对应的核矩阵可能不是半正定的,从而可能导致SVM算法的不稳定性或不可用性。
  2. 过拟合的风险:由于Sigmoid核函数容易在参数选择不当时表现出高度非线性,它可能在一些数据集上导致过拟合。
  3. 参数调节困难:与其他核函数(如RBF核函数)相比,Sigmoid核函数的两个参数 α \alpha α c c c 对模型性能的影响较大, 需要仔细调节方能获得最佳结果。

5.拉普拉斯核函数(Laplacian Kernel)

a.定义:
拉普拉斯核函数(Laplacian Kernel)是径向基函数(RBF)核的一个变种,它同样基于输入向量之间的距离来计算相似性。与 RBF 核不同,拉普拉斯核函数使用的是 L1 距离(曼哈顿距离)而不是 L2 距离(欧氏距离)。这种核函数适用于具有尖锐边界或对离群点敏感的数据集。
拉普拉斯核函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj) 是通过计算输入向量之间的 L1 距离,并将其通过指数函数进行非线性变换来衡量样本间的相似性。

b.公式

拉普拉斯核函数的数学公式如下:

K ( x i , x j ) = exp ⁡ ( − γ ∥ x i − x j ∥ 1 ) K(x_i, x_j) = \exp\left(-\gamma \|x_i - x_j\|_1\right) K(xi,xj)=exp(γxixj1)

其中:

  • x i x_i xi x j x_j xj 是输入空间中的两个向量。
  • ∥ x i − x j ∥ 1 \|x_i - x_j\|_1 xixj1 是两个向量之间的 L1 距离,即曼哈顿距离,计算方式为 ∥ x i − x j ∥ 1 = ∣ x i 1 − x j 1 ∣ + ∣ x i 2 − x j 2 ∣ + ⋯ + ∣ x i n − x j n ∣ \|x_i - x_j\|_1 = |x_{i1} - x_{j1}| + |x_{i2} - x_{j2}| + \cdots + |x_{in} - x_{jn}| xixj1=xi1xj1+xi2xj2++xinxjn
  • γ \gamma γ 是一个超参数,控制核函数的宽度,决定相似度衰减的速度。

c.python代码
不调包

import math# 定义拉普拉斯核函数,不使用任何外部库
def laplacian_kernel_no_lib(x1, x2, gamma=0.1):l1_distance = 0for i in range(len(x1)):l1_distance += abs(x1[i] - x2[i])return math.exp(-gamma * l1_distance)# 示例数据
x_i = [1, 2, 3]
x_j = [4, 5, 6]# 计算拉普拉斯核函数值
kernel_value_no_lib = laplacian_kernel_no_lib(x_i, x_j, gamma=0.1)
print("Laplacian Kernel Value (without numpy):", kernel_value_no_lib)

调包

import numpy as np# 定义拉普拉斯核函数
def laplacian_kernel(x1, x2, gamma=0.1):l1_distance = np.sum(np.abs(x1 - x2))return np.exp(-gamma * l1_distance)# 示例数据
x_i = np.array([1, 2, 3])
x_j = np.array([4, 5, 6])# 计算拉普拉斯核函数值
kernel_value = laplacian_kernel(x_i, x_j, gamma=0.1)
print("Laplacian Kernel Value (with numpy):", kernel_value)

d.优缺点
优点:

  1. 对异常值敏感:由于使用 L1 距离,拉普拉斯核函数对异常值(离群点)更为敏感,适合处理包含离群点的数据集。

  2. 捕捉局部特征:与 RBF 核函数类似,拉普拉斯核函数可以捕捉到数据的局部特征,并在局部空间内进行非线性映射,适合处理具有局部模式的数据。

  3. 参数控制简单:拉普拉斯核函数只有一个超参数 γ \gamma γ,通过调节这个参数可以控制核函数的宽度和对相似度的影响范围。

缺点:

  1. 过拟合风险:在数据集较小或噪声较大的情况下,如果 γ \gamma γ 值选择不当,拉普拉斯核函数可能导致模型过拟合。

  2. 计算复杂度较高:虽然 L1 距离的计算相对简单,但在大规模数据集上,计算指数函数的开销可能较高。

  3. 不如 RBF 核广泛应用:由于 RBF 核使用的是 L2 距离,通常在大多数应用中表现更稳定,因此拉普拉斯核函数的使用范围相对较窄。

6.余弦相似度核函数(Cosine Similarity Kernel)

a.定义:
余弦相似度核函数(Cosine Similarity Kernel)是基于余弦相似度的一种核函数,它通过计算两个向量之间的夹角余弦值来衡量它们的相似度。余弦相似度特别适合用于文本分类、信息检索等领域,因为在这些场景中,数据通常是高维稀疏向量,余弦相似度能够有效地度量向量之间的相似性,而不受向量大小的影响。

余弦相似度核函数 K ( x i , x j ) K(x_i, x_j) K(xi,xj) 是通过计算输入向量之间的余弦相似度来确定它们的相似性,取值范围在 − 1 -1 1 1 1 1 之间,表示两个向量之间夹角的余弦值。

b.公式

余弦相似度核函数的数学公式如下:

K ( x i , x j ) = x i ⋅ x j ∥ x i ∥ ∥ x j ∥ K(x_i, x_j) = \frac{x_i \cdot x_j}{\|x_i\| \|x_j\|} K(xi,xj)=xi∥∥xjxixj

其中:

  • x i x_i xi x j x_j xj 是输入空间中的两个向量。
  • x i ⋅ x j x_i \cdot x_j xixj 是两个向量的点积。
  • ∥ x i ∥ \|x_i\| xi ∥ x j ∥ \|x_j\| xj 分别是向量 x i x_i xi x j x_j xj 的范数(即向量的长度)。

c.python代码
不调包

import math# 定义余弦相似度核函数,不使用任何外部库
def cosine_similarity_kernel_no_lib(x1, x2):dot_product = 0norm_x1 = 0norm_x2 = 0for i in range(len(x1)):dot_product += x1[i] * x2[i]norm_x1 += x1[i] ** 2norm_x2 += x2[i] ** 2norm_x1 = math.sqrt(norm_x1)norm_x2 = math.sqrt(norm_x2)return dot_product / (norm_x1 * norm_x2)# 示例数据
x_i = [1, 2, 3]
x_j = [4, 5, 6]# 计算余弦相似度核函数值
kernel_value_no_lib = cosine_similarity_kernel_no_lib(x_i, x_j)
print("Cosine Similarity Kernel Value (without numpy):", kernel_value_no_lib)

调包

import numpy as np# 定义余弦相似度核函数
def cosine_similarity_kernel(x1, x2):dot_product = np.dot(x1, x2)norm_x1 = np.linalg.norm(x1)norm_x2 = np.linalg.norm(x2)return dot_product / (norm_x1 * norm_x2)# 示例数据
x_i = np.array([1, 2, 3])
x_j = np.array([4, 5, 6])# 计算余弦相似度核函数值
kernel_value = cosine_similarity_kernel(x_i, x_j)
print("Cosine Similarity Kernel Value (with numpy):", kernel_value)

d.优缺点

优点:

  1. 适合高维稀疏数据:余弦相似度特别适合用于处理高维稀疏数据,如文本向量。在这些场景中,余弦相似度能够有效地衡量向量之间的相似性,而不受向量大小的影响。

  2. 方向性比较:余弦相似度关注的是向量的方向而非大小,因此在度量两个向量的相似性时,不会因向量的尺度不同而受到影响,这对于某些特定任务(如文本分类)非常重要。

  3. 简单易计算:余弦相似度的计算相对简单,无需复杂的参数调节,这使得它在许多应用中都非常实用。

缺点:
4. 不能处理零向量:如果输入向量中存在零向量(即所有分量都为零的向量),则余弦相似度无法计算,因为零向量的范数为零,会导致除零错误。

  1. 忽略向量大小:虽然余弦相似度专注于方向性比较,但在某些应用中,向量的大小也可能携带重要信息,忽略这一点可能会导致信息丢失。

  2. 不适用于非线性问题:余弦相似度核函数只能处理线性关系,对于更复杂的非线性问题,可能需要使用更复杂的核函数(如RBF核)来捕捉数据中的非线性模式。

五、总结###

优点

  1. 处理非线性问题:核函数可以将原始数据映射到一个高维空间,在这个空间中可以使用线性分类器对非线性问题进行分类。这使得SVM能够处理复杂的非线性问题。

  2. 高维空间操作高效:通过核技巧(Kernel Trick),可以避免直接计算高维空间的坐标,只需要计算原始空间中数据点之间的核函数值,这大大减少了计算的复杂度。

  3. 灵活性:不同的核函数(如线性核、多项式核、径向基核、sigmoid核等)适用于不同的数据分布和问题类型,具有较大的灵活性。

  4. 处理高维数据:核函数可以有效处理高维数据,甚至是维度远大于样本数的数据集。在文本分类等高维空间问题上表现尤为出色。

  5. 无需显式计算工程:使用核函数时,不需要显式地设计和构建复杂的特征工程,核函数隐含地执行了这一操作,从而减少了特征工程的难度。

缺点

  1. 参数选择困难:不同的核函数有不同的参数(如径向基核函数的参数γ),这些参数的选择对模型性能有很大的影响。然而,如何选择最优的核函数及其参数并不是直观的,通常需要依赖交叉验证或网格搜索。

  2. 计算开销大:虽然核技巧避免了直接计算高维空间的坐标,但对于大型数据集,核函数的计算和存储仍然是个挑战,尤其是在核矩阵是一个非常大的矩阵时,计算开销会显著增加。

  3. 易于过拟合:在高维特征空间中,如果使用不当的核函数或参数设置,模型可能会过拟合训练数据,导致泛化性能的下降。

  4. 难以解释:由于核函数将数据映射到了高维空间,模型的决策边界不再直观,核函数的解释性可能较差。在一些应用中,解释模型的决策是重要的,但使用核函数的模型往往较难被解释清楚。

  5. 对大规模数据集不友好:对于非常大规模的数据集,SVM本身训练时间长,加上核函数的复杂度,往往会导致训练时间较长。即使在一些训练时间较长的数据集中,线性核通常更为合适,且计算代价较小。

核函数在处理非线性问题方面表现优异,但同时也伴随着参数选择复杂、计算开销大等挑战。选择合适的核函数和参数对模型性能至关重要,通常需要特别注意这些方面。

参考文献:
核函数介绍

结~~~

相关文章:

算法基础知识——核函数

简介:个人学习分享,如有错误,欢迎批评指正 核函数(Kernel Function)是机器学习中一种重要的工具,特别是在支持向量机(SVM)、核岭回归、核主成分分析(KPCA)等核…...

安卓xml乱码/加密转换:abx2xml和xml2abx使用及源码介绍

背景: 上一篇文章 android系统中data下的xml乱码无法查看问题剖析及解决方法 发布后,想要寻找一个可以直接把二进制xml和普通xml进行相互转换的,当时还写了相关的方案,但是当时没有找到现成的开源工具,后来经过相关粉…...

slice 截取

JavaScript中的一个数组方法。然而,在Vue 3的应用开发中,slice 方法经常被用于处理数组数据,特别是在需要实现分页、数据截取或数据展示等场景时。 slice 方法的基本用法 slice() 方法返回一个新的数组对象,这一对象是一个由 be…...

XReparentWindow踩坑分析

X11是Linux发行系统中广泛采用的显示协议,各个系统基本上都支持XLib库,作为底层接口,XReparentWindow接口的功能就是重新设置父窗口,注意这个可以跨进程设置父窗口,例如将已经运行的进程的父窗口设置自己的程序Wid&…...

OpenAI动荡,将走向何方、GPT5或许将近、毒舌AI轻松破防网友、最新版 GPT-4o AI 模型得满分 | AGI视界周刊第 4 期

AI 视界周刊由战场小包维护,每周一更新,包含热点聚焦、应用破局、学术前沿、社区热议、智见交锋、跨界 AI、企业动态和争议 AI 八大板块,后续板块划分和内容撰写在周刊迭代过程中持续优化,欢迎大家提出建议。 欢迎大家来到《AI 视…...

RCE---无字母数字webshell

<?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); } 分析代码&#xff1a;传参不大于35&…...

有意思的漏洞复现与分析一

目录 一、Linux命令长度限制突破方法 1.在二进制漏洞利用中&#xff0c;某师傅遇到可控数据只有8字节的情况&#xff0c;去掉字符 串尾的\0&#xff0c;限制在7个字符。 一、Linux命令长度限制突破方法 1.在二进制漏洞利用中&#xff0c;某师傅遇到可控数据只有8字节的情况&a…...

力扣题解(按身高排序)

2418. 按身高排序 给你一个字符串数组 names &#xff0c;和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i&#xff0c;names[i] 和 heights[i] 表示第 i 个人的名字和身高。 请按身高 降序 顺序返回对应的名字数组 names 。 思路&…...

Redis的六种淘汰策略详解

Redis作为一种高性能的键值对存储系统&#xff0c;其数据全部存储在内存中&#xff0c;因此内存管理对Redis的性能至关重要。当Redis的内存使用达到上限时&#xff0c;就需要通过淘汰策略来释放内存空间&#xff0c;以便存储新的数据。Redis提供了六种不同的淘汰策略&#xff0…...

vue3中 ref 和 reactive 的区别

相同&#xff1a;均是声明响应式对象。且声明的响应式对象是深层的 1. 数据类型不同&#xff1a;ref用于包装JavaScript基本类型的数据&#xff08;如字符串、数字、布尔值等&#xff09;&#xff0c;而reactive可以用于包装JavaScript对象和数组等复杂类型的数据。 2.访问方式…...

《单例模式的深度解读:实现方式、破坏情况与利弊权衡》

单例模式 一、单例模式的定义 ​ 单例模式&#xff08;Singleton Pattern&#xff09;是一种常见的软件设计模式&#xff0c;确保一个类只有一个实例存在&#xff0c;并提供一个全局访问点来获取该实例。 二、单例模式的实现方式 ​ 1.懒汉式单例 public class LazySingle…...

010607电压源和电流源受控源

电源的理论部分 1.6电压源和电流源1.理想电压源&#xff1a; 1.6电压源和电流源 1.理想电压源&#xff1a; 其两端电压总能保持定值或一定的时间函数&#xff0c;其值与流过它的电流i无关的元件叫理想电压源。 电路符号&#xff1a;中间与导线直通的圆圈 电压源&#xff1a…...

快乐数求解

编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&#xff0c…...

运维高级内容--为端口做标记、制定调度规则

rs: yum install mod_ssl -y #安装mod_ssl模块 让rs支持https systemctl restart http lvs: cd /boot/ ls less config-5.14.0-427.13.1.el9_4.x86_64 ipvsadm -A -t 192.168.0.200:80 -s rr ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1 #轮询调度一次…...

后端Web之HTTP协议基础介绍

目录 1.HTTP概念 2.HTTP请求协议 3.HTTP响应协议 4.HTTP协议解析 1.HTTP概念 HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议。它是万维网数据通信的基础&#xff0c;允许将超…...

深入解析Nginx限流策略:如何高效控制访问频率

摘要&#xff1a;本文将详细介绍Nginx限流模块的使用方法&#xff0c;包括基于IP地址的限流、基于并发连接的限流以及如何应对突发流量。通过实际案例&#xff0c;帮助读者掌握Nginx限流策略&#xff0c;确保服务器在高并发场景下的稳定运行。 一、引言 在高并发场景下&#x…...

锂电池剩余寿命预测 | Matlab基于Transformer-GRU的锂电池剩余寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab基于Transformer-GRU的锂电池剩余寿命预测&#xff0c;Transformer结合门控循环单元。 Matlab基于Transformer-GRU的锂电池剩余寿命预测&#xff08;单变量&#xff09; 运行环境Matlab2023b及以上。 首先从…...

深入理解Spring的IOC容器与依赖注入

深入理解Spring的IOC容器与依赖注入 引言 Spring框架的核心功能之一就是它的IOC容器&#xff0c;它为开发人员提供了强大的依赖管理和控制反转的能力。本文将详细介绍Spring的IOC容器以及依赖注入的基本概念和实现方式&#xff0c;并通过示例展示如何在实际项目中应用这些技术…...

Qt读写sysfs

本文介绍Qt读写sysfs。 在嵌入式Linux系统上开发Qt应用程序&#xff0c;经常会涉及到外设的控制&#xff0c;比如GPIO&#xff0c;PWM的控制&#xff0c;Linux环境下可以像操作文件一样操作它们&#xff0c;这通常会涉及到sysfs的读写。本文以读写GPIO为例&#xff0c;简要介绍…...

实景三维:解锁地理信息新维度,引领未来城市智慧之钥

在这个信息爆炸与科技日新月异的时代&#xff0c;地理信息与遥感技术正以前所未有的速度改变我们认知世界的方式。在推动“实景三维平台”这一前沿科技的构建上&#xff0c;它不仅是地理信息的立体呈现&#xff0c;更是智慧城市的基石&#xff0c;打开了通往未来城市规划、管理…...

汽车免拆诊断案例 | 2010款劳斯莱斯古斯特车中央信息显示屏提示传动系统故障

故障现象  一辆2010款劳斯莱斯古斯特车&#xff0c;搭载N74发动机&#xff0c;累计行驶里程约为11万km。车主反映&#xff0c;起动发动机后组合仪表和中央信息显示屏均提示传动系统故障。用故障检测仪检测&#xff0c;发现发动机控制模块2&#xff08;DME2&#xff09;中存储…...

监督学习和无监督学习是什么?

监督学习和无监督学习是机器学习中的两种基本学习方式&#xff0c;它们在处理数据和训练模型时有着显著的区别。 监督学习 定义&#xff1a; 监督学习是指利用一组已知类别的样本&#xff08;即标记的数据&#xff09;来调整分类器的参数&#xff0c;使其达到所要求性能的过程…...

YII2的errorHandler.errorAction失效原因

<?phpreturn [components => [errorHandler => [errorAction => site/error,],] ]; 这段配置存在错误,导致错误处理无法生效。为了解决这个问题,我们需要对配置进行优化。 代码查看:yii\web\ErrorHandler::renderException <?phpprotected function ren…...

已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,写出算法change(p),交换p所指向的结点和它的前缀结点的顺序。

#include<assert.h> typedef struct SLnode {int data;struct SLnode* prior;struct SLnode* next; }SLnode,*SLnodelist; //创建结点 SLnode* createhead(int data) {SLnode* newnode (SLnode*)malloc(sizeof(SLnode));newnode->data data;newnode->next newno…...

什么是Tensor???为什么人工智能领域论文中经常出现这个名词

文章目录 什么是Tensor&#xff1f;&#xff1f;数学符号表示 什么是Tensor&#xff1f;&#xff1f; Tensor&#xff0c;中文叫张量。Tensor实际上就是一个多维数组&#xff08;multidimensional array&#xff09;。 而Tensor的目的是能够创造更高维度的矩阵、向量。 数学符…...

爬虫练习_01

前言 基础爬虫小练习01 一、requests板块使用 demo_01 import requests from lxml import etreeurl "https://movie.douban.com/top250" headers {"authority": "movie.douban.com","method": "GET","path"…...

Datawhale X 魔搭 AI夏令营第四期 魔搭-AIGC方向 task02笔记

从零入门AI生图原理&实践 是 Datawhale 2024 年 AI 夏令营第四期的学习活动&#xff08;“AIGC”方向&#xff09;&#xff0c;基于魔搭社区“可图Kolors-LoRA风格故事挑战赛”开展的实践学习。 Datawhale官方的Task2链接&#xff1a;Task02 往期Task1链接&#xff1a;Ta…...

多模态大语言模型的免训练视觉提示学习 ControlMLLM

ControlMLLM: Training-Free Visual Prompt Learning for Multimodal Large Language Models github paper 在本研究中&#xff0c;提出了一种无需进行训练的方法&#xff0c;通过可学习的潜变量优化将视觉提示注入到多模态大型语言模型&#xff08;MLLMs&#xff09;中。 在…...

Oracle|DM 常用|不常用 SQL大口袋

目录 一、前言 二、SQL写法 1、sql获取某一条数据中的前一条和后一条 2、实现like多个值的查询&#xff08;Oracle和dm支持&#xff0c;MySQL未试过&#xff09; 3、start with connect by prior 使用方法 4、用hextoraw解决select、update、delete语句执行慢 5、ORA-00…...

嵌入式软件--模电基础 DAY 1

C语言的学习告一段落了&#xff0c;要多多注意复习回顾&#xff0c;温故而知新&#xff0c;学习的过程就是与遗忘作斗争。接下来就是嵌入式学习中硬件电路方面的知识了。 一、电学基础 1.电流 电流&#xff08;Current&#xff09;是电荷在单位时间内通过导体横截面的流动量…...