【问题标题】:Fitting a straight line on a part of a dataset [duplicate]在数据集的一部分上拟合直线[重复]
【发布时间】:2020-10-12 21:25:35
【问题描述】:

我正在处理一个需要最佳拟合线的问题,尽管最佳拟合应该应用于数据的初始部分而不是整个数据点。

当我想将函数应用于整个数据集时,我知道如何在数据集上进行曲线拟合,但不知道如何在我的问题中实现这一点。

我想做的是:

  • 找到数据集偏离直线的点,该点会在每个数据集中发生变化(我的主要问题)
  • 在数据点(下图中的蓝线)上找到最佳拟合(直线)。

请告诉我你的想法。

【问题讨论】:

    标签: python straight-line-detection


    【解决方案1】:

    我认为在这种情况下,迭代搜索算法可以完成这项工作。只要从先前添加的数据点指向下一个数据点的向量不会与先前添加的数据点偏离太多,您只需继续将下一个数据点添加到该行。

    为此,您必须相信前 3 个左右的数据点位于一条线上(以获得基线方向估计),然后检查从先前添加的数据点到下一个数据点的方向是否偏离更多到目前为止,距离作为初步线一部分的所有点的平均方向不到 10% 或 20% 左右。

    这包括一些超参数拟合,例如容许偏差的百分比。但我个人不知道有任何其他开箱即用的解决方案来解决这个问题。

    最后,包括(仅)所有添加的点,您可以应用您选择的实际线拟合算法(可能是线性回归)。

    【讨论】:

    • 感谢您的评论@Daniel B.。迭代搜索的问题是我正在处理的数据类型,它可能包含数千个数据点。我把这个例子放在这里只是为了说明。我尝试了迭代搜索,并没有找到偏差点。
    • 本地搜索怎么样?假设您一直在考虑 100(0) 个连续数据点左右的(运行)窗口,并将其分成两部分。对于每一方,您计算从每个数据点到下一个数据点的方向向量集。第一次比较 2 组 49 个方向向量的每个显着不同(给定一些统计测试),您将其视为从一个分布到另一个分布的过渡点的指示。毕竟,数据中这些不同的“线”可能源于统计上显着不同的分布。
    • 对运行窗口的每个分区的多个连续方向向量进行平均并使用统计显着性检验可以被视为滤除噪声的一种方法。
    • 为了在统计测试中更轻松地使用向量,您可以将它们转换为相对于您“覆盖”在数据上的某个全局坐标系的旋转角度。然后,您测试两组旋转角度的统计差异。
    【解决方案2】:

    您实际上是在寻找肘部。最简单的方法是将数据集拟合成两条线,并迭代每条线的跨度以从一端移动到另一端。然后,您选择最高的平均 R(或最低的残差),并且您对两条趋势线都有一个最佳拟合。一些代码:

    import numpy as np
    from sklearn.linear_model import LinearRegression
    import matplotlib.pyplot as plt
    R = []
    x = np.linspace(1,10,10).reshape((-1, 1))
    y = np.linspace(1,5,5)
    y=np.append(y,np.linspace(6,20,5))
    for i in range(1,len(x)-1):
        l1x = x[:i]
        l2x = x[i+1:]
        l1y = y[:i]
        l2y = y[i+1:]
        model1 = LinearRegression().fit(l1x, l1y)
        model2 = LinearRegression().fit(l2x, l2y)
        R.append((model1.score(l1x, l1y)+model2.score(l2x, l2y))/2)
    

    【讨论】:

    • 谢谢尼克。但不完全是肘部。您在这里看到的只是我的数据的简化版本。偏离点之后的点可以得到任何形状和趋势,不一定可以拟合在一条直线上。
    • 知道了,我想你可以修改它,只取 model1 R 值。在偏差开始之前,您应该期待一个普遍较高的 R。为了真正安全起见,您可以从前 5 个点(或任何您喜欢的点)开始跨度,然后从那里增加跨度。偏差点应该是R低于高值的索引。
    【解决方案3】:

    我建议您找到一种检测异常值的方法(有很多方法),然后计算忽略异常值的最佳拟合线。

    找出数据集偏离最佳拟合线的位置是一项艰巨的任务,尤其是当您的很多数据都像图片中那样结束时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 2010-10-09
      • 1970-01-01
      相关资源
      最近更新 更多