2017-02-21 28 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

相关问题