2017-02-21 5 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'> 

Содержание текстового файла является только данными. Как это:

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

Чтобы использовать коэффициенты, полученные из polyomial.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.

И вы должны увидеть основную функцию 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) 

с этой линией:

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

Чтобы получить тот же порядок коэффициентов в обоих случаях.

+0

Большое спасибо !!!! – Kyan

Смежные вопросы