使用非线性最小二乘的图的形状匹配

时间:2013-05-09 07:33:06

标签: c++ shape matching numerical-methods least-squares

实现简单形状匹配算法以将仅从8个点(x,y)插值的图与相似图的数据库(> 12 000个条目)相匹配的最佳方法是什么,每个图具有> 100个节点。该数据库有6类图(在6种不同条件下测量的信号),主要目的是找到正确的类别(因此,对于每个类别,大约有2000个图可以比较)。

8节点图表示测量的实际数据,但是现在我通过从数据库中选择随机图,然后从中选择8点,然后使用高斯随机数生成器对其进行模糊来模拟这一点。

实现非线性最小二乘法以比较8节点图的形状与数据库中每个图的最佳方法是什么?你知道有哪些c ++库可以帮助解决这个问题吗?

是否有必要找到8节点图的实际公式(f(x))以使用最小二乘法,或者在请求的点中使用插值是否足够,例如从gsl库插值?

1 个答案:

答案 0 :(得分:1)

你当然可以在不知道实际公式的情况下使用最小二乘法。如果您的所有绘图都以相同的x值进行测量,那么这很容易 - 您只需以正常方式计算总和:

enter image description here

其中y_i是8节点图中的点,sigma_i是点上的误差,Y(x_i)是数据库中与y_i位于同一x位置的图的值。如果你所有的图都以相同的x值测量,你可以看出为什么这是微不足道的。

如果它们不是,您可以通过使用某些函数(如果您知道)拟合数据库中的图或通过在点之间插值(如果您不知道它)来获得Y(x_i)。最简单的插值只是用直线连接点,找到你想要的x_i的直线值。 Other interpolations可能会做得更好。

在我的领域,我们使用ROOT来做这些事情。但是,scipy有很多函数集合,如果您不介意使用Python,它可能更容易开始使用。

你可能遇到的一个主要问题是这两个地块不是独立的。 Wikipedia suggests McNemar's test in this case.

您可能遇到的另一个问题是您的测试图中没有太多信息,因此统计波动会对您的结果产生很大影响。换句话说,如果你只有8个测试点并且两个图匹配,你怎么知道底层函数是否真的相同,或者8个点是否只是在它们的错误条中跳转(在它们的错误条内)喜欢数据库中的情节 - 纯属偶然! ......我担心你不会真的知道。因此,测试良好的图表将包括误报(低纯度),并且一些未经测试的图表可能实际上是良好的匹配(低效率)。

要解决这个问题,您需要使用包含更多积分的测试图,或者引入其他信息。如果您可以丢弃数据库中由于其他原因而无法匹配的图表,那将会有很大帮助。