如何在python中平滑曲线
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/22988882/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
how to smooth a curve in python
提问by elviuz
I have an entropy curve (1d numpy array) but this curve has a lot of noise. I would like to delete the noise with a smoothing.
我有一条熵曲线(1d numpy 数组),但这条曲线有很多噪音。我想通过平滑删除噪音。
This is the plot of my curve:
这是我的曲线图:
I have tried to solve this issue making a convolution product with a Kaiser-Bessel filter:
我试图用 Kaiser-Bessel 滤波器制作卷积产品来解决这个问题:
gaussian_curve = window_kaiser(windowLength, beta=20) # kaiser filter
gaussian_curve = gaussian_curve / sum(gaussian_curve)
for i in range(0, windows_number):
start = (i * step) + 1
end = (i * step) + windowLength
convolution[i] = (np.convolve(entropy[start:end + 1], gaussian_curve, mode='valid'))
entropy[i] = convolution[i][0]
but this code returns this error:
但此代码返回此错误:
File "/usr/lib/python2.7/dist-packages/numpy/core/numeric.py", line 822, in convolve
raise ValueError('v cannot be empty')
ValueError: v cannot be empty
the numpy.convolveoperator with 'valid' mode, returns the central element in the overlap but, in this case, returns an empty element.
具有“有效”模式的numpy.convolve运算符返回重叠中的中心元素,但在这种情况下,返回一个空元素。
is there a simple way to apply a smoothing?
有没有一种简单的方法来应用平滑?
thanks!
谢谢!
采纳答案by elviuz
ok, I solved. I have used another approach: Savitzky-Golay filter
好的,我解决了。我使用了另一种方法:Savitzky-Golay filter
The code:
编码:
def savitzky_golay(y, window_size, order, deriv=0, rate=1):
import numpy as np
from math import factorial
try:
window_size = np.abs(np.int(window_size))
order = np.abs(np.int(order))
except ValueError, msg:
raise ValueError("window_size and order have to be of type int")
if window_size % 2 != 1 or window_size < 1:
raise TypeError("window_size size must be a positive odd number")
if window_size < order + 2:
raise TypeError("window_size is too small for the polynomials order")
order_range = range(order+1)
half_window = (window_size -1) // 2
# precompute coefficients
b = np.mat([[k**i for i in order_range] for k in range(-half_window, half_window+1)])
m = np.linalg.pinv(b).A[deriv] * rate**deriv * factorial(deriv)
# pad the signal at the extremes with
# values taken from the signal itself
firstvals = y[0] - np.abs( y[1:half_window+1][::-1] - y[0] )
lastvals = y[-1] + np.abs(y[-half_window-1:-1][::-1] - y[-1])
y = np.concatenate((firstvals, y, lastvals))
return np.convolve( m[::-1], y, mode='valid')
now, I can type:
现在,我可以输入:
entropy = np.array(entropy)
entropy = savitzky_golay(entropy, 51, 3) # window size 51, polynomial order 3
the result is this:
结果是这样的: