簡體   English   中英

numpy polynomial.Polynomial.fit() 給出與 polynomial.polyfit() 不同的系數

[英]numpy polynomial.Polynomial.fit() gives different coefficients than polynomial.polyfit()

我不明白為什么 polynomial.Polynomial.fit() 給出的系數與預期的系數非常不同:

import numpy as np

x = np.linspace(0, 10, 50)
y = x**2 + 5 * x + 10

print(np.polyfit(x, y, 2))
print(np.polynomial.polynomial.polyfit(x, y, 2))
print(np.polynomial.polynomial.Polynomial.fit(x, y, 2))

給出:

[ 1.  5. 10.]
[10.  5.  1.]
poly([60. 75. 25.])

前兩個結果沒問題,感謝這個答案,我明白為什么兩個 arrays 順序相反。

但是,我不明白第三個結果的含義。 系數看起來是錯誤的,盡管我以這種方式得到的多項式似乎給出了正確的預測值。

當然,答案稍微隱藏在文檔中。 Looking at the class numpy.polynomial.polynomial.Polynomial(coef, domain=None, window=None) It is clear that in general the coefficients [ a , b , c , ...] are for the polynomial a + b * x + c * x**2 +... 但是,關鍵字參數domainwindow都默認為[-1,1] 我不喜歡那個 class,所以我不確定目的,但很明顯發生了重新映射。 現在在polynomial.Polynomial.fit()的情況下,有一個 class 方法自動將x數據作為域,但仍然映射到 window。 因此,在 OP [0-10]中映射到[-1,1] 這是通過x = x' / 5 - 1x' -> 5 * x + 5完成的。 將后者放在 OP 多項式中,我們得到

( 5 x' + 5 )**2 + 5 * ( 5 * x' + 5 ) + 10 = 25 * x'**2 + 75 * x' + 60

瞧。

為了得到預期的結果,必須把

print(np.polynomial.polynomial.Polynomial.fit(x, y, 2, window=[0, 10] ) )

這給了

poly([10.  5.  1.])

埋在文檔中:

請注意,系數在由 window 和域之間的線性映射定義的縮放域中給出。 convert 可用於獲取未縮放數據域中的系數。

所以使用:

poly.convert()    

這會將您的系數重新調整為您可能期望的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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