我有一组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])
如何获得低于所有点的最佳拟合线系数?
答案 0 :(得分:4)
可能的算法如下:
移动轴使所有数据都在x轴的正半部分。
如果拟合的格式为y = a * x + b
,那么对于给定的b
,a
的最佳拟合将是加入点{{1}的斜率的最小值每个(0, b)
点。
然后,您可以计算拟合误差,该误差仅为(x, y)
的函数,并使用b
为scipy.optimize.minimize
找到最佳值。
剩下的就是为b
计算a
并计算轴的原始位置b
。
以下情况大部分时间都是这样,除非最小化失败并出现一些神秘错误:
b
正如TheodrosZelleke明智地预测的那样,它通过两个点作为凸包的一部分: