降低数据噪音

Pic*_*Man 6 python noise kalman-filter

我有2个列表,其中包含数据点.

x = ["bunch of data points"]
y = ["bunch of data points"]
Run Code Online (Sandbox Code Playgroud)

我在python中使用matplotlib生成了一个图形

import matplotlib.pyplot as plt

plt.plot(x, y, linewidth=2, linestyle="-", c="b")
plt.show()
plt.close()
Run Code Online (Sandbox Code Playgroud)

我能减少数据上的噪音吗?卡尔曼滤波器会在这里工作吗?

在此输入图像描述

Lyk*_*Syu 14

这取决于您如何定义"噪音"及其产生方式.由于您没有提供有关您的案例的大量信息,我将把您的问题称为"如何使曲线平滑".卡尔曼滤波器可以做到这一点,但它太复杂了,我更喜欢简单的IIR滤波器

import matplotlib.pyplot as plt

mu, sigma = 0, 500

x = np.arange(1, 100, 0.1)  # x axis
z = np.random.normal(mu, sigma, len(x))  # noise
y = x ** 2 + z # data
plt.plot(x, y, linewidth=2, linestyle="-", c="b")  # it include some noise
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

过滤后

from scipy.signal import lfilter

n = 15  # the larger n is, the smoother curve will be
b = [1.0 / n] * n
a = 1
yy = lfilter(b,a,y)
plt.plot(x, yy, linewidth=2, linestyle="-", c="b")  # smooth by filter
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

lfilter是一个来自scipy.signal的函数.

顺便说一下,如果你想使用卡尔曼滤波器进行平滑处理,scipy也提供了一个例子.卡尔曼滤波器也应该适用于这种情况,只是没有必要.


Mar*_*ani 6

如果您正在处理时间序列,我建议您使用tsmoothie:一个用于以矢量化方式进行时间序列平滑和异常值检测的 python 库。

它提供了不同的平滑算法以及计算间隔的可能性。

这里我使用的是一个,ConvolutionSmoother但你也可以测试其他的。(也KalmanSmoother可用)

import numpy as np
import matplotlib.pyplot as plt
from tsmoothie.smoother import *

mu, sigma = 0, 500
x = np.arange(1, 100, 0.1)  # x axis
z = np.random.normal(mu, sigma, len(x))  # noise
y = x ** 2 + z # data

# operate smoothing
smoother = ConvolutionSmoother(window_len=30, window_type='ones')
smoother.smooth(y)

# generate intervals
low, up = smoother.get_intervals('sigma_interval', n_sigma=3)

# plot the smoothed timeseries with intervals
plt.figure(figsize=(11,6))
plt.plot(smoother.data[0], color='orange')
plt.plot(smoother.smooth_data[0], linewidth=3, color='blue')
plt.fill_between(range(len(smoother.data[0])), low[0], up[0], alpha=0.3)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我还指出 tsmoothie 可以以矢量化的方式对多个时间序列进行平滑


U3.*_*926 5

根据您要消除噪声的程度,还可以使用中的Savitzky-Golay滤波器scipy

下面以@ lyken-syu为例:

import matplotlib.pyplot as plt
import numpy as np
mu, sigma = 0, 500
x = np.arange(1, 100, 0.1)  # x axis
z = np.random.normal(mu, sigma, len(x))  # noise
y = x ** 2 + z # data
plt.plot(x, y, linewidth=2, linestyle="-", c="b")  # it include some noise
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

并应用Savitzky-Golay滤镜

from scipy.signal import savgol_filter
w = savgol_filter(y, 101, 2)
plt.plot(x, w, 'b')  # high frequency noise removed
Run Code Online (Sandbox Code Playgroud)

window_length = 101

将增大window_length到501:

window_length = 501

此处阅读有关过滤器的更多信息