大数跨境

最强对比!参数模型 vs 非参数模型 !!

最强对比!参数模型 vs 非参数模型 !! 机器学习和人工智能AI
2026-07-31
0

哈喽,大家好~

今儿和大家来聊一个话题:参数模型 vs 非参数模型~

在我们所接触的统计学习与机器学习中,“参数模型”和“非参数模型”是两条重要思路。

它们在假设空间、估计目标、复杂度控制、计算方式和适用场景上都有本质区别。

核心概念

参数模型

核心思想:先验地假设数据服从某个有限维参数族的分布或函数形态,即用一个固定维度的参数向量  来刻画模型。随着样本量 增大,参数维度 保持不变。

典型例子:线性回归、逻辑回归、朴素贝叶斯、固定结构的广义线性模型、固定宽度的神经网络(严格来说也是参数模型,只是参数非常多)。

优势:推断与计算常有闭式解或稳定数值算法,样本效率高、可解释性好、外推能力强(当结构假设贴近真实机制)。

劣势:模型错设(misspecification)会导致系统性偏差;表达能力受限。

非参数模型

核心思想:尽量不做刚性结构假设,允许模型复杂度随数据量而增长,甚至可以是在无限维函数空间中直接估计函数 或密度

典型例子:核密度估计(KDE)、 近邻(kNN)、决策树与随机森林、样条与局部加权回归、核方法(如核岭回归、支持向量机)、高斯过程回归(GPR)、Dirichlet过程混合(贝叶斯非参数)。

优势:表达能力强,适应复杂非线性关系,减少模型错设风险,往往更擅长“插值”与局部结构学习。

劣势:计算成本高、样本需求大、调参复杂(带宽/长度尺度/树深等),不恰当设置容易过拟合;外推能力弱(尤其纯局部方法)。

简要区分:

  • 参数模型:估计有限维  ;非参数模型:估计无限维对象(函数、分布或在隐式高维空间中的系数),复杂度可随 增长。
  • 参数模型强调“结构先验”与“低维推断”;非参数模型强调“灵活函数空间”与“数据驱动的复杂度选择”。

参数模型的原理

以线性回归为例,假设数据   满足

其中  ,参数向量 

最大似然估计(MLE)

似然函数(高斯噪声):

对数似然:

MLE等价于最小化平方损失:

正规方程:

  可逆,则

岭回归(Ridge)

为抑制多重共线性或过拟合,加入 正则:

闭式解:

渐近性质与Fisher信息

在正则条件下, 一致并服从渐近正态分布:

其中   为Fisher信息矩阵。此性质体现了参数模型在样本量增大时的高效性(  收敛率)。

结构假设与外推能力

如果真实生成机制确实接近线性(或所选参数族),参数模型往往具备稳定外推能力,例如在没有数据的区域,线性结构仍能给出合理预测。

非参数模型的原理

非参数模型不预设有限维参数结构,下面以核方法与高斯过程为代表。

核密度估计(KDE)

估计密度

其中 为带宽, 为核函数(如高斯核)。随着 增大,估计的有效自由度增加(取决于 与样本分布),无固定维度参数。

核岭回归(KRR)

目标是回归函数 ,在再生核Hilbert空间(RKHS)中最小化:

由代表定理(Representer Theorem),最优解具有形式:

系数 由线性系统求解:

其中 为核矩阵。注意参数维度与样本数 同阶,复杂度随数据增长。

高斯过程回归(GPR)

将函数 视为一个高斯过程:

在观测 条件下,给定新点 的后验为高斯:

为训练核矩阵,$ \mathbf{k}\star = [k(x\star, x_1),\dots,k(x_\star, x_n)]^\top   k_{\star\star} = k(x_\star,x_\star) $。

后验均值:

后验方差:

高斯过程并非估计有限维参数,而是对无限维函数的分布进行推断;核超参数(如长度尺度)控制函数空间的平滑性与复杂度。

局部方法与树模型

近邻回归:

个最近邻下标。随着 增大、 调整,复杂度随数据而变。

决策树/随机森林:不设函数的解析形式,通过数据驱动的分裂规则构建模型,复杂度随树深和数据量增长。

复杂度与统计收敛率比较

参数模型的估计误差在正则条件下具有 级别的收敛率;若模型错设(真实函数不在参数族内),则偏差成为主要瓶颈。

非参数模型在 维输入、假设真实函数具有 阶平滑性的情况下,其最优均方误差收敛率典型为:

维度灾难体现在分母中出现 ,维度越高,样本需求增长越快。

VC维与泛化:参数模型往往具有固定或可控的VC维;非参数模型(如核方法、树模型)VC维或Rademacher复杂度可能随 增长,需要正则化或早停来控制。

偏差-方差分解与不确定性估计

对于回归问题,以平方损失下的点 处误差分解为例:

参数模型在正确设定时偏差小、方差也可控;错设时偏差显著。

非参数模型偏差更小(更灵活),但若正则与带宽不当,方差可能很大。调参核心是平衡偏差与方差。

不确定性估计:

参数模型可通过渐近正态与协方差估计提供参数置信区间;预测不确定性可通过Delta方法等。

高斯过程直接给出预测方差;核方法也可通过近似手段评估不确定性。

完整案例

我们用一个合成数据回归问题来比较两者的行为。

数据生成带有非线性与异方差噪声,便于观察两类模型的差异。

真值函数:

噪声:

参数模型:多项式特征 + 岭回归(固定有限维参数)

非参数模型:高斯过程回归(RBF核 + 白噪声核,复杂度随 增长)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.linear_model import Ridge
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import RBF, WhiteKernel, ConstantKernel as C
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

np.random.seed(42)

# 1) 数据集
def f_true(x):
    return np.sin(2*np.pi*x) + 0.3*np.cos(5*np.pi*x) + 0.5*(x**2)

def noise_sigma(x):
    return 0.1 + 0.4*x

n_train = 60
n_test = 400

X = np.random.rand(n_train, 1)
y = f_true(X.flatten()) + np.random.randn(n_train) * noise_sigma(X.flatten())

X_test = np.linspace(01, n_test).reshape(-11)
y_true_test = f_true(X_test.flatten())

# 2) 定义参数模型:多项式岭回归
degree_fixed = 5
alpha_ridge = 1.0

param_model = Pipeline([
    ("poly", PolynomialFeatures(degree=degree_fixed, include_bias=False)),
    ("ridge", Ridge(alpha=alpha_ridge))
])

param_model.fit(X, y)
y_pred_param = param_model.predict(X_test)
rmse_param = np.sqrt(mean_squared_error(y_true_test, y_pred_param))

# 3) 定义非参数模型:高斯过程回归 (RBF + WhiteKernel)
kernel = C(1.0, (1e-31e3)) * RBF(length_scale=0.15, length_scale_bounds=(1e-21e1)) + WhiteKernel(noise_level=1e-3)
gpr = GaussianProcessRegressor(kernel=kernel, alpha=0.0, normalize_y=True, n_restarts_optimizer=3, random_state=42)
gpr.fit(X, y)
y_pred_gpr, y_std_gpr = gpr.predict(X_test, return_std=True)
rmse_gpr = np.sqrt(mean_squared_error(y_true_test, y_pred_gpr))

# 4) 残差分析(对测试集)
res_param = y_pred_param - y_true_test
res_gpr = y_pred_gpr - y_true_test

# 5) 学习曲线:不同训练样本量下的RMSE
train_sizes = [102030405060]
repeats = 20
rmse_param_means, rmse_param_stds = [], []
rmse_gpr_means, rmse_gpr_stds = [], []

def make_param_model(degree=5, alpha=1.0):
    return Pipeline([
        ("poly", PolynomialFeatures(degree=degree, include_bias=False)),
        ("ridge", Ridge(alpha=alpha))
    ])

def make_gpr_model(length_scale=0.15):
    kernel = C(1.0)*RBF(length_scale=length_scale) + WhiteKernel(noise_level=1e-3)
    return GaussianProcessRegressor(kernel=kernel, normalize_y=True, random_state=42)

for n in train_sizes:
    rmses_p = []
    rmses_g = []
    for r in range(repeats):
        Xr = np.random.rand(n, 1)
        yr = f_true(Xr.flatten()) + np.random.randn(n)*noise_sigma(Xr.flatten())
        # Param
        pm = make_param_model(degree=degree_fixed, alpha=alpha_ridge)
        pm.fit(Xr, yr)
        ypr = pm.predict(X_test)
        rmses_p.append(np.sqrt(mean_squared_error(y_true_test, ypr)))
        # GPR
        gm = make_gpr_model(length_scale=0.15)
        gm.fit(Xr, yr)
        ypg = gm.predict(X_test)
        rmses_g.append(np.sqrt(mean_squared_error(y_true_test, ypg)))
    rmse_param_means.append(np.mean(rmses_p))
    rmse_param_stds.append(np.std(rmses_p))
    rmse_gpr_means.append(np.mean(rmses_g))
    rmse_gpr_stds.append(np.std(rmses_g))

rmse_param_means = np.array(rmse_param_means)
rmse_param_stds = np.array(rmse_param_stds)
rmse_gpr_means = np.array(rmse_gpr_means)
rmse_gpr_stds = np.array(rmse_gpr_stds)

# 6) 超参数敏感性:参数模型(多项式阶数)、非参数模型(RBF长度尺度)
degrees = list(range(116))
ls_values = np.array([0.050.080.10.150.20.30.50.8])
rmse_vs_degree = []
for d in degrees:
    pm = make_param_model(degree=d, alpha=alpha_ridge)
    pm.fit(X, y)
    ypd = pm.predict(X_test)
    rmse_vs_degree.append(np.sqrt(mean_squared_error(y_true_test, ypd)))
rmse_vs_degree = np.array(rmse_vs_degree)

rmse_vs_ls = []
for ls in ls_values:
    gm = make_gpr_model(length_scale=ls)
    gm.fit(X, y)
    ypl = gm.predict(X_test)
    rmse_vs_ls.append(np.sqrt(mean_squared_error(y_true_test, ypl)))
rmse_vs_ls = np.array(rmse_vs_ls)

# 7) 画图(四联图,颜色鲜艳)
plt.figure(figsize=(1612))
plt.suptitle("参数模型 vs 非参数模型:拟合、残差、学习曲线与超参数敏感性", fontsize=16, fontweight='bold')

# (1) 拟合曲线与不确定性
ax1 = plt.subplot(221)
ax1.scatter(X.flatten(), y, color='orange', s=40, alpha=0.8, label='训练数据')
ax1.plot(X_test.flatten(), y_true_test, color='limegreen', lw=2.5, label='真值函数 f*')
ax1.plot(X_test.flatten(), y_pred_param, color='crimson', lw=2.5, label=f'参数-多项式岭回归 (deg={degree_fixed})')
ax1.plot(X_test.flatten(), y_pred_gpr, color='royalblue', lw=2.5, label='非参数-高斯过程回归')
ax1.fill_between(X_test.flatten(), y_pred_gpr - 2*y_std_gpr, y_pred_gpr + 2*y_std_gpr, color='royalblue', alpha=0.15, label='GPR ±2σ')
ax1.set_title(f"拟合曲线(RMSE: Param={rmse_param:.3f}, GPR={rmse_gpr:.3f})")
ax1.set_xlabel("x")
ax1.set_ylabel("y")
ax1.legend(loc='upper left')

# (2) 残差随 x 的分布
ax2 = plt.subplot(222)
ax2.scatter(X_test.flatten(), res_param, color='crimson', s=18, alpha=0.8, label='Param 残差')
ax2.scatter(X_test.flatten(), res_gpr, color='deepskyblue', s=18, alpha=0.6, label='GPR 残差')
# 局部平滑(移动平均)
window = 15
def moving_avg(arr, w=15):
    return np.convolve(arr, np.ones(w)/w, mode='same')
ax2.plot(X_test.flatten(), moving_avg(res_param, window), color='magenta', lw=2.5, label='Param 残差平滑')
ax2.plot(X_test.flatten(), moving_avg(res_gpr, window), color='gold', lw=2.5, label='GPR 残差平滑')
ax2.axhline(0, color='black', linestyle='--', lw=1.5)
ax2.set_title("残差结构对比(系统性偏差 vs 局部误差)")
ax2.set_xlabel("x")
ax2.set_ylabel("残差 y_pred - y_true")
ax2.legend(loc='upper right')

# (3) 学习曲线:RMSE vs 训练样本量
ax3 = plt.subplot(223)
ax3.plot(train_sizes, rmse_param_means, color='crimson', marker='o', lw=2.5, label='Param 平均RMSE')
ax3.fill_between(train_sizes, rmse_param_means - rmse_param_stds, rmse_param_means + rmse_param_stds, color='crimson', alpha=0.2)
ax3.plot(train_sizes, rmse_gpr_means, color='royalblue', marker='s', lw=2.5, label='GPR 平均RMSE')
ax3.fill_between(train_sizes, rmse_gpr_means - rmse_gpr_stds, rmse_gpr_means + rmse_gpr_stds, color='royalblue', alpha=0.2)
ax3.set_title("学习曲线(样本效率与方差比较)")
ax3.set_xlabel("训练样本量 n")
ax3.set_ylabel("测试 RMSE")
ax3.legend(loc='upper right')
ax3.grid(alpha=0.3)

# (4) 超参数敏感性:多项式阶数 vs GPR 长度尺度
ax4 = plt.subplot(224)
ax4.plot(degrees, rmse_vs_degree, color='darkviolet', marker='o', lw=2.5, label='Param: 多项式阶数')
ax4.plot(ls_values, rmse_vs_ls, color='forestgreen', marker='s', lw=2.5, label='GPR: RBF 长度尺度')
ax4.set_title("超参数敏感性(过/欠拟合的权衡)")
ax4.set_xlabel("左轴: 多项式阶数 d | 右轴: RBF 长度尺度 ℓ")
# 为了在同一子图展示,两条曲线共用x轴,但刻度不同;辅助文本说明
ax4.legend(loc='upper right')
ax4.grid(alpha=0.3)

plt.tight_layout(rect=[00.0310.95])
plt.show()

拟合曲线与不确定性

展示参数模型(多项式岭回归)与非参数模型(GPR)对真实非线性函数的拟合能力。

GPR的阴影带显示预测不确定性(±2σ),能反映数据稀疏区域或外推时的不确定性。

残差随 分布

观察系统性偏差(例如在某些区间参数模型残差显著偏正或偏负)。

局部平滑曲线揭示残差趋势,辅助诊断模型错设与带宽/长度尺度设置是否合理。

学习曲线

比较随着训练样本量增加,模型的测试误差如何下降。

阴影带为重复实验的标准差,反映训练数据抽样引起的不稳定性(方差)。

超参数敏感性

参数模型的多项式阶数 过小→欠拟合,过大→过拟合;存在最优区间。

非参数模型的长度尺度 过小→过拟合(太局部),过大→欠拟合(过平滑)。

总结

本质区别是,参数模型通过有限维参数   描述数据生成机制,复杂度固定;非参数模型通过函数空间(或隐式无限维表示)直接拟合数据关系,复杂度随样本增长。

偏差-方差权衡方面,参数模型偏差可能较大(若错设),但方差可控、样本效率高;非参数模型偏差较小(灵活),但若调参不当方差较大,样本需求更高。

收敛与计算的话,参数模型常具 级渐近性质与闭式或高效数值解;非参数模型常需核矩阵运算( )或复杂分治策略,计算成本较高。

【声明】内容源于网络
0
0
机器学习和人工智能AI
让我们一起期待 AI 带给我们的每一场变革!推送最新行业内最新最前沿人工智能技术!
内容 381
粉丝 0
机器学习和人工智能AI 让我们一起期待 AI 带给我们的每一场变革!推送最新行业内最新最前沿人工智能技术!
总阅读5.0k
粉丝0
内容381