假設我們有兩組數據: x = [1,2,3] y = [2,4,6] 顯然,線性擬合會返回2的斜率和0的截距,當然,Numpy linalg.lstsq()
和polyfit()
都是成功的。但他們認爲斜率和截距是搜索的參數。帶固定斜率的linalg.lstsq?
是否可以保持斜率不變並只定義截距?
假設我們有兩組數據: x = [1,2,3] y = [2,4,6] 顯然,線性擬合會返回2的斜率和0的截距,當然,Numpy linalg.lstsq()
和polyfit()
都是成功的。但他們認爲斜率和截距是搜索的參數。帶固定斜率的linalg.lstsq?
是否可以保持斜率不變並只定義截距?
你可以使用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])
我們得到一個新的最佳
如果擬合方程爲y = a*x + b
,你可以找到攔截b
最適合你的數據,給定一個固定斜率a = A
,如:
b = np.mean(y - A*x)
相反,如果你有一個固定的攔截b = B
,想要找坡最適合您的數據,數學作品出來:
a = np.dot(X, Y-B)/np.dot(X, X)
誠然,對於一個快速的答案(我實際使用),但我想的東西,將採取的這些程序算法的優勢。 – gmaravel
我很確定沒有默認的內置方法來修正fit中的一些參數,但如果您知道這是如何在內部工作的話,那麼做起來非常簡單。如果你能建議一個界面,我可以爲下一個numpy發佈放置一個PR ... – Jaime