Вопрос или проблема
Я пытаюсь воспроизвести в этом исследовании1 инженерию признаков для активности пользователей. Они используют 14 дней накопленной активности пользователей и сохраняют параметры (2 параметра), которые соответствуют сигмоиде. Я хотел бы сделать то же самое, но с 7 днями активности.
Они используют представленную ниже формулу и сохраняют параметры x0 и k в качестве признаков.
from scipy.optimize import curve_fit
import numpy as np
def sigmoid(x, x0, k):
y = 1 / (1 + np.exp(-k*(x-x0)))
return y
Я использовал scipy curve_fit
для нахождения этих параметров следующим образом:
ppov, pcov = curve_fit(sigmoid, np.arange(len(ydata)), ydata, maxfev=20000)
Когда у меня был пользователь с такими значениями:
ydata1 = [0,0,0,0,0,91,91]
У меня возникла следующая ошибка:
RuntimeError: Optimal parameters not found: gtol=0.000000 is too small func(x) is orthogonal to the columns of the Jacobian to machine precision.
Я заметил, что если я добавляю метод ‘dogbox’, то ошибка больше не возникает.
ppov, pcov = curve_fit(sigmoid, np.arange(len(ydata1)), ydata1, maxfev=20000, method='dogbox')
print(ppov[0], ppov[1])
5.189237217957538 11.509279446215949
Тем не менее, я поиграл с другими значениями и заметил, что полученные параметры могут иметь очень различные значения.
Например, если у меня есть такие значения:
ydata2=[0,3,5,30,34,50,91]
ppov, pcov = curve_fit(sigmoid, np.arange(len(ydata2)), ydata2, maxfev=20000)
print(ppov[0], ppov[1])
-24.681668846480264 118.77183210605865
Однако, если я добавлю метод=’dogbox’, я получаю очень разные значения параметров k и x0.
ppov, pcov = curve_fit(sigmoid, np.arange(len(ydata2)), ydata2, maxfev=20000, method='dogbox')
print(ppov[0], ppov[1])
0.28468096463676695 8.154477352500013
Может кто-то помочь мне с двумя вопросами:
-
Я прочитал документацию о ‘dogbox’ и не совсем понимаю. Можете объяснить это проще?
-
Функция curve_fit scipy проходит около 100,000 пользователей, и мне нужно установить параметры curve_fit, чтобы она не выдавала ошибку. Подходит ли метод ‘dogbox’ для моих целей, зная, что результаты параметров кажутся очень различными между методами ‘dogbox’ и стандартным ‘lm’? Или есть другие аргументы в функции curve_fit, которые я мог бы установить вместо этого, чтобы помочь мне избежать этой ошибки?
1 Yang, C., Shi, X., Jie, L., & Han, J. (2018, июль). Я знаю, что вы вернётесь: Интерпретируемая кластеризация новых пользователей и прогноз оттока в мобильном социальном приложении. В материалах 24-й Международной конференции ACM SIGKDD по открытию знаний и добыче данных (стр. 914-922). PDF
Я не могу говорить о алгоритме dogbox, но сигмоида имеет диапазон (0,1), поэтому подгонка к вашим данным, как показано в примере, определенно будет неудачной. В статье, на которую вы ссылаетесь, вероятно, сначала масштабируют входные данные.
Первый пример, который вы приводите, имеет лучшую подгонку, которая является ступенчатой функцией, которую можно аппроксимировать сигмоидой с параметрами, стремящимися к бесконечности; поэтому неудивительно, что алгоритм не сойдется.
ИЗМЕНЕНИЕ: Возможно, вам стоит попробовать увеличить допустимые значения (переданные как kwargs
через curve_fit
в least_squares
); ваше сообщение об ошибке упоминает gtol
специально: https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.least_squares.html#scipy.optimize.least_squares
Или, если сходимость достаточна для ваших целей, просто поймайте и обработайте эту ошибку?
Ответ или решение
Ответ на вопросы о scipy.curve_fit
и методе "dogbox"
Ваша задача заключается в использовании функции подгонки кривой curve_fit
из библиотеки SciPy для нахождения параметров сигмоидной функции, соответствующих данным о пользовательской активности. Вы столкнулись с ошибкой, связанной с тем, что для некоторых данных параметры не могут быть найдены, и метод "dogbox" помогает решить эту проблему. Давайте ответим на ваши вопросы детально.
1. Простое объяснение метода "dogbox"
Метод "dogbox" является одним из алгоритмов оптимизации, используемых для решения нелинейных задач. По сути, этот метод сочетает в себе преимущества двух других методов: Levenberg-Marquardt и Trust Region. Несмотря на свою сложность, если перевести на более простой язык, то можно сказать, что:
- Levenberg-Marquardt: Этот метод хорошо работает, когда функция ошибки близка к нулю, но может столкнуться с проблемами, если функция сильно не линейна или если данные критически близки к ненадежным.
- Trust Region: Этот метод позволяет алгоритму адаптироваться к сложным поверхностям, учитывая характерные особенности области поиска (доменных значений).
Метод "dogbox" комбинирует эти подходы, что делает его более устойчивым к проблемам, связанным с начальным приближением и качеством данных.
Таким образом, когда используется метод "dogbox", происходит более надежная конвергенция даже в сложных ситуациях, что, похоже, вы и наблюдали в своих экспериментах.
2. Подбор параметров для curve_fit
Способ, которым вы используете метод "dogbox", хорош, так как он помогает избежать ошибок, возникающих при "линейном" методе lm в случае комплексных данных. Тем не менее, нужно также учитывать, как вы определяете вашу сигмоидальную функцию и каковы значения в ydata
.
Ваши два примера данных:
ydata1 = [0,0,0,0,0,91,91]
ydata2 = [0,3,5,30,34,50,91]
показывают, что в первом случае данные являются почти дискретными (шаги резкие), и алгоритм может не справиться с них.
Теперь рассмотрим, как избежать проблемы с gtol
:
-
Увеличьте
gtol
: Параметры сходимости могут быть адаптированы. Попробуйте добавитьbounds
для параметров, чтобы ограничить их диапазон и улучшить сходимость. -
Параметры
maxfev
иxtol
: Вы уже увеличилиmaxfev
, но вы можете также поиграть сxtol
для контроля допустимого изменения параметров.
Таким образом, ваш вызов curve_fit
может выглядеть следующим образом:
ppov, pcov = curve_fit(sigmoid, np.arange(len(ydata2)), ydata2,
maxfev=20000, method='dogbox',
bounds = (0, [10, 100]),
xtol=1e-8)
print(ppov[0], ppov[1])
Заключение
Использование метода "dogbox" хорошо подходит для работы с нестандартными данными, особенно если вы сталкиваетесь с проблемами конвергенции. Однако стоит помнить, что разные методы могут давать разные результаты. Если различия значительны и влияют на вашу модель, возможно, стоит провести дополнительный анализ или рассмотреть возможность нормализации ваших данных.
Удачи в вашей работе с подгонкой! Если будут дополнительные вопросы — не стесняйтесь спрашивать.