用于不规则间隔点的高斯和滤波器

Mag*_*n88 7 python numpy smooth gaussian scipy

我有一组点(x,y)作为两个向量x,y,例如:

from pylab import *
x = sorted(random(30))
y = random(30)
plot(x,y, 'o-')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在我想用高斯来平滑这些数据,并仅在x轴上的某些(规则间隔)点处对其进行评估.让我们说:

x_eval = linspace(0,1,11)
Run Code Online (Sandbox Code Playgroud)

我得到了一个提示,这个方法被称为"高斯和滤波器",但到目前为止,我还没有在numpy/scipy中找到任何实现,尽管它看起来似乎是一个标准问题乍一看.由于x值不是等间距,我不能使用scipy.ndimage.gaussian_filter1d.

通常这种平滑是通过毛皮空间并与内核相乘来完成的,但我真的不知道这是否可以使用不规则间隔的数据.

谢谢你的任何想法

Jai*_*ime 9

对于非常大的数据集,这将会爆炸,但您要求的正确计算将按如下方式进行:

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0) # for repeatability
x = np.random.rand(30)
x.sort()
y = np.random.rand(30)

x_eval = np.linspace(0, 1, 11)
sigma = 0.1

delta_x = x_eval[:, None] - x
weights = np.exp(-delta_x*delta_x / (2*sigma*sigma)) / (np.sqrt(2*np.pi) * sigma)
weights /= np.sum(weights, axis=1, keepdims=True)
y_eval = np.dot(weights, y)

plt.plot(x, y, 'bo-')
plt.plot(x_eval, y_eval, 'ro-')
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述