Graph 科学数据处理(图形比较和解释)

Graph 科学数据处理(图形比较和解释),graph,signal-processing,analysis,Graph,Signal Processing,Analysis,我正试图写一个程序来自动化我的一个更无聊和重复的工作任务。我有一些编程经验,但没有处理或解释大量数据的经验,因此我正在寻求您的建议(包括尝试技术的建议,以及了解更多关于做这些事情的阅读内容) 我有一个设备,通过重复取样来监控实验,并在屏幕上以图形的形式显示读数。实验的输入可以改变,其中一个改变应该会在我目前用眼睛识别的图形的某个部分产生变化,这就是我在实验中寻找的。我想让它自动化,这样计算机就能看到一组结果,并找出引起变化的实验输入 我已经可以从机器上提取结果了。目前,运行的结果以整数数组的形式

我正试图写一个程序来自动化我的一个更无聊和重复的工作任务。我有一些编程经验,但没有处理或解释大量数据的经验,因此我正在寻求您的建议(包括尝试技术的建议,以及了解更多关于做这些事情的阅读内容)

我有一个设备,通过重复取样来监控实验,并在屏幕上以图形的形式显示读数。实验的输入可以改变,其中一个改变应该会在我目前用眼睛识别的图形的某个部分产生变化,这就是我在实验中寻找的。我想让它自动化,这样计算机就能看到一组结果,并找出引起变化的实验输入

我已经可以从机器上提取结果了。目前,运行的结果以整数数组的形式显示,索引为样本编号,相应的值为度量值

每次实验运行时,图形的整体形状将相似。我正在寻找的变化将大致相同,并且每次都会在大致相同的位置发生,以获得正确的实验输入。不幸的是,有一些陷阱使得这个问题更加困难

  • 测量过程中存在一些噪声,这意味着不同运行之间的测量值存在一些随机变化。尽管图形的整体形状保持不变

  • 每次实验所用的时间略有不同,造成两种影响。首先,整个图形可能在x轴上相对于另一个运行的图形稍微移动。第二,在不同的运行中,单个功能可能会显得稍宽或稍窄


  • 在这两种情况下,变化并不是特别大,您可以假设唯一的非随机变化是由找到的正确输入引起的。

    我想您正在查找有关的信息。它可以是非常简单的,也可以是非常难以理解的。如果,比如说,你的事件前信号是0,而相关信号之后的每个信号都是1,你可以只查找第一个1,找出它发生的时间,然后你就完成了。这基本上是简单性的极限,这可能是一个很好的起点。实现这一点,你就开始意识到如何回答你的问题。现在,你有了噪音。所以,比如说,事件发生前可能在-10到10之间,而事件发生后可能在90到110之间。仍然简单;注意第一个值是否大于10。当然,事情从来没有这么简单。您可能需要平均一个读数窗口,可能需要从以前的测量中寻找一些变化阈值,等等。在高级情况下,您可能会发现自己使用到其他空间的转换、应用过滤器、模式匹配等。但是从你的描述来看,听起来简单的方法应该可以帮你完成这项工作。不要被这样的概念吓倒——你可能还不需要它们。至少现在,假设这个问题可以简单地解决。从一个简单(但不充分)的解决方案开始,朝着有效的解决方案努力。

    如果卡尔建议的那种过滤器和阈值方法不足以解决问题,那么有一种技术值得研究。其本质非常简单:如果两个数据集相当相似,那么当它们对齐时,它们的点积将最大化(因为最高值将相乘)。因此,通过计算每个偏移量的乘积,并选择一个结果最高的,可以很好地估计如何排列它们

    在像你这样的案例中,我们的想法是要有一个你正在寻找的曲线形状的“理想”版本——或者是从理论/模拟中生成的,或者是通过用眼睛识别和对齐的许多好的实验曲线的平均结果生成的——并将其与实验数据进行比较

    为了简单起见,让我们假设数据集比理想数据集长,并且两端都有足够的空白空间,我们可以忽略任何边界问题。因为你正在寻找一个特定的事件,所以为了符合这个假设而削减你的理想应该是微不足道的。如果用Java进行粗略编码,那么过程可能如下所示:

    int offset ( double[] data, double[] ideal )
    {
        double cMax = -Double.MAX_VALUE;
        int tMax = 0;
    
        for ( int t = 0; t < data.length - ideal.length; ++t )
        {
            double c = 0;
            for ( int i = 0; i < ideal.length; ++i )
            {
                c += data[t + i] * ideal[i];
            }
    
            if ( c > cMax )
            {
                cMax = c;
                tMax = t;
            }
        }
    
        return tMax;
     }
    
    int偏移量(双[]数据,双[]理想)
    {
    double cMax=-double.MAX_值;
    int tMax=0;
    对于(int t=0;tcMax)
    {
    cMax=c;
    tMax=t;
    }
    }
    返回tMax;
    }
    

    显然,在很多情况下,这种方法可能会失败,特别是当存在大量非独立噪声或信号中存在导致噪声的周期性时。此外,本例丢弃了大量信息,只关注绝对最大值,如果互相关中没有大而窄的峰值,则可能会出现错误。但是从您的描述来看,您的问题似乎可以通过这些方式解决。

    嗨,卡尔,谢谢您的建议,数字信号处理绝对是这个领域,我已经修改了标签,将其包括在内。我目前正在阅读一本关于dsp的在线书籍,但还没有遇到任何听起来与这个问题相关的技术,但我认为这只是时间问题。