Как сделать 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))введите описание изображения здесь

Другие вопросы по тегам