【问题标题】:Fragmented line fitting分段线拟合
【发布时间】:2016-04-17 20:48:04
【问题描述】:

我想将一条线拟合到线段,即大约属于该线的少量(通常少于 10 个)线段。这条线有一个小坡度。但也有异常值:线外的段(通常更小)。下图是一个典型案例。碎片之间没有水平重叠。

我宁愿避免尝试拟合所有细分子集并保持最佳状态。我也不会依赖 RANSAC,因为样本太小了。

有什么建议吗?


更新

我现在计划将问题改写为在点上拟合一条线的问题,即各个线段上的点的无穷大,假设线性密度恒定。通过以积分形式重写最小二乘方程,我们可以看到我们可以认为这些线段集中在它们的中间,权重等于它们的长度;还有一个额外的术语考虑了它们的斜率。这为段上的拟合提供了良好的基础。

现在我仍然需要结合异常值检测。受 RANSAC 的启发,我可以选择最长的线段并单独或成对使用它们来获得候选线。对于每一行,评估总误差,并保留给出最小值的行。从那里开始,一些标准(尚未找到)应该允许拒绝异常值并对内部值执行最终最小二乘拟合。

【问题讨论】:

  • 以最短行的 1/10 长度分割每一行;最小二乘最佳拟合;删除最差的异常值line;重复。对于每次迭代计算the sigma 整体,看到急剧下降,停止。或者,在每一步,为每条线计算其与最佳拟合线的豪斯多夫距离,删除最远的线,重复;当距离小于某个预设值时停止 // 幅度显着下降。
  • @WillNess:嗯,如果对所有段进行初始拟合,最小二乘拟合将表现不佳,并且会受到异常值的很大影响。然后存在拒绝内点的风险。无论如何,将异常值一一去除的想法很有趣。
  • 为什么?你说异常值很短。以相同的长度进行分割可以增强更接近的较长线的影响。
  • @WillNess:这是最小二乘法的弱点:误差是平方的,过度强调异常值。一个点可能会破坏原本非常适合的。
  • @WillNess: demonstrations.wolfram.com/…(查看左下角快照)。

标签: algorithm geometry curve-fitting robustness


【解决方案1】:

我猜斜率将是线片段斜率的平均值乘以等于片段长度(或片段长度的平方,具体取决于外围片段的长度)的因子比较)。然后将该线与该斜率最佳拟合。

所以取线片段,将斜率转换为角度 (arctan2(y1-y0,x1-x0)) 乘以长度将它们加起来,除以(所有片段的总长度)。对位置(线片段的中点位置*片段长度)/(所有片段的总长度)做同样的事情,然后确保具有该斜率的线与具有该值的点相交。

更新:

如果我们不想过多地考虑坡度,我们宁愿在位置上根据不同段的影响对线进行最佳拟合,我们再次按其长度加权。

求片段的总长度。迭代片段,直到达到片段总长度的 1/3。这将是你的第一个点的 x。然后选择一些任意小的值并再次遍历片段,以您选择的速率进行采样。然后,该样本的影响是给定的 y 乘以 x 的线性距离,从 x 的 1/3 路穿过所有片段,所有片段均由所有片段的线性距离的总和归一化。对 2/3 的方式做同样的事情。并在两个结果点之间画一条线。

【讨论】:

  • 这让人想起斜率的 Theil-Sen 估计器。采用中位数而不是平均值更为稳健,但该中位数应该以某种方式通过段长度“加权”。
  • 另一个考虑是全局坡度不应仅取决于各个坡度,还应取决于线段的位置:假设所有线段垂直居中在同一水平线上,但都具有相同的非零值斜率:无论如何,拟合线应该是水平的。
  • 嗯。水平拟合线段的测试用例都具有 2 的斜率。根据我的建议,将一条具有该斜率的线打到那里的最中心位。尽管其中很多似乎都是在墙上扔东西并找出最有效的方法。
  • 做整个图表甚至可能是矫枉过正。您应该尝试仅找到以片段长度加权的片段的平均前半部分,以及以片段长度加权的片段的后半部分。确保在总长度的一半处调用该点,即两个片段之间的分割点。
  • 这是不正确的。想象一堆 1 长度的线,每条线的倾斜角为 10 度,起点在 y=0, x={0,1,...,100}。最佳拟合线的斜率为 0。
【解决方案2】:

正如你所问,我有一些建议。完整且有效的答案对我来说有点太多了。我的建议包含两个主要部分。一个一个地拿:


处理异常值:

消除异常值的一个建议是对线段进行聚类。然后,不要担心落在集群之外的行。但是,你如何聚集这些线条?将整个二维平面划分为y = 0 to ay = a to 2ay = 2a to 3a 等。位于同一y = i to j 条纹中的线段将用于生成ij 值正确的条纹。

但是有一个问题:如果线段没有很好地水平分割怎么办?如果多数线倾斜 38 度而不是接近 0 怎么办?在这种情况下,您可以使用Principle Component Analysis。很抱歉将您链接到这样一个开放式的想法 - 您的问题有点需要它。

重新对齐线条,使它们与 X 轴大体平行,然后,如上所述,找到包含大部分线条的条纹。


近似最佳拟合线:

现在,在您最终确定了正确的条纹后,获取所有落在条纹中的线段并使其变密。致密化是将线段近似为点集合的步骤。由于所有这些线段都在y = iy = j 之间,因此,您可以从y = (i + j) / 2 线开始作为最佳拟合线。那么:

  • 求所有点到这条线的距离,当点在线上方时距离为负,当点在线下方时距离为正。
  • 对所有距离求和。我们称这个总和值为 approximationError
  • 您现在的目标是找到 approximationError 为 0 的 y 值。
  • 如果多数点位于该线下方,则减少 y,如果多数点位于该线上方,则增加它。
  • 你最终会到达像y = c这样的行。
  • 现在,将这条线倾斜到您在主成分分析步骤中更改所有输入线段的角度。
  • 要获得线 segment,请用条纹中最远的两个 x 点的 x 值切割这条线。

我意识到这一切可能并不容易想象。这是 PCA 维基百科图像的link。这是一个 link to another answer 演示线路致密化。

【讨论】:

  • 从估计斜率开始似乎确实很有用。 PCA 可能是一种方法,但 PCA 是基于什么?由段长度加权的端点? PCA 本身存在异常值的风险。 (在这种情况下,PCA 可以看作是一个总最小二乘回归,即最初的问题。)是否存在“稳健的 PCA”?
  • @YvesDaoust:一方面,您可以使线条变密并在点上进行 PCA。这样,PCA 不太可能受到异常值的影响,因为根据定义,异常值只是所有线段上的整个点集中的几个线段的点。
  • @YvesDaoust:只是好奇线的致密化是否适用于 PCA...?
  • @dislayName:我还没有尝试过任何东西。我打算使用标准的 LS,它与 PCA 非常相似,但在尝试性的异常值拒绝后进行。
猜你喜欢
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2014-03-28
  • 2022-12-11
  • 2016-03-09
  • 1970-01-01
  • 2015-06-05
相关资源
最近更新 更多