2014-03-02 91 views
4

關於本:polynomial equation parameters 在那裏我得到一個平方函數y = a*x² + b*x + c 3個參數,現在我只想得到它描述了我的功能y = a*x²平方函數的第一參數。換言之:我想設置b=c=0並獲得a的修改參數。如果我理解正確,polyfit無法做到這一點。numpy.polyfit有適合的參數

+0

'np.polyfit'來擬合多項式的幾點問題,你怎麼知道你的'Y = A *x²'會適合你的觀點? – zhangxaochen

+0

我可以保證我的點數符合y = a *x²...當我使用polyfit時,對於b和c,我得到一些<10 ^( - 2)的值。 (而a> 20) – Munchkin

回答

7

這可以通過numpy.linalg.lstsq完成。爲了解釋如何使用它,最簡單的方法就是展示如何通過「手動」來實現標準的二階polyfit。假設你有您的測量矢量xy,首先構造一個所謂design matrixM像這樣:

M = np.column_stack((x**2, x, np.ones_like(x))) 

之後就可以得到通常的係數作爲最小二乘方程的解M * k = y使用lstsq像此:

k, _, _, _ = np.linalg.lstsq(M, y) 

其中k是列向量[a, b, c]與通常的係數。請注意0​​返回一些其他參數,您可以忽略。這是一個非常強大的技巧,它允許您將y適用於您放入設計矩陣的任何列的線性組合。它可以用於例如對於類型爲z = a * x + b * y的二維擬合(請參閱,例如,this example,我在Matlab中使用了相同的技巧),或者在您的問題中缺少係數的多重聚類。

就你而言,設計矩陣只是一個包含x**2的列。簡單的例子:

import numpy as np 
import matplotlib.pylab as plt 

# generate some noisy data 
x = np.arange(1000) 
y = 0.00* 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() 

結果: enter image description here

-1

這些係數可以使平方誤差最小化,您不需要指定它們。但是,如果某些係數太小,則可以將其設置爲零。例如,我點的曲線上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.]) 
+0

這隻適用於無噪聲數據。如果您的數據包含噪音,其他係數也將爲非零,並且您的二次項的估計不包含最佳值。 –