Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何平滑仅在特定部分有较大噪声的曲线?_Python_Numpy_Scipy_Smoothing_Data Processing - Fatal编程技术网

Python 如何平滑仅在特定部分有较大噪声的曲线?

Python 如何平滑仅在特定部分有较大噪声的曲线?,python,numpy,scipy,smoothing,data-processing,Python,Numpy,Scipy,Smoothing,Data Processing,我想平滑下图所示的散点图(点非常密集),数据是 曲线中间有较大的噪声,我想平滑曲线,y值也应强>单调增加p> 因为有很多这样的曲线,所以很难知道噪声在曲线中的位置 我尝试了scipy.signal.savgol\u过滤器,但没有成功 我使用的代码是: from scipy.signal import savgol_filter from scipy import interpolate import numpy as np import matplotlib.pyplot as plt s

我想平滑下图所示的散点图(点非常密集),数据是

曲线中间有较大的噪声,我想平滑曲线,y值也应<>强>单调增加p> 因为有很多这样的曲线,所以很难知道噪声在曲线中的位置

我尝试了
scipy.signal.savgol\u过滤器,但没有成功

我使用的代码是:

from scipy.signal import savgol_filter
from scipy import interpolate
import numpy as np
import matplotlib.pyplot as plt

s = np.loadtxt('data.csv', delimiter=',')
x = s[:, 0]
y = s[:, 1]
yhat = savgol_filter(y, 551, 3)

plt.plot(x, y, 'r')
plt.plot(x, yhat, 'b')
plt.show()
我们非常感谢您的建议。谢谢

--------------更新------------------

按照科林的方法,我得到了我想要的结果。代码如下:

from scipy.signal import savgol_filter
from scipy import interpolate
import numpy as np
import matplotlib.pyplot as plt

s = np.loadtxt('data.csv', delimiter=',')
x = s[:, 0]
y = s[:, 1]
yhat = savgol_filter(y, 551, 3)

tolerance = 0.2
increased_span = 150
filter_size = 11

first_pass = medfilt(y,filter_size)
diff = (y-first_pass)**2
first = np.argmax(diff>tolerance) - increased_span
last = len(y) - np.argmax(diff[::-1]>tolerance) + increased_span
print (first, last)
#interpolate between increased span
yhat[first:last] = np.interp(x[first:last], [x[first], x[last]],  [y[first], y[last]])


f = interpolate.interp1d(x, yhat, kind='slinear')
x_inter = np.linspace(x[0], x[-1], 1000)
y_inter = f(x_inter)
y_inter = savgol_filter(y_inter, 41, 3)

plt.plot(x, y, 'r')
plt.plot(x, yhat, 'b')
plt.show()

如果我们首先隔离故障区域,有很多方法可以消除它。以下是一个例子:

tolerance = 0.2
increased_span = 150
filter_size = 11

#find noise
first_pass = medfilt(y,filter_size)
diff = (yhat-first_pass)**2
first = np.argmax(diff>tolerance) - increased_span
last = len(y) - np.argmax(diff[::-1]>tolerance) + increased_span

#interpolate between increased span
yhat[first:last] = np.interp(x[first:last], [x[first], x[last]],  [y[first], y[last]])

这些参数来自哪里?我有一个预测,有时,特别是当它真的做得不好时,会产生一条比观察到的趋势线噪音大得多的线。如果能够自动更正,那将是一件非常棒的事情