От линейной к логистической регрессии
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, став участником.