从嘈杂的曲线中去除异常值
您可以将这个问题视为基本上是试图在有噪声的云中找到密集区域。
这不是唯一可能的解决方案,但您可以使用聚类算法,特别是尝试查找密集区域的算法,例如 DBSCAN。
我将重现第一个示例,您可以进一步了解其他示例。
import numpy as np
from sklearn.cluster import DBSCAN
x = np.arange(0,1,.01)
y = np.sin(x)
noisex = np.random.uniform(size = 25)
noisey = np.random.uniform(size = 25)
X = np.hstack([x,noisex])
Y = np.hstack([y,noisey])
D = np.vstack([X,Y]).T
plt.scatter(X,Y);
# instantiate your model
plt.scatter(D[:,0],D[:,1], c = dbs.labels_, cmap = "RdYlBu")
plt.colorbar()
plt.title(f"Data with noise in red color");
希望能帮助到你!
扩展我的评论:
可以使用回归方法(例如线性、非线性、符号等)来尝试将曲线拟合到数据中。
可以通过 1 或 2 个步骤删除异常值:
2.a. 在应用回归之前删除一些点,例如通过测试它们与标准差的距离。
2.b。在拟合曲线并测量点到曲线的距离后去除异常值,如果超过某个阈值则丢弃。
[更新]
在使用回归的曲线拟合中,人们很少了解实际曲线,而是假设曲线属于某一类函数并尝试各种选项。
此外,还有所谓的符号回归方法,它对实际曲线的假设更少,甚至可以找到隐式形式的函数,尽管更乏味。
最后,在应用回归之前进行一些预处理以去除异常值(例如丢弃非常“远”的点、基于密度的方法……)当然可以基于合理的基于域的假设来改善结果。
以上将适用于所讨论的大多数情况。这是一个病态反问题,所以应该做一些假设并有合理的期望。
[更新 2]
如果您的数据只是 2D 图像数据并且您只需要将曲线作为图像获取(并且不需要推断曲线的任何解析形式),那么可以选择结合使用模糊/低通滤波和边缘检测. 例如,OpenCV 有实现这一目标的方法。
参考:
我们提出了一种使用图像边缘图的图像去噪方法。去噪图像被认为是观察图像及其平均值的线性组合,其中系数由局部边缘检测器控制。参数设置在与由原始图像的曲率范数计算的噪声能量相关的适当值上。实现可以在一次迭代中完成,并且该过程的速度相当高。针对某些图像,将所介绍方法的降噪质量与基于 Wiener 和 Total Variation 的滤波器进行了比较。对于非常嘈杂的图像,该方法似乎简单、快速且有用。解释了我们的方法与专利 6229578“基于边缘检测的噪声去除算法”之间的差异。