scipy.curve_fit () возвращает несколько строк - PullRequest
0 голосов
/ 24 мая 2018

Я новичок в python и пытался соответствовать распределению набора данных, используя следующий код.Фактические данные - это список, который содержит два столбца - прогнозируемая рыночная цена и фактическая рыночная цена.И я пытался использовать scipy.curve_fit(), но это дало мне много линий, нанесенных в одном месте.Любая помощь приветствуется.

# import the necessary modules and define a func.
from scipy.optimize import curve_fit

def func(x, a, b, c):
    return a * x** b + c

# my data
pred_data = [3.0,1.0,1.0,7.0,6.0,1.0,7.0,4.0,9.0,3.0,5.0,5.0,2.0,6.0,8.0]
actu_data =[ 3.84,1.55,1.15,7.56,6.64,1.09,7.12,4.17,9.45,3.12,5.37,5.65,1.92,6.27,7.63]
popt, pcov = curve_fit(func, pred_data, actu_data)

#adjusting y 
yaj = func(pred_data, popt[0],popt[1], popt[2])

# plot the data
plt.plot(pred_data,actu_data, 'ro', label = 'Data')
plt.plot(pred_data,yaj,'b--', label = 'Best fit')

plt.legend()
plt.show()

1 Ответ

0 голосов
/ 24 мая 2018

Scipy не выдает несколько строк, странный вывод вызван тем, как вы представляете несортированные данные в matplotlib.Сортируйте ваши значения x и получите желаемый результат:

from scipy.optimize import curve_fit

def func(x, a, b, c):
    return a * x** b + c

# my data
pred_data = [3.0,1.0,1.0,7.0,6.0,1.0,7.0,4.0,9.0,3.0,5.0,5.0,2.0,6.0,8.0]
actu_data =[ 3.84,1.55,1.15,7.56,6.64,1.09,7.12,4.17,9.45,3.12,5.37,5.65,1.92,6.27,7.63]
popt, pcov = curve_fit(func, pred_data, actu_data)

#adjusting y 
yaj = func(sorted(pred_data), *popt)

# plot the data
plt.plot(pred_data,actu_data, 'ro', label = 'Data')
plt.plot(sorted(pred_data),yaj,'b--', label = 'Best fit')

plt.legend()
plt.show()

enter image description here

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

from scipy.optimize import curve_fit
import numpy as np

def func(x, a, b, c):
    return a * x** b + c

# my data
pred_data = [3.0,1.0,1.0,7.0,6.0,1.0,7.0,4.0,9.0,3.0,5.0,5.0,2.0,6.0,8.0]
actu_data =[ 3.84,1.55,1.15,7.56,6.64,1.09,7.12,4.17,9.45,3.12,5.37,5.65,1.92,6.27,7.63]
popt, pcov = curve_fit(func, pred_data, actu_data)

xaj = np.linspace(min(pred_data), max(pred_data), 1000)
yaj = func(xaj, *popt)

# plot the data
plt.plot(pred_data,actu_data, 'ro', label = 'Data')
plt.plot(xaj, yaj,'b--', label = 'Best fit')

plt.legend()
plt.show()
...