📅  最后修改于: 2023-12-03 15:38:36.310000             🧑  作者: Mango
平滑函数的目的是将原始数据中的噪声和波动减少,使数据更加平稳。这在数据预处理和分析中非常重要。在 Python 中,有许多方法可以平滑函数,下面我们将介绍其中的一些方法。
移动平均是常用的一种平滑方法,它的原理是用前几个数据的平均值来代替当前数据。例如,我们可以用一个窗口大小为3的移动平均来平滑一个序列,如下所示:
def moving_average(x, w):
return np.convolve(x, np.ones(w), 'valid') / w
其中 x
是原始数据,w
是窗口大小。在实现中,我们使用了 numpy 库中的 convolve 函数,它可以对两个序列进行卷积操作。具体来说,我们使用一个全为1的序列来与原始数据进行卷积,并取结果的有效部分作为平均值。
加权移动平均与普通移动平均的区别在于每个数据点的权重不同。例如,我们可以使用一个下降的权重向量作为权重,使得最近的数据点具有较大的权重,而离当前时间较远的数据点则具有较小的权重。代码如下所示:
def weighted_moving_average(x, w):
weights = np.exp(np.linspace(-1., 0., w))
weights /= weights.sum()
return np.convolve(x, weights, mode='valid')
其中,weights
是权重向量,其元素值是指数分布。在实现中,我们使用了 linspace 函数生成一个长度为 w 的指数分布序列,然后将其进行归一化处理,以得到最终的权重向量。
指数加权移动平均是一种对数据进行加权处理的方法,最近的数据点具有更高的权重。具体来说,我们可以使用一个指数函数将最近的数据点保留,并以指数函数下降的速度逐渐减少权重。代码如下所示:
def exponential_moving_average(x, alpha):
# 初始化平均数为第一个值
ema = [x[0]]
for i in range(1, len(x)):
# 计算指数加权平均数
ema.append(alpha * x[i] + (1 - alpha) * ema[i-1])
return ema
其中,alpha
是一个超参数,称为平滑因子。在实现中,我们使用了一个 for 循环来迭代计算指数加权平均数,其中的 alpha 参数将最近的值保留下来,并以指数函数下降的速度逐渐减少权重。
Savitzky-Golay 滤波器是一种基于多项式拟合的平滑方法,与移动平均和加权移动平均不同,它不是一种基于窗口的方法。相反,它使用多项式拟合来建立数据点之间的关系,从而在不丢失信息的同时消除噪声。代码如下所示:
from scipy.signal import savgol_filter
def savitzky_golay(x, window_size, order):
return savgol_filter(x, window_size, order)
其中,window_size
是滑动窗口的大小,order
是拟合多项式的阶数。在实现中,我们使用了 SciPy 库中的 savgol_filter 函数,它可以对序列进行多项式拟合,并返回平滑后的结果。
本文介绍了几种在 Python 中平滑函数的方法,包括移动平均、加权移动平均、指数加权移动平均和 Savitzky-Golay 滤波器。每种方法都有其适用的场景,具体的应用需要根据实际情况进行选择。