Это мои данные:
x
array([ 0, 7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84,
91, 98, 105, 112, 119, 126, 133, 140, 147, 154, 161, 168, 175])
y
array([0.4 , 0.4 , 0.4 , 0.4 , 0.6 , 0.6 , 0.6 , 0.6 , 0.6 , 0.97, 0.97,
0.97, 0.97, 1.13, 1.13, 1.13, 1.13, 1.13, 0.9 , 0.9 , 0.9 , 0.9 ,
0.7 , 0.7 , 0.7 , 0.7 ])
Я подал заявку pwlf
- https://pypi.org/project/pwlf, но каждый раз, когда я выполняю этот код, я получаю разные fit_breaks
:
pwlf_model = pwlf.PiecewiseLinFit(x, y ,degree=1)
pwlf_model.fit(4)
Первый забег
pwlf_model.fit_breaks
array([ 0. , 58.01861485, 60.07425168, 104.30868782,
175. ])
Второй запуск
pwlf_model.fit_breaks
array([ 0. , 59.48475228, 59.67460644, 104.30594173,
175. ])
Третий запуск
pwlf_model.fit_breaks
array([ 0. , 56.60204 , 62.0270283 , 104.30827438,
175. ])
Четвертый запуск
pwlf_model.fit_breaks
array([ 0. , 58.92722066, 59.50363949, 104.30764284,
175. ])
Почему это? любые рандомизированные шаги в модели? [1]: https://i.stack.imgur.com/Iut9x.png
Похоже, что метод, используемый для подбора, является стохастическим. Из исходного кода pwlf fit вызывает функцию scipy.optimize.differential_evolution
. Документация Scipy для этой функции описывает ее как стохастический метод для определения глобального минимума функции.
Похоже, что с настройками по умолчанию, используемыми pwlf, он не совсем сходится или, по крайней мере, приближается к сходимости каждый раз с разных сторон. Возможно, вы сможете отредактировать ключевые слова, чтобы оптимизация выполняла более строгий поиск истинного минимума. Например, atol
устанавливает абсолютный допуск для сходимости. Вы также устанавливаете seed
постоянное значение, чтобы, по крайней мере, каждый раз получать один и тот же результат, даже если он, возможно, не нашел «истинный» минимум. Просто имейте в виду, что если вы измените одно из ключевых слов, вам нужно явно выписать все остальные, так как **kwargs
, переданное в fit
, по-видимому, перезаписывает значения по умолчанию, которые будут переданы в differential_evolution
.
Спасибо за понятное объяснение, буду пробовать разные варианты