От линейной к логистической регрессии

Table of Contents
Introduction
1. Linear models
2. Quadratic models
3. Cubic models
4. Exponential models
5. Logarithmic models
6. Sinusoidal models
7. Logistic models
Conclusion

Вступление

Мы собираемся нарисовать диаграмму рассеяния и смоделировать линию регрессии от линейной к логистической с помощью Jupyter Notebook.

Линейные модели

Первая - это линейная модель. Линейная модель выражается как 𝑦 = 𝑚𝑥 + 𝑐. Мы собираемся использовать numpy.array или numpy.arange для создания данных. Если вы хотите узнать больше о линейной взаимосвязи, прочтите Мера линейной взаимосвязи. Мы импортируем библиотеки Python numpy и matplotlib. Создаем год и массив co2.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
year=np.array([1980,1982,1984,1986,1988,1990,1992,1994,1996,1998,2000])
co2=np.array([338.7,341.1,344.4,347.2,351.5,354.2,356.4,358.9,362.6,366.6,369.4])

Сначала мы создаем диаграмму рассеяния с помощью matplotlib. Добавьте заголовок, метку, метки по осям x и y. Вам нужно использовать метод show(). Вы можете строить без него, но это приведет к удалению ненужных выходных данных.

plt.scatter(year,co2,label='CO2')
plt.title("Year vs CO2")
plt.xlabel('Year')
plt.ylabel('CO2')
plt.legend()
plt.show()

Целые числа по оси x

Как вы можете видеть на приведенном выше графике, у вас есть десятичные дроби по оси абсцисс. Мы используем первые три строки, чтобы сделать их целыми числами в следующих кодах.

from matplotlib.ticker import MaxNLocator
ax = plt.figure().gca()
ax.xaxis.set_major_locator(MaxNLocator(integer=True))
plt.scatter(year,co2,label='CO2')
plt.title("Year vs CO2")
plt.xlabel('Year')
plt.ylabel('CO2')
plt.legend()
plt.show()

Поиск линейной модели с numpy.polyfit и numpy.poly1d

Самый простой способ - использовать numpy.polyfit. Установив порядок на 1, он вернет массив линейных коэффициентов. Использование его в numpy.poly1d возвращает уравнение с использованием коэффициентов.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
from sklearn.linear_model import LinearRegression
%matplotlib inline
ax = plt.figure().gca()
ax.xaxis.set_major_locator(MaxNLocator(integer=True))
year=np.array([1980,1982,1984,1986,1988,1990,1992,1994,1996,1998,2000])
co2=np.array([338.7,341.1,344.4,347.2,351.5,354.2,356.4,358.9,362.6,366.6,369.4])
coef = np.polyfit(year, co2, 1)
equ = np.poly1d(coef)
x_plot = np.linspace(1975,2005,100)
y_plot = equ(x_plot)
plt.plot(x_plot, y_plot, color='r')
plt.scatter(year,co2,label='CO2')
plt.title("Year vs CO2")
plt.xlabel('Year')
plt.ylabel('CO2')
plt.legend()
plt.show()

Поиск линейной модели с помощью scikit-learn

Второй способ найти наклон и точку пересечения регрессии - использовать sklearn.linear_model.LinearRegression. Этот класс требует, чтобы значения x были одним столбцом. Мы изменяем данные за год, используя reshape(-1,1). Исходные данные года имеют форму 1 к 11. Вам нужно изменить данные за год на 11 на 1.

year1=year.reshape((-1,1))
print(np.shape(year))
print(np.shape(year1))

Мы импортируем sklearn.linear_model.LinearRegression, изменяем данные за год, подгоняем наши данные с помощью LinearRegression().fit(). Это вернет наклон coef_ и точку пересечения по оси Y intercept_. coef_ возвращает массив, поэтому мы берем первый элемент, используя reg.coef_[0]. Распечатаем уравнение линии регрессии.

from sklearn.linear_model import LinearRegression
year1=year.reshape((-1,1))
reg = LinearRegression().fit(year1,co2)
slope=reg.coef_[0]
intercept=reg.intercept_
print(f'The equation of regression line is y={slope:.3f}x+{intercept:.3f}.')

Все вместе

Мы вместе рисуем диаграмму рассеяния и линию линейной регрессии. Мы используем новый домен x с 1975 по 2005 год, взяв 100 выборок для линии регрессии np.linspace(1975,2005,100). Затем, используя домен x, наклон и точку пересечения y, чтобы нарисовать линию регрессии.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
from sklearn.linear_model import LinearRegression
%matplotlib inline
ax = plt.figure().gca()
ax.xaxis.set_major_locator(MaxNLocator(integer=True))
year=np.array([1980,1982,1984,1986,1988,1990,1992,1994,1996,1998,2000])
co2=np.array([338.7,341.1,344.4,347.2,351.5,354.2,356.4,358.9,362.6,366.6,369.4])
year1=year.reshape((-1,1))
reg = LinearRegression().fit(year1,co2) 
slope=reg.coef_[0]
intercept=reg.intercept_
plt.scatter(year,co2,label='CO2')
X_plot = np.linspace(1975,2005,100)
Y_plot = slope*X_plot+intercept
plt.plot(X_plot, Y_plot, color='r')
plt.title("Year vs CO2")
plt.xlabel('Year')
plt.ylabel('CO2')
plt.legend()
plt.show()
print(f'The equation of regression line is y={slope:.3f}x+{intercept:.3f}.')

Поиск линейной модели с помощью scipy

Другой способ найти наклон регрессии и точку пересечения - использовать scipy.stats.linregress. Это возвращает slope, intercept, rvalue, pvalue, stderr.

from scipy.stats import linregress
slope, intercept, r_value, p_value, std_err = linregress(year,co2)
print(f'The equation of regression line is y={slope:.3f}x+{intercept:.3f}.')

График линейной регрессии

Чтобы нарисовать линию, нам нужно x точек. Мы используем np.linspace, что равно numpy.linspace, поскольку мы использовали import numpy as np. Наши данные относятся к 1975–2000 гг. Итак, давайте возьмем 1960 для start, 2005 для stop и 100 для количества выборок.

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import linregress
%matplotlib inline
year=np.array([1980,1982,1984,1986,1988,1990,1992,1994,1996,1998,2000])
co2=np.array([338.7,341.1,344.4,347.2,351.5,354.2,356.4,358.9,362.6,366.6,369.4])
X_plot = np.linspace(1975,2005,100)
Y_plot = slope*X_plot+intercept
plt.plot(X_plot, Y_plot, color='r')
plt.show()

Теперь мы сопоставим диаграмму рассеяния, линию регрессии и уравнение регрессии.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
from scipy.stats import linregress
%matplotlib inline
ax = plt.figure().gca()
ax.xaxis.set_major_locator(MaxNLocator(integer=True))
slope, intercept, r_value, p_value, std_err = linregress(year,co2)
X_plot = np.linspace(1975,2005,100)
Y_plot = slope*X_plot+intercept
plt.plot(X_plot, Y_plot, color='r')
plt.scatter(year,co2,label='CO2')
plt.title("Year vs CO2")
plt.xlabel('Year')
plt.ylabel('CO2')
plt.legend()
plt.show()
print(f'The equation of regression line is y={slope:.3f}x+{intercept:.3f}.')

Практика 1

Используйте следующие данные для построения графика рассеяния и линии регрессии. Найдите уравнение линейной регрессии.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
temp = np.array([55,60,65,70,75,80,85,90])
rate = np.array([45,80,92,114,141,174,202,226])

Отвечать

Вы нарисовали график разброса и регрессии? Линия регрессии должна быть 𝑦 = 5,119 𝑥 −236,88.



Квадратичные модели

Мы используем arange Numpy для создания 10 целых чисел от 0 до 9.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
time = np.arange(10)
height = np.array([450,445,430,409,375,331,280,215,144,59])

Построим график вышеупомянутых данных.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
plt.scatter(time,height,label='Height of a ball')
plt.title("Time vs Height")
plt.xlabel('Time')
plt.ylabel('Height')
plt.legend()
plt.show()

numpy.polyfit соответствует многочлену. Для этого требуются x, y и степень аппроксимирующего полинома. 2 для квадратичного, 3 для кубического и т. Д. Он возвращает массив с полиномиальными коэффициентами от более высокой степени до константы. Для квадратичной функции это a, b и c в:

coef = np.polyfit(time, height, 2)
coef

Распечатаем линию квадратичной регрессии.

print(f'The equation of regression line is y=')
print(equ)

Или, используя коэффициенты, линия регрессии:

print(f'The equation of regression line is y={coef[0]:.3f}x^2+{coef[1]:.3f}x+{coef[2]:.3f}.')

Мы снова используем poly1d и polyfit NumPy. np.poly1d(coefficients) вернет полиномиальное уравнение с использованием нашего коэффициента.

equ = np.poly1d(coef)

Мы можем найти значение для любого x. Например, если вы хотите найти значение y при x = 1:

equ(1)

Мы используем это, чтобы нарисовать нашу линию регрессии. Мы используем numpy.linspace для определения значений x от 0 до 10 для 100 выборок. И используйте его в equ для значений y.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x_plot = np.linspace(0,10,100)
y_plot = equ(x_plot)
plt.plot(x_plot, y_plot, color='r')
plt.show()

Мы все это собрали.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
time = np.arange(10)
height = np.array([450,445,430,409,375,331,280,215,144,59])
coef = np.polyfit(time, height, 2)
equ = np.poly1d(coef)
x_plot = np.linspace(0,10,100)
y_plot = equ(x_plot)
plt.plot(x_plot, y_plot, color='r')
plt.scatter(time,height,label='Height of a ball')
plt.title("Time vs Height")
plt.xlabel('Time')
plt.ylabel('Height')
plt.legend()
plt.show()
print(f'The equation of regression line is y=')
print(equ)

Практика 2

Используя следующие данные, нарисуйте диаграмму рассеяния и линию регрессии на графике. Найдите уравнение квадратичной регрессии.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
angle = np.arange(20,80,10)
distance = np.array([371,465,511,498,439,325])

Отвечать

Не могли бы вы провести линию разброса и регрессии? Квадратное уравнение должно быть:



Кубические модели

Вы можете использовать тот же метод, что и квадратичная функция выше. Мы собираемся использовать plyfit и poly1d. Сначала подготавливаем данные. А давайте нарисуем диаграмму рассеяния.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
engspeed = np.arange(9,23,2)
avespeed = np.array([6.45,7.44,8.88,9.66,10.98,12.56,15.44])
plt.scatter(engspeed,avespeed,label='Speed of different boat engine')
plt.title("Average speed of different boat engine")
plt.xlabel('Engine speed')
plt.ylabel('Boad speed')
plt.ylim(0,20)
plt.legend()
plt.show()

Использование polyfit возвращает коэффициенты. Для кубической функции a, b, c и d в:

coef = np.polyfit(engspeed, avespeed, 3)
print(coef)

Собираем все вместе.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
engspeed = np.arange(9,23,2)
avespeed = np.array([6.45,7.44,8.88,9.66,10.98,12.56,15.44])
plt.scatter(engspeed,avespeed,label='Speed of different boat engine')
coef = np.polyfit(engspeed, avespeed, 3)
equ = np.poly1d(coef)
x_plot = np.linspace(8,25,100)
y_plot = equ(x_plot)
plt.plot(x_plot, y_plot, color='r')
plt.title("Average speed of different boat engine")
plt.xlabel('Engine speed')
plt.ylabel('Boad speed')
plt.ylim(0,20)
plt.legend()
plt.show()
a, b, c, d = coef
print(f'The equation of regression line is y={a:.3f}x^3+{b:.3f}x^2+{c:.3f}x+{d}.')

Практика 3

Нарисуйте диаграмму рассеяния и линию кубической регрессии, используя следующие данные. Выведите кубическое уравнение.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x=np.arange(1,8)
y=np.array([0,0.012,0.06,0.162,0.336,0.6,0.972])

Отвечать

Не могли бы вы построить линию разброса и регрессию? Уравнение линии регрессии должно быть:

Коэффициенты: [3.00000000e-03, -1.16796094e-16, -9.00000000e-03, 6.00000000e-03]. Это означает:

Второй - практически 0. Попробуйте выполнить следующее, чтобы убедиться, что оба значения равны 0,3.

print(300e-03)
print(300*10**(-3))

Экспоненциальные модели

Мы собираемся исследовать три экспоненциальные модели.

Давайте настроим данные. И нарисуйте точечную диаграмму.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
day = np.arange(0,8)
weight = np.array([251,209,157,129,103,81,66,49])
plt.scatter(day,weight,label='Weight change')
plt.title("Day vs Weight")
plt.xlabel('Day')
plt.ylabel('Weight')
plt.legend()
plt.show()

Мы собираемся использовать scipy.optimize.curve_fit. Для этого требуется функция, значения x и y и начальные значения p0 в форме массива. Поиск правильного p0 - это метод проб и ошибок. Вы должны проверить разные значения. Мы используем p0=(1, 1e-6, 1). Он возвращает оптимальные значения для параметров и предполагаемую ковариацию popt.

𝑎⋅𝑒^−𝑏𝑥+𝑐

Наша первая экспоненциальная функция использует a, b и c. Сначала мы собираемся определить функцию. Это используется в методе curve_fit. Для гладкой кривой мы устанавливаем значения x с помощью numpy.linspace от 0 до 7 со 100 выборками.

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
%matplotlib inline
def func(x, a, b, c):
    return a * np.exp(-b * x) + c
popt, pcov = curve_fit(func, day, weight, p0=[1, 1e-6, 1])
x_plot=np.linspace(0,7,100)
plt.plot(x_plot, func(x_plot, *popt), 'r-')
plt.scatter(day,weight,label='Day vs Weight')
plt.title("Day vs Weight a*e^-bx +c")
plt.xlabel('Day')
plt.ylabel('Weight')
plt.legend()
plt.show()
# equation
a=popt[0].round(2)
b=popt[1].round(2)
c=popt[2].round(2)
print(f'The equation of regression line is y={a}e^({b}x)+{c}')

𝑎⋅𝑒^−𝑏𝑥

Вторая функция использует a и b. Мы определяем функцию соответственно.

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
%matplotlib inline
def func2(x, a, b):
    return a * np.exp(-b * x)
popt, pcov = curve_fit(func2, day, weight, p0=[1, 1e-6])
x_plot=np.linspace(0,7,100)
plt.plot(x_plot, func2(x_plot, *popt), 'r-')
plt.scatter(day,weight,label='Day vs Weight')
plt.title("Day vs Weight a*e^-bx")
plt.xlabel('Day')
plt.ylabel('Weight')
plt.legend()
plt.show()
# equation
a=popt[0].round(2)
b=popt[1].round(2)
print(f'The equation of regression line is y={a}e^({b}x)')

𝑎⋅𝑏^𝑥

Последняя экспоненциальная функция использует a и b. Соответственно модифицируем функцию.

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
%matplotlib inline
def func3(x, a, b):
    return a * b ** x
popt, pcov = curve_fit(func3, day, weight, p0=[1, 1e-6])
x_plot=np.linspace(0,7,100)
plt.plot(x_plot, func3(x_plot, *popt), 'r-')
plt.scatter(day,weight,label='Day vs Weight')
plt.title("Day vs Weight a*b^x")
plt.xlabel('Day')
plt.ylabel('Weight')
plt.legend()
plt.show()
# equation
a=popt[0].round(4)
b=popt[1].round(4)
print(f'The equation of regression line is y={a}*{b}^x')

Сравнение с результатом TI Nspire

Экспоненциальная регрессия TI Nspire соответствует уравнению модели 𝑦 = 𝑎𝑏 ^ 𝑥 для данных с использованием метода наименьших квадратов для преобразованных значений x и 𝑙𝑛 ( 𝑦). Он возвращает другое значение.

Упражняться

Используя следующие данные, найдите экспоненциальную функцию в форме ab ^ x. Постройте диаграмму рассеяния и проведите линию регрессии.

import numpy as np
week = np.arange(1,21)
views = np.array([102365, 38716,21617,24305,9321,14148,2103,8285,5098,3777,831,1007,834,34,378,204,6,42,54,31])

Отвечать

Логарифмические модели

Полубревенчатые модели

Обычно мы используем полулогарифмическую модель для экспоненциальной функции:

Мы настраиваем наши фиктивные данные и строим диаграмму разброса.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
time = np.arange(0,30,4)
bacteria = np.array([20,150,453,920,1820,9765,15487,19450])
plt.scatter(time,bacteria,label='Bacteria')
plt.title("Time vs Bacteria")
plt.xlabel('time')
plt.ylabel('bacteria')
plt.legend()
plt.show()

Мы собираемся взять естественный логарифм для значений бактерий, используя numpy.log. numpy.log - натуральный логарифм. Это должно показать линейный тренд. Нам нужно изменить заголовок и метку y на ln(bacteria).

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
time = np.arange(0,30,4)
bacteria = np.array([20,150,453,920,1820,9765,15487,19450])
plt.scatter(time,np.log(bacteria),label='Bacteria')
plt.title("Time vs ln(Bacteria)")
plt.xlabel('time')
plt.ylabel('ln(bacteria)')
plt.legend()
plt.show()

Мы используем numpy.polyfit, который мы использовали в квадратичной и кубической функции. Мы используем 1 в numpy.polyfit(), чтобы он возвращал линейную регрессию. numpy.polyfit возвращает все коэффициенты для нашего уравнения.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
time = np.arange(0,30,4)
bacteria = np.array([20,150,453,920,1820,9765,15487,19450])
p = np.polyfit(time, np.log(bacteria), 1)
plt.plot(time, p[0] * time + p[1], 'g--', label='Semi-log graph')
plt.scatter(time,np.log(bacteria),label='Bacteria')
plt.title("Time vs Bacteria")
plt.xlabel('time')
plt.ylabel('bacteria')
plt.legend()
plt.show()
print(f'The equation of regression line is y={p[0]:.3f} * x + {p[1]:.3f}')

Бревенчатые модели

Модель журнала-журнала используется для степенной функции.

Давайте настроим данные и построим диаграмму рассеяния.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x=np.array([2,30,70,100,150])
y=np.array([4.24,16.4,25.1,30,36.7])
plt.scatter(x,y,label='Log-log')
plt.title("Log-Log model")
plt.xlabel('x')
plt.ylabel('y')
plt.legend()
plt.show()

Мы берем натуральный логарифм для значений x и y, используя numpy.log. Нам нужно изменить метки x и y на ln (x) и ln (y).

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x=np.array([2,30,70,100,150])
y=np.array([4.24,16.4,25.1,30,36.7])
p = np.polyfit(np.log(x), np.log(y), 1)
plt.plot(np.log(x), p[0] * np.log(x) + p[1], 'r--', label='Regression line')
plt.scatter(np.log(x),np.log(y),label='log-log')
plt.title("Log-log regression")
plt.xlabel('ln(x)')
plt.ylabel('ln(y)')
plt.legend()
plt.show()
print(f'The equation of regression line is ln(y)={p[0]:.3f} * ln(x) + {p[1]:.3f}')

Синусоидальные модели

Давайте попробуем синусоидальную функцию. Мы устанавливаем наши данные и строим точечный график. Поскольку мы собираемся использовать scipy.optimize.curve_fit, давайте также импортируем его. Мы использовали его в экспоненциальных моделях. Мы настраиваем наши данные и рисуем диаграмму рассеяния.

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
%matplotlib inline
year=np.arange(0,24,2)
population=np.array([10.2,11.1,12,11.7,10.6,10,10.6,11.7,12,11.1,10.2,10.2])
plt.scatter(year,population,label='Population')
plt.title("Year vs Population")
plt.xlabel('Year')
plt.ylabel('Population')
plt.legend()
plt.show()

Мы определяем функцию с именем sinfunc. Это принимает параметры x, a, b, c, d. Мы используем numpy.radians вместо c.

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
%matplotlib inline
year=np.arange(0,24,2)
population=np.array([10.2,11.1,12,11.7,10.6,10,10.6,11.7,12,11.1,10.2,10.2])
def sinfunc(x, a, b, c, d):
    return a * np.sin(b * (x - np.radians(c)))+d
popt, pcov = curve_fit(sinfunc, year, population, p0=[1,0.4,1,5])
x_data = np.linspace(0, 25, num=100)
plt.scatter(year,population,label='Population')
plt.plot(x_data, sinfunc(x_data, *popt), 'r-',label='Fitted function')
plt.title("Year vs Population")
plt.xlabel('Year')
plt.ylabel('Population')
plt.legend()
plt.show()
a, b, c, d = popt
print(f'The equation of regression line is y={a:.3f} * sin({b:.3f}(x-{np.radians(c):.3f}))+{d:.3f}')

Упражняться

Используя приведенную ниже таблицу, нарисуйте диаграмму рассеяния и найдите функцию косинусной регрессии.

Отвечать

У вас могут быть разные коэффициенты. я использовал

Логистические модели

Настраиваем данные и строим диаграмму разброса. Мы устанавливаем домен от -10 до 10 и диапазон от 0 до 250, используя plt.xlim и plt.ylim. Мы собираемся использовать scipy.optimize.curve_fit для логистической регрессии.

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
%matplotlib inline
x=np.arange(0,10)
y=np.array([52,133,203,230,237,239.5,239.8,239.9,240,240])
plt.scatter(x, y, label='Regression line')
plt.title("Logistic regression")
plt.xlabel('x')
plt.ylabel('y')
plt.xlim(-10,10)
plt.ylim(0,250)
plt.legend()
plt.show()

Мы определяем нашу логистическую функцию с помощью logifunc. Мы находим параметр функции в popt, используя curve_fit. Для линии регрессии мы устанавливаем новый домен для функции, x_data от -10 до 10. Мы строим линию, используя plt.plot.

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
%matplotlib inline
x=np.arange(0,10.0)
y=np.array([52,133,203,230,237,239.5,239.8,239.9,240,240])
def logifunc(x,L,c,k):
    return L/ (1 + c*np.exp(-k*x))
popt, pcov = curve_fit(logifunc, x, y, p0=[200,1,1])
x_data = np.linspace(-10, 10, num=100)
plt.scatter(x,y,label='Logistic function')
plt.plot(x_data, logifunc(x_data, *popt), 'r-',label='Fitted function')
plt.title("Logistic")
plt.xlabel('x')
plt.ylabel('y')
plt.xlim(-10,10)
plt.ylim(0,250)
plt.legend()
plt.show()

Когда y точек данных отрицательные

Иногда ваши данные могут иметь отрицательные значения в координатах y.

import pandas as pd
df = pd.read_csv('http://bit.ly/2tUIZjK')
df.head()

Минимальное значение для данных должно быть нулевым. И в идеале средняя точка сигмовидной кишки также равна нулю. Но приведенный выше набор данных не удовлетворяет ни одну из них. Использование уравнения (1–2) и добавление значения offset работает для этого набора данных.

x=df.T.iloc[0]
y=df.T.iloc[1]
def logifunc(x,L,x0,k,off):
    return L / (1 + np.exp(-k*(x-x0)))+off
plt.scatter(x,y,label='Logistic function')
popt, pcov = curve_fit(logifunc, x, y, p0=[50,185,0.1,-222])
plt.scatter(x,y,label='Logistic function')
x_data = np.linspace(170,205,num=100)
plt.plot(x_data, logifunc(x_data, *popt), 'r-',label='Fitted function')
plt.legend()
plt.show()
print(popt)

Заключение

scipy.optimize.curve_fit был полезен для многих функций. Единственная проблема заключалась в том, чтобы найти хорошие начальные значения в p0. Иногда разные p0 значения возвращают разные popt. Вы можете попробовать LMFIT.

Новостная рассылка

Получите полный доступ ко всем статьям на Medium, став участником.

использованная литература