news 2026/4/20 13:28:41

别再用高次多项式了!用Python重现‘龙格现象’,聊聊机器学习过拟合的直观理解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再用高次多项式了!用Python重现‘龙格现象’,聊聊机器学习过拟合的直观理解

别再用高次多项式了!用Python重现‘龙格现象’,聊聊机器学习过拟合的直观理解

在机器学习项目中,你是否遇到过这样的困惑:模型在训练集上表现近乎完美,一到测试集就惨不忍睹?这种现象背后隐藏着一个数学幽灵——过拟合。今天我们不谈抽象理论,而是用Python代码亲手复现一个1901年就被发现的数学现象:龙格现象。通过这个实验,你会发现过拟合并非机器学习独有的问题,而是数据建模中普遍存在的陷阱。

1. 龙格现象:数学史上的过拟合警示

1901年,德国数学家卡尔·龙格在研究多项式插值时发现了一个反直觉现象:对于某些函数,使用高阶多项式拟合时,随着多项式次数的增加,拟合曲线在样本点之间会出现剧烈震荡,偏离真实函数。这种现象后来被称为"龙格现象"。

让我们用Python代码直观感受这个现象。首先定义龙格研究的经典函数:

import numpy as np import matplotlib.pyplot as plt def runge_function(x): return 1 / (1 + 25 * x**2)

这个看似简单的函数,在多项式拟合时会展现出令人惊讶的行为。我们先绘制这个函数的真实曲线:

x = np.linspace(-2, 2, 1000) y = runge_function(x) plt.figure(figsize=(10, 6)) plt.plot(x, y, label="True function") plt.title("Runge's Function") plt.grid(True) plt.legend() plt.show()

2. 实验设计:从完美拟合到灾难性偏离

现在,我们在这个函数上均匀采样7个点,尝试用不同次数的多项式进行拟合:

sample_x = np.linspace(-2, 2, 7) sample_y = runge_function(sample_x) degrees = [3, 5, 7] colors = ['red', 'green', 'orange'] labels = ['3rd degree', '5th degree', '7th degree'] plt.figure(figsize=(10, 6)) plt.scatter(sample_x, sample_y, color='blue', label='Sample points') for degree, color, label in zip(degrees, colors, labels): coeffs = np.polyfit(sample_x, sample_y, degree) poly = np.poly1d(coeffs) plt.plot(x, poly(x), color=color, label=label) plt.plot(x, y, 'b--', label='True function') plt.legend() plt.grid(True) plt.title("Polynomial Fitting with Different Degrees") plt.show()

观察图像你会发现:

  • 3次多项式虽然不能完美通过所有点,但整体形状与真实函数接近
  • 5次多项式开始出现轻微震荡
  • 7次多项式虽然完美通过所有样本点,但在区间两端出现了剧烈震荡

3. 泛化测试:当模型遇到未见数据

真正的考验在于模型对未见数据的预测能力。让我们把x轴范围扩大到[-10, 10],看看这些拟合多项式在训练区间外的表现:

x_extended = np.linspace(-10, 10, 1000) y_true_extended = runge_function(x_extended) plt.figure(figsize=(12, 7)) plt.plot(x_extended, y_true_extended, 'b--', label='True function') for degree, color, label in zip(degrees, colors, labels): coeffs = np.polyfit(sample_x, sample_y, degree) poly = np.poly1d(coeffs) plt.plot(x_extended, poly(x_extended), color=color, label=label) plt.ylim(-1, 2) # 限制y轴范围以便观察 plt.legend() plt.grid(True) plt.title("Generalization Test: Extended Range") plt.show()

结果令人震惊:

  • 在[-2,2]区间外,高阶多项式完全失控
  • 7次多项式在x=±3处的值已经达到数百,而真实函数值接近0
  • 随着远离原点,高阶多项式的预测变得毫无意义

4. 机器学习中的龙格现象:过拟合的本质

龙格现象完美诠释了机器学习中的过拟合问题。对比两者的特征:

特征龙格现象机器学习过拟合
训练表现完美拟合样本点训练集准确率高
测试表现区间外预测严重偏离测试集表现大幅下降
原因多项式次数过高模型复杂度过高
解决方案选择适当的多项式次数正则化、简化模型、更多数据

在机器学习中,我们常通过以下方法避免过拟合:

  1. 交叉验证:评估模型在未见数据上的表现
  2. 正则化:L1/L2正则化限制参数大小
  3. 早停法:在验证集性能下降时停止训练
  4. 简化模型:选择更简单的模型结构
  5. 数据增强:提供更多样化的训练样本
# 示例:使用L2正则化的线性回归 from sklearn.linear_model import Ridge # 假设X_train, y_train是训练数据 model = Ridge(alpha=1.0) # alpha是正则化强度 model.fit(X_train, y_train)

5. 实用建议:如何在项目中避免过拟合陷阱

基于龙格现象的启示,在实际机器学习项目中:

数据预处理阶段:

  • 确保训练数据具有代表性
  • 考虑使用Chebyshev节点类似的采样策略
  • 对数据进行标准化/归一化处理

模型选择阶段:

  • 从简单模型开始,逐步增加复杂度
  • 使用验证集评估模型泛化能力
  • 考虑集成方法(如随机森林)的天然正则化效果

训练阶段:

  • 监控训练和验证损失曲线
  • 实施学习率调度和梯度裁剪
  • 使用Dropout等技术(对神经网络)

评估阶段:

  • 在多个测试集上评估模型
  • 进行误差分析,识别模型弱点
  • 考虑模型的可解释性

提示:永远记住,模型在训练集上的表现只是故事的一半。真正的考验是模型对未知数据的处理能力。

6. 进阶思考:平衡偏差与方差

龙格现象揭示了模型复杂度与泛化能力之间的权衡,这正是机器学习中偏差-方差权衡的数学体现:

  • 低阶多项式:高偏差(无法很好拟合数据),低方差(对数据变化不敏感)
  • 高阶多项式:低偏差(完美拟合训练数据),高方差(对数据变化过于敏感)

理想情况下,我们需要找到偏差和方差的最佳平衡点。这可以通过学习曲线来分析:

from sklearn.model_selection import learning_curve train_sizes, train_scores, test_scores = learning_curve( estimator, X, y, cv=5, n_jobs=-1) train_mean = np.mean(train_scores, axis=1) test_mean = np.mean(test_scores, axis=1) plt.plot(train_sizes, train_mean, label='Training score') plt.plot(train_sizes, test_mean, label='Cross-validation score') plt.legend() plt.show()

如果训练分数远高于验证分数,很可能出现了过拟合。这时应该考虑简化模型或获取更多数据。

7. 替代方案:分段拟合与样条曲线

面对龙格现象,数学家们发展出了更聪明的拟合方法。这些方法对机器学习也有启发:

  1. 分段低次多项式拟合
    • 将定义域划分为多个区间
    • 在每个区间使用低次多项式
    • 确保区间连接处平滑
from scipy.interpolate import CubicSpline # 三次样条插值 cs = CubicSpline(sample_x, sample_y) plt.plot(x, cs(x), label='Cubic Spline')
  1. 径向基函数(RBF)插值

    • 使用局部影响的基函数
    • 避免全局高阶多项式的问题
  2. 正则化方法

    • 在拟合过程中加入平滑性约束
    • 惩罚高阶导数较大的解

这些方法的核心思想都是:控制模型复杂度,避免为完美拟合噪声而牺牲泛化能力——这正是现代机器学习对抗过拟合的基本哲学。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 13:28:36

技术写作必备:Emoji表情符号分类与应用场景全解析

1. Emoji表情符号的技术写作价值 在技术文档和博客写作中,Emoji早已不是简单的装饰元素。作为全球通用的视觉语言,它能实现文字难以达到的三重效果:视觉引导、情感传递和信息分层。我曾在多个开源项目文档中实测发现,合理使用Emo…

作者头像 李华
网站建设 2026/4/20 13:28:34

CIC滤波器设计避坑指南:如何平衡通带衰减与旁瓣抑制?

CIC滤波器设计避坑指南:如何平衡通带衰减与旁瓣抑制? 在数字信号处理领域,CIC(Cascaded Integrator Comb)滤波器因其结构简单、无需乘法器、适合高速处理等优势,已成为多速率信号处理系统的首选方案。然而&…

作者头像 李华
网站建设 2026/4/20 13:27:32

macOS逆向工程实践:百度网盘SVIP功能本地破解技术深度解析

macOS逆向工程实践:百度网盘SVIP功能本地破解技术深度解析 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 在macOS生态系统中,逆…

作者头像 李华
网站建设 2026/4/20 13:26:35

硬件工程师的效率之选:VOOHU集成式RJ45连接器选型全攻略

在交换机、工业路由器、PoE摄像头等设备的主板设计中,RJ45以太网接口几乎是标配。传统方案中,一个完整的网口需要一颗RJ45插座加一颗网络变压器,两者通过PCB走线连接。这种分离方案虽然灵活,但也带来了布局面积大、走线阻抗难控、…

作者头像 李华
网站建设 2026/4/20 13:26:32

Mac/Win电脑端一键下载蒲公英IPA安装包:绕过手机扫码的终极命令行教程

Mac/Win电脑端一键下载蒲公英IPA安装包:绕过手机扫码的终极命令行教程 每次在蒲公英平台下载IPA文件都要掏出手机扫码,是不是觉得效率太低?作为开发者,我们完全可以通过命令行实现自动化下载。本文将手把手教你如何用终端直接获取…

作者头像 李华