1

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

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

我想做的是:

  • 找到数据集偏离可以在每个数据集中改变的直线的点(我的主要问题)
  • 在数据点(下图中的蓝线)上找到最佳拟合(直线)。

请让我知道你的想法。

在此处输入图像描述

4

3 回答 3

0

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

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

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

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

于 2020-06-22T22:19:52.430 回答
0

您本质上是在寻找肘部。最简单的方法是将数据集拟合到两条线,并迭代每条线的跨度以从一端移动到另一端。然后,您选择最高的平均 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)
于 2020-06-22T22:23:45.763 回答
-1

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

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

于 2020-06-22T22:14:09.833 回答