C++ 基于非线性最小二乘法的地块形状匹配

C++ 基于非线性最小二乘法的地块形状匹配,c++,shape,matching,numerical-methods,least-squares,C++,Shape,Matching,Numerical Methods,Least Squares,实现一个简单的形状匹配算法的最佳方法是什么,将一个仅从8个点(x,y)插值的图与一个类似图(大于12000个条目)的数据库进行匹配,每个图有>100个节点。数据库有6类图(在6种不同条件下测量的信号),主要目的是找到正确的类别(因此每个类别大约有2000个图可供比较) 8节点图将代表测量的实际数据,但现在我通过从数据库中选择一个随机图,然后从中选择8个点,然后使用高斯随机数生成器对其进行涂抹来模拟 采用非线性最小二乘法将8节点图的形状与数据库中的每个图进行比较的最佳方法是什么?你知道有什么C++

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

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

采用非线性最小二乘法将8节点图的形状与数据库中的每个图进行比较的最佳方法是什么?你知道有什么C++库可以帮助这个吗?< /P>
是否有必要找到8节点图的实际公式(f(x))以将其与最小二乘法一起使用,或者在请求的点中使用插值(如gsl库中的插值)就足够了?

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

其中,y_i是8节点图中的一个点,sigma_i是该点上的错误,y(x_i)是数据库中与y_i位于相同x位置的图的值。如果在相同的x值下测量所有曲线图,您可以看到为什么这是微不足道的

如果不是,则可以通过使用某种函数(如果您知道)拟合数据库中的绘图,或通过在点之间插值(如果您不知道)来获得Y(x_i)。最简单的插值就是用直线连接点,然后在x_i处找到你想要的直线值。也许会做得更好

在我的领域里,我们用它来做这类事情。但是,它有大量的函数集合,如果您不介意使用Python,那么开始使用它可能会更容易

你可能会遇到的一个主要问题是,这两个图不是独立的

您可能遇到的另一个问题是,您的测试图中没有太多信息,因此您的结果将受到统计波动的很大影响。换句话说,如果您只有8个测试点和两个匹配的绘图,那么您如何知道底层函数是否真的相同,或者8个点是否只是以一种看起来像数据库中的绘图的方式跳转(在它们的错误条内)。。。恐怕你不会真的知道。因此,测试良好的曲线图将包括假阳性(低纯度),而一些测试不好的曲线图可能实际上是很好的匹配(低效率)


要解决这个问题,您需要使用具有更多点的测试图,或者引入其他信息。如果您可以从数据库中删除因其他原因无法匹配的绘图,这将非常有帮助。

谢谢您的回答。我也使用ROOT,但仅用于打印(图形)。对于插值,我使用了Gnu科学库。不幸的是,图中不可能有超过8个节点用于比较,我的测试表明,基于最小二乘法的方法给出了非常不令人满意的结果(只有9%的测试正确匹配)。所以我现在正在寻找更好的方法。谢谢你的时间和帮助。