使用linalg.lstsq时固定斜率?

6 投票
2 回答
3725 浏览
提问于 2025-04-18 11:10

假设我们有两个数据数组:
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)

撰写回答