核函数(Kernel Function)

核函数是一种在机器学习和统计学中广泛应用的数学函数,它用于将数据从原始特征空间映射到更高维度的特征空间,以便更容易地解决一些问题,尤其是在支持向量机(SVM)等算法中。核函数的主要作用是在高维空间中进行非线性映射,而无需显式计算或存储高维特征。

通过核函数能够允许SVM处理非线性分类问题,例如:图像识别、文本分类。不同的核函数对应不同的参数,通过对其超参数修改对改变原有数据的分布,使得支持向量机找到一个线性可分的超平面,使得原始空间中的数据变得线性可分。

1. SVM 核函数公式

常见的核函数包括线性核、多项式核、高斯核(RBF核)、Sigmoid核等,以及用户自定义的核函数。选择适当的核函数取决于数据的性质和问题的需求。核函数的使用允许机器学习模型处理更加复杂的问题,提高了分类和回归任务的性能。、

# 线性核函数
K(X, Y) = X @ Y.T

# 多项式核函数
# K(X, Y) = (gamma <X, Y> + coef0) ^ degree

# Sigmoid 核函数
K(X, Y) = tanh(gamma <X, Y> + coef0)

# 高斯核函数
K(x, y) = exp(-gamma ||x-y||^2)

下面相关的 API 的使用和计算过程:

import math
from sklearn.metrics.pairwise import rbf_kernel
from sklearn.metrics.pairwise import polynomial_kernel
from sklearn.metrics.pairwise import sigmoid_kernel
from sklearn.metrics.pairwise import linear_kernel
import numpy as np


np.random.seed(0)
x = np.random.randint(0, 5, (2, 3))
print(x)

"""
[
    [4 0 3]
    [3 3 1]
]
"""

# 1. 线性核函数
# K(X, Y) = X @ Y.T
def test01():
    # [[25. 15.]
    #  [15. 19.]]
    kernel_matrix = linear_kernel(x)
    print(kernel_matrix)

    # [[25. 15.]
    #  [15. 19.]]
    kernel_matrix = x @ x.T
    print(kernel_matrix)


# 2. 多项式核函数
# K(X, Y) = (gamma <X, Y> + coef0) ^ degree
def test02():
    # [[42.875 15.625]
    #  [15.625 24.389]]
    kernel_matrix = polynomial_kernel(x, degree=3, gamma=0.1, coef0=1)
    print(kernel_matrix)

    # [[42.875 15.625]
    #  [15.625 24.389]]
    kernel_matrix = (0.1 * x @ x.T + 1) ** 3
    print(kernel_matrix)


# 3. Sigmoid核函数
# K(X, Y) = tanh(gamma <X, Y> + coef0)
def test03():
    # [[1. 1.]
    #  [1. 1.]]
    kernel_matrix = sigmoid_kernel(x, gamma=2, coef0=3)
    print(kernel_matrix)

    # [[1. 1.]
    #  [1. 1.]]
    kernel_matrix = np.tanh(2 * x @ x.T + 3)
    print(kernel_matrix)


# 4. 高斯核函数
# K(x, y) = exp(-gamma ||x-y||^2)
def test04():
    # [[1.00000000e+00 6.91440011e-13]
    #  [6.91440011e-13 1.00000000e+00]]
    kernel_matrix = rbf_kernel(x, gamma=2)
    print(kernel_matrix)

    # [[1.00000000e+00 6.91440011e-13]
    #  [6.91440011e-13 1.00000000e+00]]
    # 计算两两行之间的差值
    row_diff = x[:, np.newaxis] - x
    print(np.exp(np.sum(-2 * row_diff ** 2, axis=-1)))


if __name__ == '__main__':
    test04()

2. SVM 核函数理解

支持向量机中,核函数也可以是不同的计算两个样本相似度的方法,即:通过核函数相关的参数来控制样本之间在高维空间的相似程度。

核方法可被视为基于实例的学习器:不是学习与输入特征相对应的固定参数集,而是记忆第 i 个训练样本, 并学习相应权重。当进行预测时,会使用待预测的样本与每个在训练中记忆得到的关键样本计算计算相似性。基于核函数的二分类器通常计算相似度的加权和:

  1. \(y_{i} \in \{-1, +1\}\)
  2. x 为输入样本
  3. \(x_{i}\) 表示训练过程中记忆到的重要的样本
  4. \(w_{i}\) 表示训练过程中记忆到的重要样本的权重
  5. K 为核函数,度量了任意两个样本之间的相似程度

https://en.wikipedia.org/wiki/Kernel_method#Mathematics:_the_kernel_trick

未经允许不得转载:一亩三分地 » 核函数(Kernel Function)
评论 (0)

8 + 7 =