在一条线上拟合尽可能多的点

数据挖掘 回归
2022-02-19 20:53:29

我想在 2D 平面上拟合一组点,看起来像下图中的蓝点。我想要一条看起来像红线的线,而不是最小二乘拟合(黄色虚线),它要么尽可能地穿过蓝点,要么垂直于它们。我怎样才能做到这一点?


在此处输入图像描述

3个回答

我认为正如评论中所建议的,您应该将其拆分为几个线性回归。

如果数据点是有序的,您可以只进行重复的线性回归,始终添加一个点,直到添加的点导致拟合优度显着降低。然后你开始下一个线性回归,直到那个变坏,然后你开始下一个。最后,您可以比较两条线之间的角度,看看它们是否(大致)90 度。

我认为有两个选项可以解决这个问题,或者您可以使用创建它们的混合来减少计算时间。

  • 使用现成的算法,您可能想尝试进行 PCA 来确定最大方差的方向,使用第一个组件来定义一条线或使用前两个组件来定义一个平面(您最终可能会非常接近您对平面的想法)。如果这没有帮助,那么,
  • 创建您自己的优化问题以包括最大点。确定您希望线/平面更接近的点的百分比。算法的伪步骤可能如下所示:

    1. 启动定义平面或线的参数(您可能希望使用 PCA 的结果进行热启动以加快计算速度)
    2. 设置 |e| ~ 0.01
    3. 优化平面/线参数:最大(|e| 线/平面距离中的点数)
    4. 如果(3)中的最大点数大于所需的 % 点数,则停止,否则转到(2)并增加 |e|

我将建议以下 3 个选项

  • 我认为您的数据有一些您想要删除的异常值,您仍然可以使用均方误差成本函数
  • 您可能想要定义自定义成本函数并使用自动差异梯度下降来最小化成本函数。成本函数的一个建议是,计算每个实例的误差,如
    erri=min((yipi)2,err_clip)
    这将有效地忽略大于 err_clip 的错误
  • 可能 SMV 回归会更好地处理这个问题,因为它会尝试在两条边界线之间拟合尽可能多的点,自动忽略异常值