簡體   English   中英

numpy.polyfit與適應參數

[英]numpy.polyfit with adapted parameters

關於這個: 多項式方程參數 ,其中我得到3個參數的平方函數y = a*x² + b*x + c現在我只想得到平方函數的第一個參數,它描述了我的函數y = a*x² 與其他詞:我想設置b=c=0 ,並得到修改的參數a 如果我理解正確,polyfit就無法做到這一點。

這可以通過numpy.linalg.lstsq來完成。 為了解釋如何使用它,最簡單的方法是展示如何“手動”進行標准的二階polyfit。 假設你有測量向量xy ,你首先構造一個所謂的設計矩陣 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM