Python中的约束线性回归

时间:2012-04-14 15:46:11

标签: python numpy scipy mathematical-optimization linear-regression

我有以下形式的classic linear回归问题:

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,希望更大)

  1. 是否还有其他Python选项可用于执行受限制的最小值 方块适合?
  2. 或者是否存在用于执行Lasso Regression或Ridge回归或其他一些回归方法的python例程 哪个会对大b个系数值进行惩罚?

5 个答案:

答案 0 :(得分:9)

你提到你会发现Lasso Regression或Ridge Regression可以接受。 scikit-learn包中提供了这些和许多其他约束线性模型。查看section on generalized linear models

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

答案 1 :(得分:8)

看看: http://scipy-central.org/item/17/3/pymls-solving-bounded-linear-least-squares-problems

Openopt还绑定了bvls,这是另一个有界线性lsq解算器。

编辑: 如果scipy.optimize.nnls足够,您也可以尝试。

答案 2 :(得分:3)

scipy-optimize-leastsq-with-bound-constraints 在SO上给出了最小的q_bounds,即scipy leastsq +约束约束,例如0< = x_i< = 255 (Scipy leastsq包含了MINPACK,这是广泛使用的几种实现之一 Levenberg–Marquardt algorithm a.k.a. damped least-squares。
有各种方法来实现边界; leastsq_bounds是我认为最简单的。)

答案 3 :(得分:2)

我最近准备了一些tutorials on Linear Regression in 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中还有其他受约束的优化方法,以及在Is there a high quality nonlinear programming solver for Python?中进行了讨论。

答案 4 :(得分:1)

正如@conradlee所说,您可以在scikit-learn包中找到Lasso和Ridge回归实现。如果您只希望拟合参数较小或为正数,则这些回归器可以满足您的目的。

但是,如果您想将其他任何范围强加给fit参数的界限,则可以使用相同的包构建自己的受限Regressor。有关示例,请参见David Dale对this question的回答。