使用linalg.lstsq时固定斜率?
假设我们有两个数据数组:
x = [1,2,3]
y = [2,4,6]
显然,进行线性拟合会得到一个斜率为2,截距为0的结果。而且,Numpy中的两个函数 linalg.lstsq()
和 polyfit()
都能成功完成这个任务。不过,它们把斜率和截距当作需要寻找的参数来看待。
那么,有没有可能固定斜率,只定义截距呢?
2 个回答
2
你可以使用 scipy.optimize.fsolve
这个工具:
X = np.array([1, 2, 3])
Y = np.array([2, 4, 6])
s = 2
def f(i):
"""Fixed slope 1-deg polynomial residuals"""
return ((Y - (s*X + i))**2).sum()
它的效果和 polyfit
差不多:
In [37]: np.polyfit(X, Y, 1)
Out[37]: array([ 2.00000000e+00, 2.30755522e-15])
In [38]: fsolve(f, x0=1)
Out[38]: array([ 1.63883763e-16])
而且如果你改变斜率的话:
In [39]: s = 4
In [40]: fsolve(f, x0=1)
Out[40]: array([-3.99075568])
我们就能得到一个新的最佳结果。
8
如果你的拟合方程是 y = a*x + b
,那么在给定一个固定的斜率 a = A
的情况下,你可以找到最适合你数据的截距 b
,计算方法如下:
b = np.mean(y - A*x)
如果你有一个固定的截距 b = B
,并且想要找到最适合你数据的斜率,那么计算方法是:
a = np.dot(X, Y-B) / np.dot(X, X)