2013-07-12 4 views
1

표준 다항식 피팅 프로그램을 구현하려고했지만 이해할 수없는 문제가 발생했습니다. 다음은 정상적인 방정식을 사용하여 적합하게 만든 샘플 x 및 y 데이터가 있고 numpy에서 polyfit 함수를 사용하는 코드입니다. 여기numpy의 다항식 피팅 문제

def mytest(N): 
    print "\nPolynomial order (N): {}".format(N) 
    mVals = [5, 10, 15, 20] 
    a_orig = [198.764, 13.5, 0.523] 
    for M in mVals: 
     x = arange(-M, M+1) 
     y = matrix(a_orig[0]+ a_orig[1]*x + a_orig[2]*x**2).T 

     # Code implementing the solution from the normal equations 
     nArray = arange(N+1)  
     A = matrix([[n**i for i in nArray] for n in x]) 
     B = (A.T*A).I 
     a_myfit = B*(A.T*y) 

     # numpy's polyfit  
     a_polyfit = polyfit(x, y, N) 

     print "M: {}".format(M) 
     print ["{0:0.3f}".format(i) for i in a_orig] 
     print ["{0:0.3f}".format(i) for i in array(a_myfit)[:,0]] 
     print ["{0:0.3f}".format(i) for i in list(array(a_polyfit)[:,0])[::-1]] 

mytest(N=5) 
mytest(N=6) 

는 다항식의 출력

Polynomial order (N): 5 
M: 5 
['198.764', '13.500', '0.523'] 
['198.764', '13.500', '0.523', '0.000', '0.000', '-0.000'] 
['198.764', '13.500', '0.523', '-0.000', '0.000', '0.000'] 
M: 10 
['198.764', '13.500', '0.523'] 
['198.764', '13.500', '0.523', '-0.000', '0.000', '-0.000'] 
['198.764', '13.500', '0.523', '0.000', '0.000', '0.000'] 
M: 15 
['198.764', '13.500', '0.523'] 
['198.764', '13.500', '0.523', '0.000', '0.000', '-0.000'] 
['198.764', '13.500', '0.523', '-0.000', '-0.000', '0.000'] 
M: 20 
['198.764', '13.500', '0.523'] 
['198.764', '13.500', '0.523', '0.000', '-0.000', '-0.000'] 
['198.764', '13.500', '0.523', '0.000', '0.000', '0.000'] 

Polynomial order (N): 6 
M: 5 
['198.764', '13.500', '0.523'] 
['198.764', '13.500', '0.523', '0.000', '0.000', '-0.000', '-0.000'] 
['198.764', '13.500', '0.523', '-0.000', '0.000', '0.000', '-0.000'] 
M: 10 
['198.764', '13.500', '0.523'] 
['198.764', '13.500', '0.523', '-0.000', '-0.000', '-0.000', '-0.000'] 
['198.764', '13.500', '0.523', '0.000', '0.000', '-0.000', '-0.000'] 
M: 15 
['198.764', '13.500', '0.523'] 
['294.451', '13.500', '-0.061', '0.000', '-0.001', '-0.000', '-0.000'] 
['198.764', '13.500', '0.523', '0.000', '0.000', '0.000', '-0.000'] 
M: 20 
['198.764', '13.500', '0.523'] 
['369.135', '13.500', '-0.046', '0.000', '-0.000', '-0.000', '-0.000'] 
['198.764', '13.500', '0.523', '0.000', '0.000', '-0.000', '-0.000'] 

값은 N> 5 잘못된 값을 제공하고 M>

(13)가 어디에서 잘못 가고위한 것입니다? 폴리 피트 구현에서 다른 점은 무엇입니까?

답변

4

Aint32입니다.

최대 값 표현할은 다음과 같습니다 지수가 매우 큰 경우

In [10]: np.iinfo(np.dtype('int32')).max 
Out[10]: 2147483647 

n**i가 잘못된 결과를 얻을이 시점에서 2147483647보다 큰 될 수 있습니다.

NumPy does not check for arithmetic overflows (배열 작업을 수행 할 때) 이는 성능을 저해 할 수 있습니다. 산술 오버 플로우를 피하는 것은 dtype을 선택하는 것입니다.

이 문제를 해결 큰 수를 나타낼 수있는 다른 DTYPE 선언하려면 : 문제가 계속 존재

A = np.matrix([[n**i for i in nArray] for n in x], dtype='float64') 

참고, 그냥 N의 훨씬 더 큰 값으로 발생합니다.

+0

나는 이것을 지금부터 염두에 둘 것이다. 감사. – siva82kb