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也提供了一个例子.卡尔曼滤波器也应该适用于这种情况,只是没有必要.
如果您正在处理时间序列,我建议您使用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 可以以矢量化的方式对多个时间序列进行平滑
根据您要消除噪声的程度,还可以使用中的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
到501:
在此处阅读有关过滤器的更多信息