Как сделать Curve_Fit в Python
Мне нужно изогнуть набор данных, используя y = x / (a + x), где a - это параметр, который я должен получить из этого упражнения.
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
x = [1, 2, 7, 10, 20, 70, 200, 1000]
y = [0, 0, 15.3, 34.6, 49.3, 82.6, 100]
def fit(x, a):
return x/(a+x)
par, con = curve_fit(fit, x, y)
plt.plot(x, fit(x, par[0]))
plt.show()
Используя это, я получаю некоторую мерзость приступа. Даже отдаленно не подходит.
Если я попробую это так:
def fit(x, a, b):
return b*x/(a+x)
Я в форме, но без круглых углов. Это просто прямые линии. Что я делаю неправильно?
1 ответ
Обратите внимание, что ваш x
это list
из int
, в Python
деление по умолчанию - целочисленное деление, что здесь не то, что вам нужно.
Таким образом, несколько изменений приведут к тому, что это сработает, используйте в качестве примера 2-ю функцию, ваша первая функция не будет соответствовать, так как она будет иметь предел 1, когда x->inf:
def fit(x, a, b):
return b*x*1./(a+x)
A, B=curve_fit(fit, x, y)[0]
plt.plot(x, fit(x, A, B))
plt.plot(x, y, 'r+')
plt.savefig('temp.png')
Это набор прямых линий, потому что вы рассчитываете только y
на тех x
значения, чтобы получить кривую: измените вызов графика на plt.plot(np.linspace(0,200,100), fit(np.linspace(0,200,100), A, B))