python - 从传入数据点生成平滑曲线的算法

标签 python gaussian smoothing

我正在寻找一种算法,可以在点出现时平滑地进行插值实时

例如,假设我从 10 个 (x,y) 对的数组开始。我目前正在使用 scipy 和高斯窗口来生成平滑曲线。然而,我不知道如何更新平滑曲线以响应在未来某个点生成的第 11 个点(无需完全重新对所有 11 个点进行平滑)。

我正在寻找一种算法,遵循先前的平滑曲线直到第 10 个 (x,y) 对,并且在第 10 个和第 10 个之间平滑插值第 11 对(类似于重做整个算法 - 所以没有尖锐的边缘)。有没有什么东西可以满足我的需求?

最佳答案

我认为你可以使用 Cubic Spline 。给定一个列表 n积分(x_1, y_1)..(x_n, y_n) ,算法找到三次多项式 p_k之间(x_k, y_k)(x_{k+1}, y_{k+1})具有以下约束:

  • 多项式p_kp_{k+1}经过点(x_{k+1}, y_{k+1}) ;
  • 多项式p_kp_{k+1}(x_{k+1}, y_{k+1}) 处具有相同的一阶导数;
  • 多项式p_kp_{k+1}(x_{k+1}, y_{k+1}) 处具有相同的二阶导数.

此外,还有一些为第一个和最后一个多项式定义的边界条件。我用过natural ,这会迫使曲线末端的二阶导数为零。

您可以应用的步骤是:

  1. 使用三次样条插值前 10 个点。
  2. p_10 处分配一阶导数值到变量d .
  3. 运行 p_10 的三次样条和p_11 ,强制执行 p_10 处的一阶导数是 d以及 p_11 处的二阶导数为零。

从那里,您可以对剩余的点重复相同的步骤。

此代码将为所有点生成插值:

import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import CubicSpline

height=4
n = 20
x = np.arange(n)
xs = np.arange(-0.1,n+0.1,0.1)
y = np.random.uniform(low=0, high=height, size=n)

plt.plot(x, y, 'o', label='data')
cs = CubicSpline(x, y)
plt.plot(xs, cs(xs), color='orange')
plt.ylim([0, height+1])

Interpolation for 20 points

现在,此代码将对前 10 个点进行插值,然后在点 10 和 11 之间进行另一个插值:

k = 10
delta = 0.001

plt.plot(x, y, 'o', label='data')
xs = np.arange(x[0], x[k-1]+delta, delta)
cs = CubicSpline(x[0:k], y[0:k])
plt.plot(xs, cs(xs), color='red')

d = cs(x[k-1], 1)

xs2 = np.arange(x[k-1], x[k]+delta, delta)
cs2 = CubicSpline(x[k-1:k+1], y[k-1:k+1], bc_type=((1, d), 'natural'))
plt.plot(xs2, cs2(xs2), color='blue')

plt.ylim([0, height+1])

enter image description here

关于python - 从传入数据点生成平滑曲线的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58403578/

相关文章:

Python urllib 添加 useragent header

python - PyQt4中如何通过代理发起请求

python - 平滑循环数据

Python如何知道记录是否成功插入

python - 有没有办法在 Python for 循环中访问迭代计数器?

ios - 高斯模糊滤镜反转 : iOS

c - 尝试在 C 中实现高斯滤波器

python - 高斯拟合无法使用 Python

python - 高斯平滑python中的图像

html - 使用CSS平滑滚动