[英]numpy.polyfit with adapted parameters
關於這個: 多項式方程參數 ,其中我得到3個參數的平方函數y = a*x² + b*x + c
現在我只想得到平方函數的第一個參數,它描述了我的函數y = a*x²
。 與其他詞:我想設置b=c=0
,並得到修改的參數a
。 如果我理解正確,polyfit就無法做到這一點。
這可以通過numpy.linalg.lstsq來完成。 為了解釋如何使用它,最簡單的方法是展示如何“手動”進行標准的二階polyfit。 假設你有測量向量x
和y
,你首先構造一個所謂的設計矩陣 M
如下所示:
M = np.column_stack((x**2, x, np.ones_like(x)))
之后你可以使用像這樣的lstsq
獲得通常的系數作為方程M * k = y
lstsq
:
k, _, _, _ = np.linalg.lstsq(M, y)
其中k
是具有通常系數的列向量[a, b, c]
。 請注意, lstsq
返回一些其他參數,您可以忽略這些參數。 這是一個非常強大的技巧,它允許您將y
與您放入設計矩陣的列的任何線性組合相匹配。 它可以用於例如z = a * x + b * y
類型的2D擬合(參見例如本例 ,我在Matlab中使用相同的技巧),或者像你的問題中那樣缺少系數的polyfits。
在您的情況下,設計矩陣只是一個包含x**2
列。 快速舉例:
import numpy as np
import matplotlib.pylab as plt
# generate some noisy data
x = np.arange(1000)
y = 0.0001234 * x**2 + 3*np.random.randn(len(x))
# do fit
M = np.column_stack((x**2,)) # construct design matrix
k, _, _, _ = np.linalg.lstsq(M, y) # least-square fit of M * k = y
# quick plot
plt.plot(x, y, '.', x, k*x**2, 'r', linewidth=3)
plt.legend(('measurement', 'fit'), loc=2)
plt.title('best fit: y = {:.8f} * x**2'.format(k[0]))
plt.show()
結果:
系數得到最小化平方誤差,你不分配它們。 但是,如果它們太無關緊要,您可以將某些系數設置為零。 例如,我有一個曲線y = 33*x²
的點列表:
In [51]: x=np.arange(20)
In [52]: y=33*x**2 #y = 33*x²
In [53]: coeffs=np.polyfit(x, y, 2)
In [54]: coeffs
Out[54]: array([ 3.30000000e+01, 8.99625199e-14, -7.62430619e-13])
In [55]: epsilon=np.finfo(np.float32).eps
In [56]: coeffs[np.abs(coeffs)<epsilon]=0
In [57]: coeffs
Out[57]: array([ 33., 0., 0.])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.