将多条曲线拟合到一个数据集

时间:2017-08-14 16:22:32

标签: linux perl plot awk gnuplot

我有一个从外部来源收到的数据集,并且没有真正的控制权。我可以无限制地编辑它,但不能选择用于过滤集合的参数。绘制时,数据显示了两个点,其中有几个稀疏的无关点。这是一个示例图:

Raw plot

(抱歉,我没有足够的权限来嵌入图片)

左边有一堆点,聚集在(1,16)周围。这个丛实际上是一组点的一部分,这些点位于从(1,17.5)到(2.4,13)延伸的线上(或附近)。此外,从(1.75,18)到(2.75,12.5)有明显的曲线。最后,在第二条曲线上方有一些稀疏点,大约(2.5,17)。在视觉上,将这些点组分开并不困难。但是,我需要将数据文件中的这些点分成三组,我将其称为Line,Curve和Other(Curve组是我实际需要的组)。我想编写一个程序,可以很好地完成这个,而不需要在视觉上看到情节。

现在,我要添加一些使这更糟糕的项目。这只是一组样本数据。虽然曲线和线的形状从一个数据集到下一个数据集相对恒定,但位置不是。这些区域可以(并且确实)水平和垂直移动。唯一真正的常数是从图的左上角到右下角有一条负斜率线,从顶部中心到底部的〜$ \ frac {1} {x ^ 4} $曲线 - 右边,大部分稀疏点位于曲线上方的右上角。

我在Linux上,而且我没有想法。我可以告诉你我尝试过的方法,虽然它们做得不好。

  • 首先,我清理了数据集并按x坐标按升序对其进行了排序。我认为这些点可能是以某种逻辑方式排序的,这种方式可以让我“头”或“尾随”数据以达到预期的效果,但事实并非如此。
  • 我可以编写任何代码(Python,Fortran,C等),如果它不在前一点的X距离内,则删除一个点。这将是很好的,除了点的散射使得在x中彼此非常接近的两个点在y中相隔可观的距离。线和曲线相互靠近以获得更大的x值也无济于事。
  • 我可以将曲线拟合到部分数据集。例如,当我按x坐标对数据进行排序时,我可以选择仅绘制前30个点,或最后200个点,或者某个中间位置的40个点。那不是问题。但是线点位于曲线点下方,这会导致问题。
  • 如果线点相当恒定(它们不是),我可以将我的绘图旋转一定角度,使线垂直,我可以看到该线右边的点,然后旋转回来。这可能是最好的方法,但为了做到这一点,我需要能够隔离线性点,这或多或少是问题的本质。

对我来说似乎有道理的另一个想法是尝试识别点密度并通过这些参数将数据拆分为单独的文件。我认为这是这个问题的最佳候选者,因为它与点位置无关。但是,我不知道该怎么做,特别是因为线和曲线确实非常接近于较大的x值(在样本图中,它的x值大于约2)。

我知道这并不完全符合MWE的要求,但我不知道如何提供更经典的MWE。如果我能提供的其他东西会有所帮助,请询问。提前谢谢。

0 个答案:

没有答案