📜  如何在python中平滑函数(1)

📅  最后修改于: 2023-12-03 15:38:36.310000             🧑  作者: Mango

如何在 Python 中平滑函数

平滑函数的目的是将原始数据中的噪声和波动减少,使数据更加平稳。这在数据预处理和分析中非常重要。在 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 滤波器

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 滤波器。每种方法都有其适用的场景,具体的应用需要根据实际情况进行选择。