2015-10-19 2 views
0

Я пытаюсь экспоненциально подгонять некоторые данные, но не могу принудить scipy.optimize.curve_fit, чтобы дать мне приятный результат.Неверная экспоненциальная подгонка с `scipy.optimize.curve_fit`

Я свел свой код на пример ниже, включая эмпирически полученное руководство, соответствующее данным.

import matplotlib.pylab as plt 
import numpy 
import scipy.stats 

x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 
    43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 
    61, 62, 63, 64] 
y = [9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 
    14, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 21, 22, 24, 25, 27, 30, 31, 
    32, 37, 37] 

def fitting_function(x, a, b, c): 
    return a * numpy.exp(b * x) + c 

plt.plot(x, y, 'o', label='Original data') 
OptimalValues, Covariance = scipy.optimize.curve_fit(fitting_function, x, y) 
plt.plot(x, fitting_function(x, *OptimalValues), '-', 
     label='Fitted Curve (%0.2e*e^%sx+%0.2e)' % (OptimalValues[0], 
               OptimalValues[1], 
               OptimalValues[2])) 
ManualFit = [0.1 * numpy.exp(0.09 * i) + 8 for i in x] 
plt.plot(x, ManualFit, '-', label='Manual Fit (%s*e^%sx+%s)' % (0.1, 0.09, 8)) 
plt.legend(loc='best') 
plt.show() 

Result of the code above

Согласно другим ответам здесь на переполнение стека очевидным решением является предоставление curve_fit с разумной первоначальной догадке. Если я могу это сделать, поставив следующие строки в соответствующем месте моего кода (строки 16 и 17) переводчик жалуется на ValueError, потому что это как-то пытается транслировать guess к len(x) или len(y0 (т.е. операнды не могут передаваться вместе с формы (0) (40).

guess = (0.1, 0.1, 10) 
OptimalValues, Covariance = scipy.optimize.curve_fit(fitting_function, x, y, 
                p0=guess) 

Как я могу получить scipy.optimize.curve_fit дать мне содержательный выход в этом случае?

ответ

1

Превратите x и y списки в numpy массивы, и будет работать нормально. Я обнаружил, что для того, чтобы получить удовлетворительную форму, вам нужно включить свое первоначальное предположение. Таким образом, этот код:

import matplotlib.pylab as plt 
import numpy 
import scipy.stats 

x = numpy.array([25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 
    43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 
    61, 62, 63, 64]) 
y = numpy.array([9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 
    14, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 21, 22, 24, 25, 27, 30, 31, 
    32, 37, 37]) 

def fitting_function(x, a, b, c): 
    return a * numpy.exp(b * x) + c 

plt.plot(x, y, 'o', label='Original data') 

guess =(0.1,0.1,10) 
OptimalValues, Covariance = scipy.optimize.curve_fit(fitting_function, x, y, 
                p0=guess) 

plt.plot(x, fitting_function(x, *OptimalValues), '-', 
     label='Fitted Curve (%0.2e*e^%sx+%0.2e)' % (OptimalValues[0], 
               OptimalValues[1], 
               OptimalValues[2])) 
ManualFit = [0.1 * numpy.exp(0.09 * i) + 8 for i in x] 
plt.plot(x, ManualFit, '-', label='Manual Fit (%s*e^%sx+%s)' % (0.1, 0.09, 8)) 
plt.legend(loc='best') 
plt.show() 

Производит этот сюжет:

enter image description here

+0

Спасибо за подсказку, что было не совсем очевидно, до сих пор ... – Habi

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