当前位置: 首页 > news >正文

各种插值方法的Python实现

插值方法的Python实现

1. 线性插值(Linear Interpolation)
  • 原理:用直线连接相邻数据点,计算中间点的值。

  • 实现

    import numpy as np
    from scipy.interpolate import interp1dx = np.array([0, 1, 2, 3, 4])
    y = np.array([0, 2, 1, 3, 4])
    f = interp1d(x, y, kind='linear')  # 创建插值函数
    x_new = np.linspace(0, 4, 10)
    y_new = f(x_new)  # 插值结果
  • 优点:计算快,结果稳定。

  • 缺点:曲线不平滑,不适用于高波动数据。

  • 场景:实时数据处理、简单填充缺失值。

2. 多项式插值(Polynomial Interpolation)
  • 原理:通过多项式拟合所有数据点(如拉格朗日多项式)。

  • 实现

    from scipy.interpolate import lagrangepoly = lagrange(x, y)  # 生成拉格朗日多项式
    y_new = poly(x_new)
  • 优点:严格通过所有数据点。

  • 缺点:高阶多项式易过拟合(龙格现象)。

  • 场景:理论分析、低阶多项式插值。

3. 三次样条插值(Cubic Spline)
  • 原理:分段三次多项式,保证一阶和二阶导数连续。

  • 实现

    f = interp1d(x, y, kind='cubic')
    y_new = f(x_new)
  • 优点:曲线平滑,适合连续数据。

  • 缺点:计算量较大。

  • 场景:自然信号(如音频、图像)、平滑曲线生成。

4. 最近邻插值(Nearest-neighbor)
  • 原理:取距离最近的已知点的值。

  • 实现

    f = interp1d(x, y, kind='nearest')
    y_new = f(x_new)
  • 优点:保留数据离散特性。

  • 缺点:阶梯状不连续。

  • 场景:分类数据插值、图像像素处理。

5. Pandas 内置插值
  • 原理:直接对 Series 或 DataFrame 进行缺失值填充。

  • 实现

    import pandas as pds = pd.Series([1, np.nan, 3, np.nan, 5])
    s_interp = s.interpolate(method='linear')  # 可选 cubic, quadratic, spline 等
  • 方法参数

    • method='time':按时间索引插值。

    • method='spline':需指定 order(多项式阶数)。

  • 场景:时间序列数据清洗、缺失值填充。

进阶功能

1. 外推(Extrapolation)
  • 功能:允许对超出原始数据范围的点进行插值。

  • 实现

    f = interp1d(x, y, kind='cubic', fill_value='extrapolate')
    y_ext = f([-1, 5])  # 外推 x=-1 和 x=5 的值
2. 非均匀数据插值
  • 问题:当数据点非均匀分布时,需指定插值轴参数。

  • 示例

    x = np.array([0, 2, 5, 9])  # 非均匀分布
    y = np.array([3, 1, 4, 2])
    f = interp1d(x, y, kind='linear', assume_sorted=False)
3. Akima 插值
  • 特点:避免三次样条的过度震荡。

  • 实现

    from scipy.interpolate import Akima1DInterpolatorakima = Akima1DInterpolator(x, y)
    y_new = akima(x_new)

方法对比与选型

方法平滑性计算速度外推支持适用场景
线性插值实时计算、简单填充
三次样条自然信号、平滑曲线
多项式插值理论分析、低阶数据
最近邻极快离散分类数据
Pandas 插值可调部分支持时间序列、表格数据清洗

注意事项

  1. 单调性要求
    大多数插值方法要求 x 数据单调递增,否则会报错。若数据无序,需先排序:

    sorted_idx = np.argsort(x)
    x_sorted = x[sorted_idx]
    y_sorted = y[sorted_idx]

  2. 缺失值处理
    SciPy插值函数不支持输入含 NaN 的数据,需预先删除或填充:

    y_clean = y[~np.isnan(y)]

  3. 性能优化
    对超大数据(如百万级数据点),优先使用 kind='linear' 或 kind='nearest'

完整示例

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d# 原始数据
x = np.array([0, 2, 3, 5, 8])
y = np.array([1, 4, 2, 6, 3])# 生成插值函数(三次样条)
f_cubic = interp1d(x, y, kind='cubic', fill_value='extrapolate')
x_new = np.linspace(0, 8, 100)
y_cubic = f_cubic(x_new)# 绘图对比
plt.scatter(x, y, color='red', label='原始数据')
plt.plot(x_new, y_cubic, label='三次样条插值')
plt.legend()
plt.show()

http://www.xdnf.cn/news/117343.html

相关文章:

  • BERT BERT
  • 精益数据分析(21/126):剖析创业增长引擎与精益画布指标
  • 4.3 工具调用与外部系统集成:API调用、MCP(模型上下文协议)、A2A、数据库查询与信息检索的实现
  • 实战交易策略 篇十九:君山居士熊市交易策略
  • 如何自己电脑上部署DeepSeek,并且接口访问?
  • 摘要 | 李录在北大光华管理学院的演讲《价值投资》
  • express的介绍,简单使用
  • ES6 模块化 与 CommonJS 的核心概念解析
  • java 富文本转pdf
  • 《100天精通Python——基础篇 2025 第1天:从编程语言到计算机基础,开启你的学习之旅》
  • 数据仓库建设全解析!
  • 【动手学大模型开发】什么是大语言模型
  • Crawl4AI 部署安装及 n8n 调用,实现自动化工作流(保证好使)
  • Redis LRU策略深度解析
  • 深度理解spring——BeanFactory的实现
  • # 代码随想录算法训练营Day37 | Leetcode300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组
  • 民锋视角下的节奏判断与资金行为建模
  • 自动化测试常见面试题(上)
  • Oracle数据库巡检脚本
  • 怎么配置一个kubectl客户端访问多个k8s集群
  • MySQL 安装配置教程(含性能优化)
  • BY免费空间去掉?i=1
  • Restful接口学习
  • 强化学习(Reinforcement Learning, RL)和深度学习(Deep Learning, DL)
  • 自建商城安全指南:多维度保障商城稳健运营
  • Vue3集成浏览器API实时语音识别
  • 源码篇 剖析 Vue 双向绑定原理
  • React+TypeScript:现代化前端路由导航系统开发详解
  • 使用Next.js构建单页面React应用
  • 使用 VMware 安装一台 Linux 系统之Ubuntu