Ограниченная линейная регрессия в Python

У меня есть классическая линейная проблема регрессии формы:

y = X b

где y - вектор отклика X - это матрица входных переменных, а b - это вектор подходящих параметров, которые я ищу.

Python предоставляет b = numpy.linalg.lstsq( X , y ) для решения задач этой формы.

Однако, когда я использую это, я имею тенденцию получать либо чрезвычайно большие, либо очень маленькие значения для компонентов b.

Я хотел бы выполнить то же самое, но ограничить значения b между 0 и 255.

Похоже, что scipy.optimize.fmin_slsqp() - это вариант, но я нашел его чрезвычайно медленным для размера интересующей меня проблемы (X - это что-то вроде 3375 by 1500 и, надеюсь, еще больше).

  • Существуют ли какие-либо другие параметры Python для выполнения ограниченных минимальных квадраты подходят?
  • Или существуют ли подпрограммы python для выполнения Lasso Регрессия или регрессия Риджа или какой-либо другой метод регрессии который наказывает большие значения коэффициента b?

Ответы

Ответ 2

Вы упомянули, что вы найдете регрессию Лассо или регрессию Ридж. Эти и многие другие ограниченные линейные модели доступны в пакете scikit-learn. Ознакомьтесь с разделом об обобщенных линейных моделях.

Обычно ограничение коэффициентов связано с каким-то параметром регуляризации (C или альфа) --- некоторые из моделей (те, которые заканчиваются на CV) могут использовать кросс-проверку для автоматического задания этих параметров. Вы также можете ограничить модели использованием только положительных коэффициентов - например, для модели Lasso существует опция.

Ответ 3

scipy-optimize-leastsq-with-bound-constraints на SO дает lesssq_bounds, который scipy lesssq + связанные ограничения, такие как 0 <= x_i <= 255.
(Scipy lesssq обертывает MINPACK, одну из нескольких реализаций широко используемых алгоритм Левенберга-Маркварда a.k.a. демпфированные наименьшие квадраты.
Существуют различные способы реализации границ; lesssq_bounds - это самый простой.)

Ответ 4

Как говорит @conradlee, вы можете найти реализации регрессии Лассо и Риджа в пакете scikit-learn. Эти регрессоры служат вашей цели, если вы просто хотите, чтобы ваши параметры подгонки были маленькими или положительными.

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