Экстраполяция данных, построенных с использованием matplotlib - PullRequest
5 голосов
/ 28 ноября 2010

У меня есть 10 значений x и y в моем файле.

Есть ли способ экстраполировать график, то есть превратить его в непрерывную функцию и увеличить диапазон для других значений x в matplotlib??

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

Ответы [ 3 ]

12 голосов
/ 28 ноября 2010

ниже я использую Сципи , но те же функции ( polyval и polyfit ) также находятся в NumPy ; NumPy является зависимостью Matplotlib, поэтому вы можете импортировать эти две функции оттуда, если у вас не установлен SciPy.

import numpy as NP
from scipy import polyval, polyfit
from matplotlib import pyplot as PLT

n=10   # 10 data points
# make up some data
x = NP.linspace(0, 1, n)
y = 7*x**2 - 5*x + 3
# add some noise 
noise = NP.random.normal(.5, .3, 10)
y += noise

# the shape of the data suggests a 2d polynomial, so begin there
# a, b, c are the polynomial coefficients: ax^2 + bx + c
a, b, c = polyfit(x, y, 2)
y_pred = polyval([a, b, c], x)    # y_pred refers to predicted values of y

# how good is the fit?
# calculate MSE:
MSE = NP.sqrt( NP.sum((y_pred-y)**2)/10 )
# MSE = .2

# now use the model polynomial to generate y values based on x values outside 
# the range of the original data:
x_out = NP.linspace(0, 2, 20)   # choose 20 points, 10 in, 10 outside original range
y_pred = polyval([a, b, c], x_out)

# now plot the original data points and the polynomial fit through them
fig = PLT.figure()
ax1 = fig.add_subplot(111)

ax1.plot(x, y, 'g.', x_out, y_pred, 'b-' )

PLT.show()

alt text

5 голосов
/ 28 ноября 2010

Если вы используете SciPy (Scientific Python), вы можете попробовать scipy.interp1d. См. руководство для примера.

В противном случае любое приличное программное обеспечение для работы с электронными таблицами должно уметь выполнять сплайн-интерполяцию и давать вам хороший гладкий график.

Остерегайтесь экстраполяции , хотя. Если у вас нет подходящей модели для ваших данных, вы можете получить совершенно несвязанные данные при экстраполяции за пределы входного диапазона.

Пример (РЕДАКТИРОВАТЬ):

from scipy.interpolate import interp1d

# the available data points
x = [1, 2, 3]
y = [10, 20, 30]

# return a function f, such that f(x) is the interpolated value at 'x'
f = interp1d(x, y, kind='cubic')

Теперь вы можете вычислить функцию f(x) в любой точке x. Например, print f(2.5) вернет интерполированное значение для x = 2.5.

0 голосов
/ 01 декабря 2010

Большая часть того, что вы хотите, может быть найдена здесь: http://docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html

Но не экстраполируйте, по крайней мере, пока вы не будете абсолютно уверены, что знаете, что делаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...