2017-02-21 45 views
1

我想我找到了python numpy.polyfit()的錯誤。我使用numpy.polyfit與兩個相同的數據,一個來自txt,另一個來自打字。但結果是不同的。爲什麼?請幫助我。我想我找到了一個Python的錯誤numpy.polyfit()

這是我的代碼:

# -*- coding:utf-8 -*- 
import re 
from numpy.polynomial import polynomial 
import numpy 
import matplotlib.pyplot as plt 
fl=open(r'C:\Users\yanzhiquan\Desktop\4-6.txt','r') 
def stof(str):#把txt文件中的string變成數據 
    if str: 
     [e, t] = re.split(' ',str) 
     e=int(e) 
     t=float(re.sub('\n','',t)) 
     return e,t 
def avi(fl):#生成x y 
    x=[] 
    y=[] 
    for s in fl: 
     [tx,ty]=stof(s) 
     x.append(tx) 
     y.append(ty) 
    return x,y 
x,y=avi(fl) 
f=polynomial.polyfit(x,y,5) 
f=numpy.poly1d(f) 
print f 
print x[0:10],type(x),type(x[1]) 
print y[0:10],type(y),type(y[1]) 
plt.plot(x,f(x),'g',x,y,'d') 
plt.show() 

結果:

 5   4   3   2 
-0.6467 x + 3.384 x - 2.032 x + 0.5557 x - 0.06226 x + 0.00241 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] <type 'list'> <type 'int'> 
[1.2, 1.5, 1.9, 2.1, 4.0, 4.4, 4.9, 5.1, 4.0, 4.1] <type 'list'> <type 'float'> 

的txt文件的內容僅僅是數據。 像這樣:

1 1.2 
2 1.5 
3 1.9 
4 2.1 
5 4 
6 4.4 
7 4.9 
8 5.1 
9 4 
10 4.1 

這是我的測試代碼,其結果應該是正確的:

import numpy 
import matplotlib.pyplot as plt 
x=[1,2,3,4,5,6,7,8,9,10] 
y=[1.2,1.5,1.9,2.1,4.0,4.4,4.9,5.1,4.0,4.1] 
f=numpy.polyfit(x,y,5) 
f=numpy.poly1d(f) 
print f 
t=[] 
i=0 
while True: 
    t.append(i) 
    i=i+0.01 
    if i>10: 
     break 
print x,type(x),type(x[1]) 
print y,type(y),type(y[1]) 
plt.plot(t,f(t),'r',x,y,'d') 
plt.show() 

結果:

  5   4   3   2 
0.00241 x - 0.06226 x + 0.5557 x - 2.032 x + 3.384 x - 0.6467 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] <type 'list'> <type 'int'> 
[1.2, 1.5, 1.9, 2.1, 4.0, 4.4, 4.9, 5.1, 4.0, 4.1] <type 'list'> <type 'float'> 
+0

爲什麼你在一個片段中使用'numpy.polynomia.polynomiall.polyfit'而在另一個片段中使用'numpy.polyfit'? – kazemakase

回答

0

您可以使用兩種不同的polyfit程序。

numpy.polynomia.polynomial.polyfit

下令從低到高的多項式係數。

nupmy.polyfit

多項式係數,最高功率第一。

這就是爲什麼順序是係數在第一個例子中被揭示。 如果係數傳遞給numpy.poly1d,則nupmy.polyfit是正確的函數。否則係數需要顛倒。

+0

非常感謝你!!!!!!!! – Kyan

0

爲了使用從polynomial.polyfit獲得的係數爲numpy.poly1d,您必須顛倒順序。

這可以通過使用來完成:

f = polynomial.polyfit(x,y,5) 
f = numpy.poly1d(f[::-1]) ## Here is the change 

你應該提高你的編碼風格,以能夠解決更難的問題。您正在使用一個變量f,在腳本過程中完全改變它的含義。爲什麼不使用一個變量fit_params和另一個fit_function?通過這樣做,您可以通過比較fit_params輕鬆找到您的bug。

你應該看到python和numpy的基本特徵。使用標準numpy代碼可以非常低效地替換一些代碼。例如:

t=[] 
i=0 
while True: 
    t.append(i) 
    i=i+0.01 
    if i>10: 
     break 

可以只是:

t2 = numpy.linspace(0, 10, 10001) 

你會好很多,當你從一些基本的教程,例如學習時間一些很好的鏈接可以在這裏找到: Best online resource to learn Python?

+0

非常感謝! – Kyan

+0

「高興提供幫助,歡迎來到Stack Overflow。如果此答案或任何其他人解決了您的問題,請將其標記爲已接受。」 [Michael Berkowski] – Philipp

0

看到kazemakase怎麼有點更快地發現問題並寫一個答案,我只想補充一點,你可以在你的第一個例子替換這行代碼:

f = polynomial.polyfit(x, y, 5) 

利用該行:

f = polynomial.polyfit(x, y, 5)[::-1] 

爲了獲得係數在兩種情況下相同的順序。

+0

非常感謝你! – Kyan

相關問題