支持向量机回归

Posted 丰。。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了支持向量机回归相关的知识,希望对你有一定的参考价值。

研究背景

支持向量机回归(Support Vector Regression, SVR)算法是一种经典的回归算法,其研究历史可以追溯到20世纪90年代。以下是一些关于SVR算法的经典论文:

Vapnik, V. N. (1995). The nature of statistical learning theory (Vol. 1). Springer.
这本书介绍了支持向量机的理论和算法,为SVR算法的发展提供了重要的基础。

Smola, A. J., & Schölkopf, B. (2004). A tutorial on support vector regression. Statistics and computing, 14(3), 199-222.
这篇论文详细介绍了SVR算法的理论和实现方法,为学习和掌握SVR算法提供了重要的参考。

Drucker, H., Wu, D., & Vapnik, V. N. (1997). Support vector regression machines. In Advances in neural information processing systems (pp. 155-161).
这篇论文是SVR算法的奠基之作,提出了SVR算法的理论和算法,为后来的SVR算法提供了理论基础。

Zhang, Q., & Benveniste, A. (2005). Wavelet-based support vector regression for nonlinear system identification. IEEE Transactions on neural networks, 16(1), 235-243.
这篇论文介绍了基于小波变换的SVR算法在非线性系统识别中的应用,为SVR算法在实际应用中的发展提供了重要的参考。

Liu, Y., & Shen, Z. (2019). An improved support vector regression based on PSO and gradient descent. Soft Computing, 23(15), 6029-6045.
这篇论文提出了基于粒子群优化和梯度下降的改进型SVR算法,为SVR算法的发展和改进提供了重要的思路。

这些论文为SVR算法的研究和应用提供了重要的参考和指导,对于学习和掌握SVR算法具有重要意义。

原理说明

支持向量机回归(Support Vector Machine Regression, SVMR)是一种基于支持向量机的回归算法,它与支持向量机分类(Support Vector Machine Classification, SVMC)相似,但在目标函数和损失函数的定义上有所不同。

目标函数
与SVMC不同,SVMR的目标是最小化模型预测值与真实值之间的差异,即最小化预测值与真实值之间的误差平方和(Sum of Squared Errors, SSE),同时还要最大化间隔,以确保模型的泛化能力。

假设训练集为D=(x1,y1), (x2,y2), …, (xn,yn),其中xi∈R^d为第i个样本的特征向量,yi∈R为第i个样本的真实值。则SVMR的目标函数可以表示为:

min(w, b) 1/2 ||w||^2 + C ∑(yi - f(xi))^2

其中,w是权重向量,b是偏置项,C是正则化参数,||w||^2是权重向量的L2范数,f(xi) = w^Txi + b是模型预测值。

目标函数的第一项表示最小化权重向量的L2范数,以防止过拟合。第二项是一个平方损失函数,表示最小化预测值与真实值之间的误差平方和。C是正则化参数,它用于平衡最小化误差和最小化权重向量L2范数之间的权衡。C越大,模型越倾向于最小化误差,C越小,模型越倾向于最小化权重向量的L2范数。

约束条件
与SVMC类似,SVMR的优化问题也存在约束条件。训练样本的真实值yi与预测值f(xi)之间的差异需要小于等于ϵ,即|yi - f(xi)| ≤ ϵ,ϵ为一个给定的容忍度。这个约束条件可以表示为:

-ϵ ≤ yi - f(xi) ≤ ϵ

将约束条件代入目标函数,可以得到SVMR的对偶问题:

min α 1/2 α^T Q α - e^T α

subject to: -ϵ ≤ y - Qα ≤ ϵ

其中,α是拉格朗日乘子向量,Q是Gram矩阵,e是全1向量,y是包含训练集真实值的向量。

模型预测
训练完成后,可以使用模型进行预测。给定一个新的样本特征向量x,模型预测值f(x)可以表示为:

f(x) = ∑αiyiK(xi,x) + b

其中,K(xi,x)是核函数,可以是

线性核函数K(xi,x) = xi^Tx,多项式核函数K(xi,x) = (γ(xiTx)+r)d,径向基函数(Radial Basis Function, RBF)核函数K(xi,x) = exp(-γ||xi-x||^2)等。

b是偏置项,可以通过以下公式计算:

b = (1/|S|) ∑(yi - ∑αiyiK(xi,x))

其中,S是支持向量集合,包含那些满足0 < αi < C的样本。|S|表示支持向量的数量。

总结
SVMR是一种基于支持向量机的回归算法,目标是最小化模型预测值与真实值之间的误差平方和,同时最大化间隔。通过引入拉格朗日乘子和核函数,可以将SVMR的优化问题转化为对偶问题,从而使用凸优化方法进行求解。模型预测值可以使用核函数进行计算,并通过支持向量集合中的样本来计算偏置项。SVMR在处理非线性回归问题时具有较好的性能。

公式推导

支持向量机回归(Support Vector Regression,SVR)是一种基于支持向量机的回归算法,通过寻找最大化间隔的超平面来进行回归预测。在SVR中,假设输入数据集为(xi, yi)|xi∈R^n, yi∈R,其中xi是n维的特征向量,yi是对应的标签。

目标函数
对于回归问题,目标是最小化模型预测值与真实值之间的误差平方和,同时最大化间隔。因此,SVR的目标函数可以表示为:

min_(w,b,ξ,ξ*) 1/2 w^Tw + C ∑(ξ+ξ*)

其中,w是超平面的法向量,b是偏置项,ξ和ξ*是松弛变量,用于处理不可分情况。C是一个正则化参数,用于平衡最大化间隔和最小化误差的权重。这里使用的是L2正则化。

约束条件
为了使SVR的预测更加准确,需要在目标函数中引入约束条件。对于每个样本(xi, yi),需要满足以下约束条件:

yi - w^Txi - b <= ε + ξi

w^Txi + b - yi <= ε + ξi*

其中,ε是一个正值,表示对误差的容忍程度。ξi和ξi是非负松弛变量,用于处理不可分情况。同时,对于所有的i和i,还需要满足以下约束条件:

ξi >= 0, ξi* >= 0

对偶问题
通过引入拉格朗日乘子α和α*,可以将SVR的优化问题转化为对偶问题。对偶问题的目标是最大化拉格朗日函数:

L(w,b,ξ,ξ*,α,α*) = 1/2 w^Tw + C ∑(ξ+ξ*) - ∑(αi(yi-wTxi-b-ξi)-αi*(yi-wTxi-b+ξi*))

其中,α和α*是拉格朗日乘子,用于处理约束条件。最终的对偶问题可以表示为:

max_α,α* ∑(αi - αi*) - 1/2 ∑∑(αiαjK(xi,xj))

s.t. 0 <= αi,αi* <= C

∑(αi - αi*)yi = 0

其中,K(xi,xj)是核函数,用于将样本映射到高维空间进行计算。α和α*的约束条件保证了拉格朗日乘子是非负的,同时不超过正则化参数C的限制。最后一个约束条件保证了预测结果的线性性。

模型预测

在求解对偶问题后,可以通过求解拉格朗日乘子得到超平面和偏置项,从而进行模型预测。对于新的输入特征向量x,预测值可以表示为:

f(x) = ∑(αi - αi*)K(xi,x) + b

其中,K(xi,x)是核函数,表示输入特征向量xi和新的输入特征向量x之间的相似度。超平面的法向量w可以表示为:

w = ∑(αi - αi*)xi

由于大多数αi都等于0,因此只有少数的支持向量的拉格朗日乘子不等于0,它们决定了超平面和偏置项的位置。预测结果只与支持向量有关,因此SVR可以很好地处理高维数据集和非线性问题。

核函数
在SVR中,核函数是非常重要的一个概念,它将输入特征向量映射到高维空间进行计算。常用的核函数包括线性核函数、多项式核函数、径向基函数(Radial Basis Function,RBF)核函数等。不同的核函数对应不同的映射方式,适用于不同的问题。例如,线性核函数适用于线性问题,RBF核函数适用于非线性问题。选择合适的核函数可以提高SVR的预测性能。

以上就是SVR算法的原理和公式推导过程。

代码示意

import numpy as np
import random
class SVR:
    def __init__(self, C=1, kernel='linear', epsilon=0.1, max_iter=100):
        self.C = C  # 惩罚因子
        self.kernel = kernel  # 核函数类型
        self.epsilon = epsilon  # 允许的误差
        self.max_iter = max_iter  # 最大迭代次数

    def fit(self, X, y):
        n_samples, n_features = X.shape

        # 根据核函数类型选择相应的核函数
        if self.kernel == 'linear':
            self.kernel_func = self._linear_kernel
        elif self.kernel == 'rbf':
            self.kernel_func = self._rbf_kernel
        else:
            raise ValueError('Invalid kernel type')

        # 初始化拉格朗日乘子 alpha 和偏置 b
        alpha = np.zeros(n_samples)
        b = 0

        # 迭代训练模型
        for _ in range(self.max_iter):
            # 随机选择一个样本
            i = random.randint(0, n_samples - 1)

            # 计算样本的预测值和误差
            y_pred = self.predict(X[i, np.newaxis])
            error = y_pred - y[i]

            # 计算拉格朗日乘子 alpha[i] 的上下界
            if y[i] == y_pred:
                L = max(0, alpha[i] - self.C)
                H = min(self.C, alpha[i])
            else:
                L = max(0, alpha[i])
                H = min(self.C, self.C + alpha[i])

            # 如果上下界相等,则跳过本次迭代
            if L == H:
                continue

            # 计算样本 i 的核函数值
            K_ii = self.kernel_func(X[i, np.newaxis], X[i, np.newaxis])

            # 计算样本 i 与其它样本的核函数值
            K_ij = self.kernel_func(X[i, np.newaxis], X)

            # 计算拉格朗日乘子 alpha[j] 的新值
            eta = 2 * K_ij - K_ii
            new_alpha_j = alpha[i] - y[i] * error / eta

            # 修剪拉格朗日乘子 alpha[j]
            if new_alpha_j > H:
                new_alpha_j = H
            elif new_alpha_j < L:
                new_alpha_j = L

            # 如果 alpha[j] 变化太小,则跳过本次迭代
            if abs(alpha[i] - new_alpha_j) < 1e-5:
                continue

            # 更新拉格朗日乘子 alpha[j] 和偏置 b
            alpha[i] = new_alpha_j
            alpha[j] = alpha[j] + y[j] * y[i] * (alpha[i] - new_alpha_j)
            b1 = b - error - y[i] * (alpha[i] - alpha[i]) * K_ii - y[j] * (alpha[j] - alpha[j]) * K_ij


支持向量机(SVM)基本原理

参考技术A

看了很多关于SVM的博客,但是常常只能保存书签之后看,有时候有的博客就突然没了,这里就作为搬运工总结一下之后自己看吧。主要内容来自于:
支持向量机通俗导论(理解SVM的三层境界)

线性回归
给定数据集 , 其中, ,线性回归试图学习到一个线性模型,尽可能地输出正确标记.

如果我们要用线性回归算法来解决一个分类问题,(对于分类,y 取值为 0 或者 1),但如果你使用的是线性回归,那么假设函数的输出值可能远大于 1,或者远小于 0,就算所有训练样本的标签 y 都是 0 或 1但是如果算法得到的值远大于 1 或者远小于 0 的话,就会感觉很奇怪。所以我们在接下来的要研究的算法就叫做逻辑回归算法,这个算法的性质是:它的输出值永远在 0 到 1 之间。

所以逻辑回归就是一个分类算法,这个算法的输出值永远在 0 到 1 之间.
我们先看二分类的LR,具体做法是:利用sigmoid 函数,将每一个点的回归值映射到0,1之间.sigmoid函数特性如下:

如图所示,令 , 当 z > 0 , z 越大, sigmoid 返回值越接近1(但永远不会超过1). 反之,当z < 0时,z 越小, sigmoid 返回值越接近0(但永远不会小于0).

支持向量机 ,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为 特征空间 上的间隔最大的线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。

线性分类器
给定一些数据点,它们分别属于两个不同的类,现在要找到一个线性分类器把这些数据分成两类。如果用x表示数据点,用y表示类别(y可以取1或者-1,分别代表两个不同的类),一个线性分类器的学习目标便是要在n维的数据空间中找到一个超平面(hyper plane),这个超平面的方程可以表示为( wT中的T代表转置):

logistic回归目的是从特征学习出一个0/1分类模型,而这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。因此,使用logistic函数(或称作sigmoid函数)将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率。
假设函数:

其中x是n维特征向量,函数g就是logistic函数。

图像为:

在超平面w x+b=0确定的情况下,|w x+b|能够表示点x到距离超平面的远近,而通过观察w x+b的符号与类标记y的符号是否一致可判断分类是否正确,所以,可以用(y (w*x+b))的正负性来判定或表示分类的正确性。于此,我们便引出了函数间隔(functional margin)的概念。
定义函数间隔 (用表示)为

而超平面(w,b)关于T中所有样本点(xi,yi)的函数间隔最小值(其中,x是特征,y是结果标签,i表示第i个样本),便为超平面(w, b)关于训练数据集T的函数间隔:

但这样定义的函数间隔有问题,即如果成比例的改变w和b(如将它们改成2w和2b),则函数间隔的值f(x)却变成了原来的2倍(虽然此时超平面没有改变),所以只有函数间隔还远远不够。

事实上,我们可以对法向量w加些约束条件,从而引出真正定义点到超平面的距离--几何间隔(geometrical margin)的概念。

假定对于一个点 x ,令其垂直投影到超平面上的对应点为 x0 ,w 是垂直于超平面的一个向量, 为样本x到超平面的距离,如下图所示:

根据平面几何知识,有

其中||w||为w的二阶范数(范数是一个类似于模的表示长度的概念), 是单位向量(一个向量除以它的模称之为单位向量)。

又由于x0 是超平面上的点,满足 f(x0)=0,代入超平面的方程 ,可得 ,即

随即让此式 的两边同时乘以 ,再根据 和 ,即可算出 :

为了得到 的绝对值,令 乘上对应的类别 y,即可得出几何间隔(用 表示)的定义:

从上述函数间隔和几何间隔的定义可以看出:几何间隔就是函数间隔除以||w||,而且函数间隔y (wx+b) = y f(x)实际上就是|f(x)|,只是人为定义的一个间隔度量,而几何间隔|f(x)|/||w||才是直观上的点到超平面的距离。

对一个数据点进行分类,当超平面离数据点的“间隔”越大,分类的确信度(confidence)也越大。所以,为了使得分类的确信度尽量高,需要让所选择的超平面能够最大化这个“间隔”值。这个间隔就是下图中的Gap的一半。

通过由前面的分析可知:函数间隔不适合用来最大化间隔值,因为在超平面固定以后,可以等比例地缩放w的长度和b的值,这样可以使得 的值任意大,亦即函数间隔 可以在超平面保持不变的情况下被取得任意大。但几何间隔因为除上了 ,使得在缩放w和b的时候几何间隔的值 是不会改变的,它只随着超平面的变动而变动,因此,这是更加合适的一个间隔。换言之,这里要找的最大间隔分类超平面中的“间隔”指的是几何间隔。

于是最大间隔分类器(maximum margin classifier)的目标函数可以定义为

同时需满足一些条件,根据间隔的定义,有

回顾下几何间隔的定义 ,可知:如果令函数间隔 等于1(之所以令等于1,是为了方便推导和优化,且这样做对目标函数的优化没有影响),则有 = 1 / ||w||且 ,从而上述目标函数转化成了:

相当于在相应的约束条件 下,最大化这个1/||w||值,而1/||w||便是几何间隔。

据了解,

由于这个问题的特殊结构,还可以通过拉格朗日对偶性(Lagrange Duality)变换到对偶变量 (dual variable) 的优化问题,即通过求解与原问题等价的对偶问题(dual problem)得到原始问题的最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的优点在于:一者对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题。

那什么是拉格朗日对偶性呢?简单来讲,通过给每一个约束条件加上一个拉格朗日乘子 ,(Lagrange multiplier),定义拉格朗日函数(通过拉格朗日函数将约束条件融合到目标函数里去,从而只用一个函数表达式便能清楚的表达出我们的问题)

然后令:

容易验证,当某个约束条件不满足时,例如 ,那么显然有 (只要令 即可)。而当所有约束条件都满足时,则最优值为 ,亦即最初要最小化的量。

因此,在要求约束条件得到满足的情况下最小化 ,实际上等价于直接最小化 (当然,这里也有约束条件,就是 ≥0,i=1,…,n) ,因为如果约束条件没有得到满足, 会等于无穷大,自然不会是我们所要求的最小值。

具体写出来,目标函数变成了:

这里用 表示这个问题的最优值,且和最初的问题是等价的。如果直接求解,那么一上来便得面对w和b两个参数,而 又是不等式约束,这个求解过程不好做。不妨把最小和最大的位置交换一下,变成:

交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用 来表示。而且有 ≤ ,在满足某些条件的情况下,这两者相等,这个时候就可以通过求解对偶问题来间接地求解原始问题。

换言之,之所以从minmax 的原始问题,转化为maxmin 的对偶问题,一者因为 是 的近似解,二者,转化为对偶问题后,更容易求解。

下面可以先求L 对w、b的极小,再求L对 的极大。

KKT条件
≤ 在满足某些条件的情况下,两者等价,这所谓的“满足某些条件”就是要满足KKT条件。

要让两者等价需满足strong duality (强对偶),而后有学者在强对偶下提出了KKT条件,且KKT条件的成立要满足constraint qualifications,而constraint qualifications之一就是Slater条件。所谓Slater 条件,即指:凸优化问题,如果存在一个点x,使得所有等式约束都成立,并且所有不等式约束都严格成立(即取严格不等号,而非等号),则满足Slater 条件。对于此处,Slater 条件成立,所以 ≤ 可以取等号。

一般地,一个最优化数学模型能够表示成下列标准形式:

其中,f(x)是需要最小化的函数,h(x)是等式约束,g(x)是不等式约束,p和q分别为等式约束和不等式约束的数量。
KKT条件的意义:它是一个非线性规划(Nonlinear Programming)问题能有最优化解法的必要和充分条件。

而KKT条件就是指上面最优化数学模型的标准形式中的最小点 x* 必须满足下面的条件:

我们这里的问题是满足 KKT 条件的(首先已经满足Slater条件,再者f和gi也都是可微的,即L对w和b都可导),因此现在我们便转化为求解第二个问题。

也就是说,原始问题通过满足KKT条件,已经转化成了对偶问题。而求解这个对偶学习问题,分为3个步骤:首先要让L(w,b,a) 关于 w 和 b 最小化,然后求对 的极大,最后利用SMO算法求解对偶问题中的拉格朗日乘子。

对偶问题求解的3个步骤

将以上结果代入之前的L:

得到:

具体推导过程是比较复杂的,如下所示:

最后,得到:

“倒数第4步”推导到“倒数第3步”使用了线性代数的转置运算,由于ai和yi都是实数,因此转置后与自身一样。“倒数第3步”推导到“倒数第2步”使用了(a+b+c+…)(a+b+c+…)=aa+ab+ac+ba+bb+bc+…的乘法运算法则。最后一步是上一步的顺序调整。

从上面的最后一个式子,我们可以看出,此时的拉格朗日函数只包含了一个变量,那就是 (求出了 便能求出w,和b,由此可见,则核心问题:分类函数 也就可以轻而易举的求出来了)。

上述式子要解决的是在参数上 求最大值W的问题,至于 和 都是已知数。要了解这个SMO算法是如何推导的,请跳到下文第3.5节、SMO算法。

总结
让我们再来看看上述推导过程中得到的一些有趣的形式。首先就是关于我们的 hyper plane ,对于一个数据点 x 进行分类,实际上是通过把 x 带入到 算出结果然后根据其正负号来进行类别划分的。而前面的推导中我们得到:

因此分类函数为:

这里的形式的有趣之处在于,对于新点 x的预测,只需要计算它与训练数据点的内积即可(表示向量内积),这一点至关重要,是之后使用 Kernel 进行非线性推广的基本前提。此外,所谓 Supporting Vector 也在这里显示出来——事实上,所有非Supporting Vector 所对应的系数 都是等于零的,因此对于新点的内积计算实际上只要针对少量的“支持向量”而不是所有的训练数据即可。

为什么非支持向量对应的 等于零呢?直观上来理解的话,就是这些“后方”的点——正如我们之前分析过的一样,对超平面是没有影响的,由于分类完全有超平面决定,所以这些无关的点并不会参与分类问题的计算,因而也就不会产生任何影响了。

回忆一下我们通过 Lagrange multiplier得到的目标函数:

注意到如果 xi 是支持向量的话,上式中红颜色的部分是等于 0 的(因为支持向量的 functional margin 等于 1 ),而对于非支持向量来说,functional margin 会大于 1 ,因此红颜色部分是大于零的,而 又是非负的,为了满足最大化, 必须等于 0 。这也就是这些非Supporting Vector 的点的局限性。

至此,我们便得到了一个maximum margin hyper plane classifier,这就是所谓的支持向量机(Support Vector Machine)。当然,到目前为止,我们的 SVM 还比较弱,只能处理线性的情况,不过,在得到了对偶dual 形式之后,通过 Kernel 推广到非线性的情况就变成了一件非常容易的事情了(通过求解对偶问题得到最优解,这就是线性可分条件下支持向量机的对偶算法,这样做的优点在于:一者对偶问题往往更容易求解;二者可以自然的引入核函数,进而推广到非线性分类问题”)。

事实上,大部分时候数据并不是线性可分的,这个时候满足这样条件的超平面就根本不存在。在上文中,我们已经了解到了SVM处理线性可分的情况,那对于非线性的数据SVM咋处理呢?对于非线性的情况,SVM 的处理方法是选择一个核函数 κ(⋅,⋅) ,通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。

具体来说,在线性不可分的情况下,支持向量机首先在低维空间中完成计算,然后通过核函数将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身不好分的非线性数据分开。如图所示,一堆数据在二维空间无法划分,从而映射到三维空间里划分:

而在我们遇到核函数之前,如果用原始的方法,那么在用线性学习器学习一个非线性关系,需要选择一个非线性特征集,并且将数据写成新的表达形式,这等价于应用一个固定的非线性映射,将数据映射到特征空间,在特征空间中使用线性学习器,因此,考虑的假设集是这种类型的函数:

这里ϕ:X->F是从输入空间到某个特征空间的映射,这意味着建立非线性学习器分为两步:

首先使用一个非线性映射将数据变换到一个特征空间F,
然后在特征空间使用线性学习器分类。

而由于对偶形式就是线性学习器的一个重要性质,这意味着假设可以表达为训练点的线性组合,因此决策规则可以用测试点和训练点的内积来表示:

如果有一种方式可以在特征空间中直接计算内积〈φ(xi · φ(x)〉,就像在原始输入点的函数中一样,就有可能将两个步骤融合到一起建立一个非线性的学习器,这样直接计算法的方法称为核函数方法:
核是一个函数K,对所有x,z,满足 ,这里φ是从X到内积特征空间F的映射。

来看个核函数的例子。如下图所示的两类数据,分别分布为两个圆圈的形状,这样的数据本身就是线性不可分的,此时咱们该如何把这两类数据分开呢(下文将会有一个相应的三维空间图)?

事实上,上图所述的这个数据集,是用两个半径不同的圆圈加上了少量的噪音生成得到的,所以,一个理想的分界应该是一个“圆圈”而不是一条线(超平面)。如果用 和 来表示这个二维平面的两个坐标的话,我们知道一条二次曲线(圆圈是二次曲线的一种特殊情况)的方程可以写作这样的形式:

注意上面的形式,如果我们构造另外一个五维的空间,其中五个坐标的值分别为 ,那么显然,上面的方程在新的坐标系下可以写作:

关于新的坐标 ,这正是一个 hyper plane 的方程!也就是说,如果我们做一个映射 ,将 按照上面的规则映射为 ,那么在新的空间中原来的数据将变成线性可分的,从而使用之前我们推导的线性分类算法就可以进行处理了。这正是 Kernel 方法处理非线性问题的基本思想。

再进一步描述 Kernel 的细节之前,不妨再来看看上述例子在映射过后的直观形态。当然,你我可能无法把 5 维空间画出来,不过由于我这里生成数据的时候用了特殊的情形,所以这里的超平面实际的方程是这个样子的(圆心在 轴上的一个正圆)

因此我只需要把它映射到 ,这样一个三维空间中即可,下图即是映射之后的结果,将坐标轴经过适当的旋转,就可以很明显地看出,数据是可以通过一个平面来分开的

核函数相当于把原来的分类函数:

映射成:

而其中的 可以通过求解如下 dual 问题而得到的:

这样一来问题就解决了吗?似乎是的:拿到非线性数据,就找一个映射

以上是关于支持向量机回归的主要内容,如果未能解决你的问题,请参考以下文章

机器学习三人行(系列七)----支持向量机实践指南(附代码)

机器学习之路:python支持向量机回归SVR 预测波士顿地区房价

机器学习入门之四:机器学习的方法--SVM(支持向量机)(转载)

机器学习二十二:支持向量机回归SVR

吴裕雄 python 机器学习——支持向量机非线性回归SVR模型

比较三种机器学习模型(随机森林,支持向量机,逻辑回归)的分类效果