Scipy сигмоидальная кривая - PullRequest
0 голосов
/ 10 июня 2018

У меня есть несколько точек данных, и я хотел бы найти подходящую функцию, я думаю, подойдет кумулятивная сигмоидальная функция Гаусса, но я не знаю, как это реализовать.

Это то, что у меня естьпрямо сейчас:

import numpy as np
import pylab
from scipy.optimize
import curve_fit

def sigmoid(x, a, b):
     y = 1 / (1 + np.exp(-b*(x-a)))
     return y

xdata = np.array([400, 600, 800, 1000, 1200, 1400, 1600])
ydata = np.array([0, 0, 0.13, 0.35, 0.75, 0.89, 0.91])

popt, pcov = curve_fit(sigmoid, xdata, ydata)
print(popt)

x = np.linspace(-1, 2000, 50)
y = sigmoid(x, *popt)

pylab.plot(xdata, ydata, 'o', label='data')
pylab.plot(x,y, label='fit')
pylab.ylim(0, 1.05)
pylab.legend(loc='best')
pylab.show()

Но я получаю следующее предупреждение:

... / scipy / optimize / minpack.py: 779: OptimizeWarning: Ковариация параметров не можетбыть оцененной категории = OptimizeWarning)

Может кто-нибудь помочь?Я также открыт для любых других возможностей сделать это!Мне просто нужна кривая в любом случае для этих данных.

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Вы можете установить разумные границы для параметров, например, выполнив

def fsigmoid(x, a, b):
    return 1.0 / (1.0 + np.exp(-a*(x-b)))

popt, pcov = curve_fit(fsigmoid, xdata, ydata, method='dogbox', bounds=([0., 600.],[0.01, 1200.]))

У меня есть вывод

[7.27380294e-03 1.07431197e+03]

и кривая выглядит как

enter image description here

Первая точка в точке (400,0) была удалена как бесполезная.Вы можете добавить его, хотя результат не сильно изменится ...

ОБНОВЛЕНИЕ

Обратите внимание, что границы установлены как ([low_a, low_b], [high_a, high_b]), поэтомуЯ попросил, чтобы масштаб находился в пределах [0 ... 0,01], а местоположение было в пределах [600 ... 1200]

0 голосов
/ 10 июня 2018

Возможно, вы заметили, что полученная посадка совершенно неправильная.Попробуйте передать несколько приличных начальных параметров в curve_fit, с аргументом p0:

popt, pcov = curve_fit(sigmoid, xdata, ydata, p0=[1000, 0.001])

должен дать намного лучшее соответствие, и, вероятно, также не будет предупреждений.

(Запуск по умолчаниюпараметры [1, 1], это слишком далеко от фактических параметров, чтобы получить хорошее соответствие.)

...