2014-09-05 3 views
0

Я использую класс numpy.polynomial.polynomial.Polynomial (библиотека Numpy), чтобы соответствовать методу fit() определенным данным для функции полинома. Полученный многочлен прав, и я могу построить его и заменить точки, чтобы получить значение «y», и я получаю правильные ответы. Проблема в том, что атрибут .coef класса Polynomial возвращает набор коэффициентов, которые каким-то образом нормализованы или изменены, и я не могу понять, как это сделать. Что я имею в виду? Код следующим образом:Ошибка в коэффициентах для многочлена с использованием Numpy

x_vid = array([0.0, 50.0, 75.0, 100.0]) 
y_vid = array([0.0, 30.0, 55.0, 100.0]) 
pol = Polynomial.fit(x_vid, y_vid, 5) # The polynomial is OK!! 
print pol.coef 

Атрибут .coef возвращает следующий массив:

30 38.16 17.93 9.98 2.06 1.85 

Коэффициенты в порядке возрастания так, так что эти коэффициенты представляют следующий полиномиальная функция:

30 + 38.16x + 17.93x^2 + 9.98x^3 + 2.06x^4 + 1.85x^5

Однако при возникновении проблемы, если я заменю любое значение из своего диапазона значений [0-100], оно не вернет правильное значение, несмотря на это, если я сделаю это, например:

pol(0) → Я буду получите 0, что хорошо, но сразу же увидим, что в написанном многочлене он не вернет 0 при x = 0.

Я думаю, что полиномиальная функция может быть нормализована или смещена. Я могу столкнуться здесь с математической проблемой, а не с программированием, но любая помощь действительно приветствуется, потому что мне нужно записать многочлен, и я не уверен в правильности его формы. Благодарю.

Подробнее: http://docs.scipy.org/doc/numpy/reference/generated/numpy.polynomial.polynomial.Polynomial.html#numpy.polynomial.polynomial.Polynomial

+0

Вы пытались использовать ['numpy.polyfit'] (http://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html)? Кроме того, у меня нет таких же коэффициентов, как у вас, у меня на два порядка больше. – darthbith

+0

спасибо @darthbith, что два метода должны быть очень похожими, во всяком случае многочлен хорошо установлен, задача - это коэффициенты для записи полиномиальной функции. Я исправил два порядка величины, которые я разделил на 100 по разным причинам в то время. – Ruips

+0

Я обнаружил, что коэффициенты, возвращаемые 'polyfit', были разумными, а y-перехват соответствовал значению' polyval (pol, 0) '. Я понятия не имею, какие коэффициенты, возвращаемые методом 'Polynomial.fit()', - – darthbith

ответ

1

Полиномиальные коэффициенты для масштабированных и смещенных полиномов для улучшения численной устойчивости. Вы можете либо преобразовать в «обычный» многочлен, либо использовать серию напрямую, если вы замените off + scl*x на x, где off и scl возвращаются pol.mapparms. Чтобы преобразовать в стандартную форму (не рекомендуется), сделайте pol.convert(domain=[-1, 1]).

+0

Точно! Большое спасибо Чарльз Харрис – Ruips

1

Ruips.

Есть три проблемы, связанные с вашим примером:

  1. Вы фитинг пятый полином порядка с только четыре точки данных. Это случай недоопределения, и он, скорее всего, будет производить RankWarnings. Это случайный вопрос, но не основная часть вашей проблемы.

  2. Ожидается, что pol(0) будет работать как numpy.polyval, но это не так. На самом деле я не уверен, что он делает. Класс предоставляет __call__, что делает работу pol(0), но насколько я могу судить, нет документации для вызываемого (см. Polynomial docs). numpy.polynomial.polynomial содержит свою собственную версию polyval. Я проверю его, np.polyval и домашнюю версию test_polyval вместе.

  3. Самое главное, что коэффициенты заказов класса Polynomial отличаются от numpy.polyfit и numpy.polyval. В Polynomial, как вы описали, самый старший коэффициент является последним в списке/массиве. Однако в функциях numpy самый старший коэффициент является первым (см. polyval docs).

фрагмент кода ниже показано, как оценить полином, представленный вашей Polynomial объекта в произвольном множестве х значений, а также показывает, что для того, чтобы получить такое же поведение из numpy.polyval, вы должны обратить вспять порядок коэффициентов с использованием coef[::-1]. Я мог бы эквивалентно использовать numpy.fliplr, чтобы отменить порядок коэффициентов.

import numpy as np 
from numpy.polynomial.polynomial import Polynomial,polyval 
from numpy import array 
import sys 


x_vid = array([0.0, 50.0, 75.0, 100.0]) 
y_vid = array([0.0, 30.0, 55.0, 100.0]) 
pol = Polynomial.fit(x_vid, y_vid, 5) # The polynomial is OK!! 

# I've written this, which should do what numpy.polynomial.polynomial.polyval 
# does, as a sanity check: 
def test_polyval(polynomialInstance,xArray): 
    # check that xArray is a numpy.ndarray, using ndarray.shape 
    try: 
     y = np.zeros(xArray.shape) 
    except Exception as e: 
     sys.exit('polyval error: %s'%e) 

    # manually sum the polynomial terms on xArray 
    for exp,c in enumerate(polynomialInstance.coef): 
     y = y + c*x**exp 

    return y 

# Define some random x values for testing, in the range of points used 
# for fitting: 
x = np.random.rand(100)*100 

# Compute, using our own polyval function, then Polynomial.polyval, 
# and finally using numpy.polyval, making sure to reverse the 
# coefficient order for the last: 
y_test_polyval = test_polyval(pol,x) 
y_Polynomial_polyval = polyval(x,pol.coef) 
y_numpy_polyval = np.polyval(pol.coef[::-1],x) 

# Make sure the two results are within machine epsilon: 
if np.allclose(y_test_polyval,y_numpy_polyval) and \ 
     np.allclose(y_test_polyval,y_Polynomial_polyval): 
    print 'Hurray!' 
+0

. Я также должен был сказать, что я проверил равенство двух реализаций «polyval» по многим другим интервалам (меньше и больше, чем [0,100]). и он работает в другом месте. Я думаю, что существует разница между классом 'Polynomial' и' numpy.polyfit'/'numpy.polyval' с точки зрения подгонки, поскольку первая позволяет вам указать диапазоны, по которым вычисляются остаточные ошибки. – rjonnal

+0

Кроме того, я нашел «Polynomial.polyval'. Это было прямо под моим носом: [http://docs.scipy.org/doc/numpy/reference/generated/numpy.polynomial.polynomial.polyval.html#numpy.polynomial.polynomial.polyval](здесь). – rjonnal

+0

Спасибо за ваш полный ответ, но Чарльз Харрис ответил точно, что я просил. – Ruips

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