线下适合点

时间:2013-01-23 22:14:26

标签: python numpy scipy

我有一组x,y点,我想找到最佳拟合线,使得线条在使用SciPy的所有点之下。我正在尝试使用lesssq,但我不确定如何将线调整到低于所有点而不是最佳拟合线。最佳拟合线的系数可以通过以下方式生成:

def linreg(x, y):

    fit = lambda params, x: params[0] * x - params[1]
    err = lambda p, x, y: (y - fit(p, x))**2 

    # initial slope/intercept
    init_p = np.array((1, 0))

    p, _ = leastsq(err, init_p.copy(), args=(x, y))

    return p

xs = sp.array([1, 2, 3, 4, 5])  
ys = sp.array([10, 20, 30, 40, 50])

print linreg(xs, ys)

输出是最佳拟合线的系数:

array([  9.99999997e+00,  -1.68071668e-15])

如何获得低于所有点的最佳拟合线系数?

1 个答案:

答案 0 :(得分:4)

可能的算法如下:

  1. 移动轴使所有数据都在x轴的正半部分。

  2. 如果拟合的格式为y = a * x + b,那么对于给定的ba的最佳拟合将是加入点{{1}的斜率的最小值每个(0, b)点。

  3. 然后,您可以计算拟合误差,该误差仅为(x, y)的函数,并使用bscipy.optimize.minimize找到最佳值。

    < / LI>
  4. 剩下的就是为b计算a并计算轴的原始位置b

  5. 以下情况大部分时间都是这样,除非最小化失败并出现一些神秘错误:

    b

    正如TheodrosZelleke明智地预测的那样,它通过两个点作为凸包的一部分:

    enter image description here