如何比较两条曲线的特征?


11

我需要比较两条曲线f(x)和g(x)。它们在相同的x范围内(例如-30到30)。f(x)可能会有一些尖锐的峰值或平滑的峰值和谷值。g(x)可能具有相同的峰和谷。如果是这样,我想衡量一下这些功能在没有视觉检查的情况下的重合程度。我试图通过以下方式解决此问题。

  1. 通过将每个数据点除以函数的总面积来归一化这两个函数。现在归一化函数的面积为1.0
  2. 在每个x处获得f(x)和g(x)中的最小值。这将给我一个新函数,基本上是f(x)和g(x)之间的重叠区域。
  3. 当我整合步骤2的结果函数时,我得到的总重叠面积超过1.0

但是,这不能告诉我峰谷是否重合。我不确定是否可以这样做,但是如果有人知道一种方法,我将不胜感激。

==编辑==为了澄清起见,我包括了一张图片。

样本曲线

两条曲线(黑色和蓝色)之间的差异可能并不相同,但将具有互补的形状。

背景:函数是化合物的原子轨道的预计状态密度(PDOS)。所以我有s,p,d轨道的状态。我想确定材料是否具有sp,pd或dd杂交(轨道混合)。我仅有的数据是PDOS。如果说s轨道(函数f(x))的PDOS具有与p轨道(函数g(x))的PDOS的能量(x值)相同的峰和谷,则该材料中存在sp混合。


1
也许把它带到mathoverflow.net
欣快的

1
我想知道数字音频专家是否也有类似的问题?
Dan Pichelman

感谢Euphoric,我也将在mathoverflow.net上提出问题
laalee

@laalee请不要在Stack Exchange网络上的多个站点上提问。数学溢出也是研究级数学。数学堆栈交换是非研究级别。如果需要,我可以将其迁移到Math或其他地方。
世界工程师

我道歉。我试图在mathoverflow中将其删除,但找不到方法。如果您可以删除它,我将不胜感激。谢谢
laalee

Answers:


4

这是分析化学,物理,光谱学等领域中一个常见且通常很困难的问题。所使用的方法可以从简单的RMSD比较到非常复杂的方法。如果通过目视检查不容易完成此任务(为特征识别而精心开发了人类),则可能很难进行计算。

一种方法是尝试删除“基线”,以使函数除具有峰或谷特征的地方为零值。最好使用低阶多项式进行曲线拟合,或者更好的是,使用更合适的原则模型来确定基线的外观。如果峰非常尖锐,则可以简单地对函数进行平滑处理,然后从原始函数中减去平滑后的函数。

删除基线后,您可以归一化并生成残差,或者执行RMSD(简单方法),或者通过对要搜索的每个特征拟合高斯(或任何合适的模型)来尝试检测峰/谷特征。如果您能够拟合峰,则可以比较峰的位置和半峰宽。

如果您了解Python,请看看SciPy。祝好运。


感谢您的回答。但是,我不清楚如何找到基线。每种情况都有不同的功能,我无法提前预测。
laalee13年

3

这只是“浮出水面”,因此我可能会完全误解这个问题,但是也许您可以对函数应用均方根距离(RMSD)。如果您只对峰值和谷值感兴趣,则将其应用于那些峰值和谷值附近的区域(也就是说,对于x +/-某个epsilon,其中任一函数的导数为零)。我认为,如果该范围的RMSD接近零,那么您的匹配就很好。


这考虑了值之间的差异,尽管形状相似,但它们可能不为零。
laalee

3

由于我不了解它,因此您正在寻找的信息是通过该功能的“表格变体”传达的-非常抱歉,我不知道其英文名称!

这个表关联到微函数˚F和你通过找到的根构造它F“和确定的符号F”上这些零之间的每个时间间隔。

因此,如果f'g'的零点或多或少重合并且这些函数的符号一致,则它们将具有相似的轮廓。

我要编程的第一件事是:

  1. 选择一个小的ε
  2. 在定义函数的间隔中随机绘制大量Nx [i]

  3. 对于每个节点,计算差异F [i] = f(x [i] +ε)-f(x [i]-ε)G [i] = g(x [i] +ε)-g(x [i]-ε)

  4. 如果在每个节点上F [i]G [i]均小于ε²或具有相同的符号,则得出两个函数几乎具有相同的轮廓的结论。

它行得通吗?


感谢michipili您的深刻见解。目前,我正在努力争取截止日期。但我会尽快实施,并让您知道
laalee 2013年

1

蛮力:找出最小的非零浮点值,并以此值作为步长,遍历整个域并检查值是否相等?

==编辑==

嗯...如果用“相同形状”表示g(x)= c * f(x),则应修改此解决方案-对于域的每个元素,计算f(x)/ g(x)并检查是否每个点的结果都是相同的(当然,如果g(x)== 0,那么您检查f(x)== 0,就不打算除法)。

如果“相同形状”表示“局部最优值和弯曲点相同” ...那么,找到f(x)和g(x)的局部最优值和弯曲点(作为域元素集),然后检查是否集是相等的。

第三种选择:f(x)= g(x)+ c。只需检查域的每个元素是否具有相同的差f(x)-g(x)。它与第一种情况几乎相同,但是除了区分,您有区别。

==还需要另一个编辑==

好吧...上面编辑的第二种方法可能会有用。同样,您可以将其与比较第一个递减符号的符号合并(不是符号符号,而是计算为df(x)= f(x)-f(x-step))。如果两个函数在整个域中都具有相同的导数符号,则请确保检查最优值和弯曲点。我想说,这种条件足以满足您的需求。


感谢Filip的回复。但是这些函数的值可能不相等,但形状相同。
laalee

我将此评论移为编辑答复。一探究竟。
Filip Malczak 2013年

感谢Filip的回答。我添加了一张图片来澄清我的问题。
laalee13年

1

在没有视觉检查的情况下这些功能的重合程度。

可能最直接的方法是计算Pearson相关系数。也就是说,将f(x)用作X,将g(x)用作Y。有效地“将g(x)绘制为f(x)的函数,并查看其形成直线的程度”。

相关系数之所以受欢迎,是因为它易于计算,并且经常仅需挥手就可以证明其合理性。对于某些用途,它可能是一个很好的初始近似值,但绝对不是万能药。

为了在实际应用中获得更好的结果,您需要了解数据中发生的事情,即生成数据的过程。通常会有某种背景,而有趣的功能就位于该背景之上。如果将整个数据扔到黑盒中,您可能最终会比较大部分背景:黑盒不知道数据的哪一部分是有趣的部分。因此,为了获得更好的结果,通常最好以某种方式删除背景,然后比较剩下的内容。拟合线或曲线或平均值,然后减去或除以它们,然后进行低通,带通或高通滤波,并通过某些非线性函数来馈送数据...您为它命名。

绝对没有正确的答案。您将获得与尝试方法一样多的不同结果。但是,某些结果要好于某些提议。理论上的推理可能有助于朝着正确的方向入门,但是如何设置参数和微调方法最终只能通过对它们进行试验并比较实际结果才能找到。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.