线性回归模型形式简单,可解释性强,有着大量的理论支撑,但是在实际问题中,很多关系往往不能用线性模型简单地概括。因此需要引入非线性回归模型。

对于一些典型的非线性回归模型,通过变量代换,我们可以将其转化为线性回归模型来解决。

一、多项式回归(Polynomial Regression)

1.1多项式回归函数

✅ 1.1.1 当自变量和因变量都为一维时:

通常多项式回归模型函数的形式为:


\hat{y_i} = \theta_0 + \theta_1 x_i + \theta_2 x_i^2 + \cdots + \theta_m x_i^m (i = 1, 2, \ldots, n)
 

为了方便表达,我们可以将上式写为矩阵形式:


\begin{bmatrix} \hat{y_1} \\ \hat{y_2} \\ \hat{y_3} \\ \vdots \\ \hat{y_n} \end{bmatrix} = \begin{bmatrix} 1 & x_1 & x_1^2 & \cdots & x_1^m \\ 1 & x_2 & x_2^2 & \cdots & x_2^m \\ 1 & x_3 & x_3^2 & \cdots & x_3^m \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 1 & x_n & x_n^2 & \cdots & x_n^m \end{bmatrix} \begin{bmatrix} \theta_0 \\ \theta_1 \\ \theta_2 \\ \vdots \\ \theta_m \end{bmatrix}

即:


\hat{y} = \varphi \boldsymbol{\theta}

  • \hat{y} 是预测值向量,包含所有样本的预测结果。

  • \varphi 是设计矩阵,每一行对应一个样本的特征值及其高次幂。

  • \boldsymbol{\theta} 是参数向量,包含所有模型参数。

✅ 1.1.2 当自变量和因变量都为多维时:

当自变量变为 d 维,因变量变为 p 维时,多项式回归模型将变得更加复杂,但基本原理仍然相同。我们可以通过扩展设计矩阵来处理多维自变量的情况,同时因变量的多维性意味着我们需要预测多个目标值。

多维自变量和单维因变量的情况:

一共有 n 个样本,对于第 i 个样本 (\boldsymbol{x_i},y_i),假设自变量 \boldsymbol{x_i} 是一个 d 维向量,即 \boldsymbol{x_i} = [x_{i1}, x_{i2}, \ldots, x_{id}]^\top ,因变量 y 是一个标量。

多项式回归模型可以表示为:


\hat{y}_i = \theta_0 + \sum_{j=1}^{d} \theta_j x_{ij} + \sum_{j=1}^{d} \theta_{j+d} x_{ij}^2 + \cdots + \sum_{j=1}^{d} \theta_{j+(m-1)d} x_{ij}^m

矩阵形式可以表示为:


\hat{y} = \Phi \boldsymbol{\theta}

其中:

  • 模型参数 \boldsymbol{\theta}=[\theta_0,\theta_1,\ldots,\theta_{md}]md+1 维列向量。

  • 设计矩阵 \Phi :(每一行对应一个样本,每一列对应一个特征或特征的高次幂)(以 d=3,m=2 为例)

\Phi= \begin{bmatrix} 1 & x_{11} & x_{12} & x_{13} & x_{11}^2 & x_{12}^2 & x_{13}^2 \\ 1 & x_{21} & x_{22} & x_{23} & x_{21}^2 & x_{22}^2 & x_{23}^2 \\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots \\ 1 & x_{n1} & x_{n2} & x_{n3} & x_{n1}^2 & x_{n2}^2 & x_{n3}^2 \\ \end{bmatrix}

  • \hat{y} = [\hat{y_1},\hat{y_2},\ldots,\hat{y_n}]

多维自变量和多维因变量的情况:

一共有 n 个样本,对于第 i 个样本 (\boldsymbol{x_i}, \boldsymbol{y_i})

  • 自变量 \boldsymbol{x_i} \in \mathbb{R}^{d},即 \boldsymbol{x_i} = [x_{i1}, x_{i2}, \ldots, x_{id}]^\top

  • 因变量 \boldsymbol{y_i} \in \mathbb{R}^{p},即 \boldsymbol{y_i} = [y_{i1}, y_{i2}, \ldots, y_{ip}]^\top

对每个输出维度 k=1,\dots,p 分别建立多项式回归模型:


\hat{y}_{ik} = \theta_{0}^{(k)} + \sum_{j=1}^{d}\theta_{j}^{(k)}x_{ij} + \sum_{j=1}^{d}\theta_{j+d}^{(k)}x_{ij}^{2} + \cdots + \sum_{j=1}^{d}\theta_{j+(m-1)d}^{(k)}x_{ij}^{m}

将所有 p 个模型写成矩阵形式:


\hat{Y} = \Phi\Theta

其中:

  • \hat{Y} \in \mathbb{R}^{n\times p},第 i 行为 \hat{\boldsymbol{y}_i}^\top

  • \Theta \in \mathbb{R}^{(md+1)\times p},第 k 列为第 k 个输出对应的参数向量:

\Theta = \left[\boldsymbol{\theta}^{(1)}, \boldsymbol{\theta}^{(2)}, \cdots, \boldsymbol{\theta}^{(p)}\right],\quad \boldsymbol{\theta}^{(k)} = [\theta_{0}^{(k)},\theta_{1}^{(k)},\ldots,\theta_{md}^{(k)}]^\top

  • 设计矩阵 \Phi(与单输出情形完全相同,不随 p 变化):

1.2 标准方程法求解

在多项式回归中,由于自变量的指数增大,写出损失函数后,对每个参数进行求导等操作的运算量也随之变大,对此我们希望能够将一些线性回归的知识迁移运用,简化计算公式,减少计算成本。

损失函数(对于因变量为一维的情形):


J(\boldsymbol{\theta}) = \frac{1}{2}\sum_{i=1}^{n}\bigl(y_i - \varphi \boldsymbol{\theta}\bigr)^2 = \frac{1}{2}\bigl\|\boldsymbol{y}-\varphi\boldsymbol{\theta}\bigr\|_2^2

\boldsymbol{\theta} 求梯度:


\nabla J(\boldsymbol{\theta}) = \frac{1}{2}\nabla \left[(\boldsymbol{y}-\varphi\boldsymbol{\theta})^\top(\boldsymbol{y}-\varphi\boldsymbol{\theta})\right]\\ = \frac{1}{2}\cdot 2\varphi^\top(\varphi\boldsymbol{\theta}-\boldsymbol{y})\\ = \varphi^\top(\varphi\boldsymbol{\theta}-\boldsymbol{y})

整合之前学过的知识,我们要解决的凸优化问题为 (\arg\min_{\theta} J(\theta)),若损失函数图像具有强凸性,则 (\varphi^T \varphi) 为正定矩阵,那么最小二乘法同样适用,最优解为:


\theta^* = (\varphi^T \varphi)^{-1} \varphi^T y

1.3 Python实现

 import numpy as np
 import matplotlib.pyplot as plt
 from sklearn.preprocessing import PolynomialFeatures
 ​
 # 生成含高斯噪声的训练集,含50个样本,并作出散点图
 X = 5 * np.random.rand(50, 1) - 2.5 # 这里减去2.5是为了方便我们看到整个散点图轮廓
 noise = np.random.rand(50, 1)
 y = 0.6 * X**2 + 2 * X + 1 + noise
 plt.scatter(X, y)
 ​
 '''
 从散点图判断用二次函数或可拟合,
 我们要用原有的数据集X生成方便非线性转为线性解决的新数据集,
 这里我们可以用sklearn库中现成的PolynomialFeatures模块函数
 '''
 ​
 pf = PolynomialFeatures(degree=2, include_bias=True)
 # 该函数用于构建设计矩阵
 # degree=2表示多项式的阶数m为2,include_bias为True代表包含x_0=1的项
 train_X = pf.fit_transform(X)
 ​
 # 标准方程法
 theta = np.zeros([3, 1])
 theta = np.linalg.inv((train_X.transpose()) @ train_X) @ train_X.transpose() @ y
 # @符号为python运算中的矩阵点乘符号
 ​
 # 现在我们已经得到了参数,绘制函数,查看拟合效果
 x = np.linspace(-3, 3, 100)
 hypothesis_function = theta[0] + theta[1] * x + theta[2] * x * x
 plt.plot(x, hypothesis_function, color='darkorange')
 plt.show()

二、径向基回归(Radial-basis Regression)

径向基函数是一个取值仅依赖于到原点距离的实值函数,即:


\varphi(\mathbf{x}) = \varphi(\|\mathbf{x}\|)

任一满足上式的函数都可称作径向函数。最常用的径向函数为高斯函数。

2.1 高斯核函数(Gaussian Kernel)

2.1.1 公式定义

最常用的高斯核函数表达式为:


\hat{y}_j = \sum_{i=1}^{m}\theta_i\varphi_i(x_j)=\boldsymbol{\theta}^T\boldsymbol{\varphi}_j,\quad j=1,2,\dots,n

\varphi_i(x_j)=K_{\lambda_i}(x_j,r_i)=\exp\!\left(-\frac{(x_j-r_i)^2}{2\lambda_i^2}\right).

其中 :

  • r_i 为第 i 个中心点(均值)

  • \lambda_i 为带宽参数(方差)

使用矩阵形式表示:


\begin{bmatrix} y_1 \\ y_2 \\ y_3 \\ \vdots \\ y_n \end{bmatrix} = \begin{bmatrix} K_{\lambda_1}(x_1, r_i) & K_{\lambda_2}(x_1, r_i) & \cdots & K_{\lambda_m}(x_1, r_i) \\ K_{\lambda_1}(x_2, r_i) & K_{\lambda_2}(x_2, r_i) & \cdots & K_{\lambda_m}(x_2, r_i) \\ K_{\lambda_1}(x_3, r_i) & K_{\lambda_2}(x_3, r_i) & \cdots & K_{\lambda_m}(x_3, r_i) \\ \vdots & \vdots & \ddots & \vdots \\ K_{\lambda_1}(x_n, r_i) & K_{\lambda_2}(x_n, r_i) & \cdots & K_{\lambda_m}(x_n, r_i) \end{bmatrix} \begin{bmatrix} \theta_1 \\ \theta_2 \\ \vdots \\ \theta_m \end{bmatrix}
 

即:


\boldsymbol{y}_{n\times 1} = \Phi_{n\times m}\,\boldsymbol{\theta}_{m\times 1}, \quad \Phi_{ij}=K_{\lambda_j}(x_i,r_j)

2.1.2 一维特征下的图像特点

  • 固定 \lambda=1,改变 r:曲线整体左右平移,形状不变。

  • 固定 r=0,改变 \lambda\lambda 越大,曲线越“矮胖”;\lambda 越小,曲线越“高瘦”。

 '''使用pyhton作图'''
 import numpy as np
 import matplotlib.pyplot as plt
 ​
 x = np.linspace(-5, 5, 400)
 ​
 # --------------------------------------------------
 # 1) 固定 λ = 1,改变 r
 # --------------------------------------------------
 plt.figure(figsize=(5, 2.5))
 for r in [-2, 0, 2]:
     y = np.exp(-(x - r) ** 2 / 2) / np.sqrt(2 * np.pi)
     plt.plot(x, y, label=f'r = {r}')
 plt.title('λ = 1')
 plt.xlabel('x')
 plt.ylabel('y')
 plt.legend()
 plt.tight_layout()
 plt.show()
 ​
 # --------------------------------------------------
 # 2) 固定 r = 0,改变 λ
 # --------------------------------------------------
 plt.figure(figsize=(5, 2.5))
 for lam in [0.2, 1.0, 2.0]:
     y = np.exp(-(x ** 2) / (2 * lam)) / np.sqrt(2 * np.pi * lam)
     plt.plot(x, y, label=f'λ = {lam}')
 plt.title('r = 0')
 plt.xlabel('x')
 plt.ylabel('y')
 plt.legend()
 plt.tight_layout()
 plt.show()
图1 图2

2.1.3 二维特征下的图像特点

'''使用Python作图'''
 import numpy as np
 import matplotlib.pyplot as plt
 from mpl_toolkits.mplot3d import Axes3D   # noqa: F401  仅用于激活 3D
 ​
 # 1) 网格
 x = np.linspace(-4, 4, 200)
 y = np.linspace(-4, 4, 200)
 X, Y = np.meshgrid(x, y)
 pos = np.dstack((X, Y))                  # (N,N,2)
 ​
 # 2) 二维高斯函数
 def gauss_2d(pos, r, lam1, lam2, theta=0):
     """
     pos   : (N,N,2) 坐标网格
     r     : (2,)    均值向量 [rx, ry]
     lam1  : x 方向方差
     lam2  : y 方向方差
     theta : 旋转角 (rad),默认 0
     """
     Σ = np.array([[lam1, 0],
                   [0, lam2]])
     # 旋转协方差矩阵
     c, s = np.cos(theta), np.sin(theta)
     R = np.array([[c, -s],
                   [s,  c]])
     Σ = R @ Σ @ R.T
 ​
     Σ_inv = np.linalg.inv(Σ)
     det = np.linalg.det(Σ)
 ​
     diff = pos - r                       # (N,N,2)
     # 向量化计算 (x-μ)^T Σ^{-1} (x-μ)
     Z = np.einsum('...k,kl,...l->...', diff, Σ_inv, diff)
     Z = np.exp(-0.5 * Z) / (2 * np.pi * np.sqrt(det))
     return Z
 ​
 # 3) 绘图
 r = np.array([0, 0])
 lam1, lam2 = 1.5, 0.5
 theta = np.pi/6
 Z = gauss_2d(pos, r, lam1, lam2, theta)
 ​
 fig = plt.figure(figsize=(6, 4.5))
 ax = fig.add_subplot(111, projection='3d')
 surf = ax.plot_surface(X, Y, Z, cmap='viridis',
                        linewidth=0, antialiased=True)
 ax.set_xlabel('x')
 ax.set_ylabel('y')
 ax.set_zlabel('G(x,y)')
 ax.set_title(f'2D Gaussian\nr={r}, λ₁={lam1}, λ₂={lam2}, θ={np.degrees(theta):.0f}°')
 fig.colorbar(surf, shrink=0.5, aspect=8)
 plt.tight_layout()
 plt.show()

2.1.4 最优解

数据的拟合函数曲线是这些均值方差不同的高斯分布函数即K_{\lambda_j}(x, r_i)的加权叠加。此外,由于 K_{\lambda_j}(x, r_i) 本身是指数函数,所以它的值必大于 0,\varphi^\top \varphi \succ 0,可用标准方程法,得其最优解为:


\boldsymbol{\theta}^* = (\varphi^\top \varphi)^{-1} \varphi^\top \boldsymbol{y}

2.2 参数的选取

  • 中心点 (r_i):决定高斯核的“位置”

  • 带宽 (\lambda_i):决定高斯核的“胖瘦”。\lambda_i 越大,函数越“胖”,覆盖范围越广。

好的 RBF 模型要求

  1. 中心点分布合理

  2. 带宽足够覆盖足够多的样本点,以提高泛化能力。

例:二维特征空间

  • 若圆心(中心点)选择过少或半径(带宽)过小,模型易出现“群山耸立”现象,泛化能力弱。

  • 通过适当调整中心点和半径,可获得更平滑且泛化性能更好的拟合曲面。

拟合极差的 RBF 模型平面投影图像 拟合较好的 RBF 模型平面投影图像
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐