2017-01-20 6 views
0

Здравствуйте, у меня есть проблема с подгонкой некоторых данных с помощью Python. Я только начинаю соответствовать моим данным с Python, так у меня есть некоторые проблемы ... Это мой код:Оптимальные параметры, не найденные для моей кривой подгонки

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.optimize import * 
from numpy import linalg as LA 
def f(x,a,b,c): 
    return a*np.power(x,b)+c 

x = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,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,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79]) 
y = np.array([7200,7925,8050,8200,8000,7550,7500,6800,6400,8150,6566,6280,6105,5963,5673,5495,5395,4800,4550,4558,4228,4087,3951,3817,3721,3612,3498,3416,3359,3269,3163,3241,2984,4475,2757,2644,2555,2600,3163,2720,2630,2543,2454,2441,2389,2339,2293,2261,2212,2180,2143,2450,2065,2032,1994,1960,1930,1897,1870,1838,1821,1785,1763,1741,1718,1689,1676,1662,1635,1635,1667,1633,1617,1615,1599,1581,1565,1547,1547]) 
params, extras = curve_fit(f, x, y) 
plt.plot(x,y, 'o') 
plt.plot(x, f(x, params[0], params[1], params[2])) 
plt.title('Fit') 
plt.legend(['data','fit'],loc='best') 
plt.show() 

И на самом деле я хочу, чтобы соответствовать моим данным с функцией f(x) = a*x^b + c где я искал лучшие значения a, b и c, чтобы соответствовать моим данным.

Вы знаете, где что-то не так?

Благодарим за помощь.

+0

Насколько вы уверены, что базовая модель - это закон власти? –

ответ

1

Три предостережений:

  • ваша модель не очень хорошо.
  • он отклоняется в x = 0: не принимать первые очки.
  • вы должны дать начальные оценки параметров.

Exemple:

p0=[50000,-1,0] 
x=x[10:] 
y=y[10:] 
params, cov = curve_fit(f, x, y,p0) #params=[3.16e+04 -5.83e-01 -1.00e+03] 
plt.plot(x,y, 'o') 
plt.plot(x, f(x, *params)) 
plt.title('Fit') 
plt.legend(['data','fit'],loc='best') 
plt.show() 

fit

Вы можете оценить качество модели с помощью

In [178]: np.sqrt(np.diag(cov))/params 
Out[178]: array([ 0.12066005, -0.12537714, -0.53450057]) 

, который показывает, что оценка погрешности от параметров больше, чем 10 %.

+0

Спасибо, что это прекрасно! –

0

Проблема - это функция, которую вы используете для установки. Рассмотрим, используя нечто вроде

def f(x, a, b, c): 
    return a*x + b*np.power(x, 2) + c 

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

+0

Извините, но в чем разница между моей функцией: def f (x, a, b, c): return a * np.power (x, b) + c? –

+0

@PaulHain жаль, что я случайно отправил вашу оригинальную функцию снова (должно быть, перепутал мои снаряды). Я исправил его и добавил многочлен 2-го порядка, который я хотел предложить в первую очередь. – Jann

+0

Хммм .... Я не думаю, что парабола - лучшая модель. –