2013-07-02 4 views
1

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

import matplotlib.pyplot as plt 

x = [] 
y = [] 

readFile = open ('TEXT.txt', 'r') 
sepFile = readFile.read().split('\n') 
readFile.close() 

for plotPair in sepFile: 
    xAndY = plotPair.split('\t') 
    x.append(int (xAndY[0])) 
    y.append(float (xAndY[1])) 
print x 
print y 

plt.plot (x, y, 'o') 
plt.xlabel('') 
plt.ylabel('') 
plt.show() 
+0

Чтобы соответствовать математической (например, экспоненциальной) кривой для данных, я бы использовал 'scipy.stats.expon.fit'. Синтаксис одинаковый для любого другого стандартного дистрибутива. – Alex

ответ

2

В общем, действительно подгонки нелинейной кривой является очень трудной задачей (в основном потому, что пространство решений является бесконечным и прерывистая), но в целом SciPy является где вы захотите найти решения этой проблемы. Если вы знаете общую форму уравнения, вы можете применить к нему преобразование и использовать алгоритм полифонии (еще бесконечный, но непрерывный), чтобы попытаться подгонять его. Для этого смотрите здесь:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html

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

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

http://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html

+0

Как уже упоминалось, использование логарифма и выполнение привязки к прямой возможно лучше всего; в противном случае я бы пошел с подпрограммой 'curve_fit' из вышеупомянутого пакета' optimize', который, похоже, наиболее подходит для вашей проблемы. – Evert

0

Использование серии тригонометрических функций при условии, очень надежный способ для подгонки кривой. В приведенном ниже примере используется ряд sines и cosines:

from scipy import sin, cos, linspace 
def f(x, a0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12, 
      c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12): 
    return a0 + s1*sin(1*x) + c1*cos(1*x) \ 
       + s2*sin(2*x) + c2*cos(2*x) \ 
       + s3*sin(3*x) + c3*cos(3*x) \ 
       + s4*sin(4*x) + c4*cos(4*x) \ 
       + s5*sin(5*x) + c5*cos(5*x) \ 
       + s6*sin(6*x) + c6*cos(6*x) \ 
       + s7*sin(7*x) + c7*cos(7*x) \ 
       + s8*sin(8*x) + c8*cos(8*x) \ 
       + s9*sin(9*x) + c9*cos(9*x) \ 
      + s10*sin(9*x) + c10*cos(9*x) \ 
      + s11*sin(9*x) + c11*cos(9*x) \ 
      + s12*sin(9*x) + c12*cos(9*x) 

from scipy.optimize import curve_fit 
popt, pcov = curve_fit(f, x, y) 
x_fit = linspace(x.min(), x.max(), 1000) 
y_fit = f(x_fit, *popt) 

Я надеюсь, что это работает для Вас!

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