繁体   English   中英

Python 中的约束线性回归

[英]Constrained Linear Regression in 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 15003375 by 1500 ,希望更大)。

  1. 是否有其他 Python 选项可用于执行约束最小二乘拟合?
  2. 或者是否有用于执行套索回归或岭回归或其他一些惩罚大b数值的回归方法的 Python 例程?

你提到你会发现套索回归或岭回归是可以接受的。 这些和许多其他约束线性模型在scikit-learn包中可用。 查看广义线性模型部分

通常约束系数涉及某种正则化参数(C 或 alpha)——一些模型(以 CV 结尾的模型)可以使用交叉验证来自动设置这些参数。 您还可以进一步限制模型仅使用正系数——例如,在套索模型上有一个选项。

SO 上的 scipy-optimize-leastsq-with-bound-constraints给出了 leastsq_bounds,这是scipy leastsq + bound 约束,例如 0 <= x_i <= 255。
(Scipy leastsq 包装了 MINPACK,这是广泛使用的Levenberg-Marquardt 算法又名阻尼最小二乘法的几种实现之一。
有多种实现边界的方法; leastsq_bounds 是我认为最简单的。)

正如@conradlee 所说,您可以在scikit-learn包中找到套索和岭回归实现。 如果您只想让拟合参数变小或为正,这些回归量就可以满足您的目的。

但是,如果您想将任何其他范围作为拟合参数的界限,您可以使用相同的包构建自己的约束回归量。 有关示例,请参阅 David Dale 对此问题的回答。

我最近准备了一些关于 Python 中线性回归的教程 这是包括对系数的约束的选项之一 (Gekko)。

# Constrained Multiple Linear Regression
import numpy as np
nd = 100 # number of data sets
nc = 5   # number of inputs
x = np.random.rand(nd,nc)
y = np.random.rand(nd)

from gekko import GEKKO
m = GEKKO(remote=False); m.options.IMODE=2
c  = m.Array(m.FV,nc+1)
for ci in c:
    ci.STATUS=1
    ci.LOWER = -10
    ci.UPPER =  10
xd = m.Array(m.Param,nc)
for i in range(nc):
    xd[i].value = x[:,i]
yd = m.Param(y); yp = m.Var()
s =  m.sum([c[i]*xd[i] for i in range(nc)])
m.Equation(yp==s+c[-1])
m.Minimize((yd-yp)**2)
m.solve(disp=True)
a = [c[i].value[0] for i in range(nc+1)]
print('Solve time: ' + str(m.options.SOLVETIME))
print('Coefficients: ' + str(a))

它使用非线性求解器IPOPT来解决比scipy.optimize.minimize求解器更好的问题。 Python 中还有其他约束优化方法,并在是否有适用于 Python 的高质量非线性编程求解器中讨论过 .

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM