2017-02-21 16 views
1

私は、python numpy.polyfit()のバグを見つけると思う。私はnumpy.polyfitを2つの同じデータ(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

次の2つの異なる関数polyfitルーチンを使用し、このよう 。

numpy.polynomia.polynomial.polyfit:ローからハイに命じ

多項式係数。

nupmy.polyfit

多項式係数、最初の最大電力。

第1の例では、係数の順番が変更されている理由があります。 係数がnumpy.poly1dに渡される場合は、nupmy.polyfitが正しい関数です。それ以外の場合は、係数を逆にする必要があります。

+0

ありがとうございます!!!!!!!! – Kyan

0

numpy.poly1dのpolynomial.polyfitから得られた係数を使用するには、順序を逆にする必要があります。

これは、使用して行うことができます。

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

あなたは困難な問題を解決することができるようにあなたのコーディングスタイルを向上させる必要があります。スクリプト中に意味を完全に変更する変数fを使用しています。なぜ1つの変数fit_paramsともう1つのfit_functionを使用しないのですか?そうすることで、fit_paramsを比較することで簡単にバグを発見できました。

そして、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

"お手伝いをして、スタックオーバーフローを歓迎します。この回答または他の誰かがあなたの問題を解決した場合は、それを受け入れたものとしてマークしてください。 [Michael Berkowski] – Philipp

0

はkazemakaseが問題を発見し、答えを書くために少し速かった方法を見て、私はちょうどあなたがあなたの最初の例ではコード行を置き換えることができますことを追加します。

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

両方の場合の係数の同じ順序を取得するには、この行で

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

+0

ありがとうございました!!!! – Kyan

関連する問題