Python中的约束线性回归

Python中的约束线性回归,python,numpy,scipy,mathematical-optimization,linear-regression,Python,Numpy,Scipy,Mathematical Optimization,Linear Regression,我有一个回归问题的形式: y=xb 其中,y是响应向量,X是输入变量矩阵,b是我正在搜索的拟合参数向量 Python提供了b=numpy.linalg.lstsq(X,y)来解决这种形式的问题 然而,当我使用这个时,我倾向于为b的组件获取非常大或非常小的值 我希望执行相同的拟合,但将b的值限制在0和255之间 它看起来像是scipy.optimize.fmin_slsqp()是一个选项,但我发现对于我感兴趣的问题的大小来说它非常慢(X类似于3375乘1500,希望更大) 是否有其他Python选

我有一个回归问题的形式:

y=xb

其中,
y
是响应向量,
X
是输入变量矩阵,
b
是我正在搜索的拟合参数向量

Python提供了
b=numpy.linalg.lstsq(X,y)
来解决这种形式的问题

然而,当我使用这个时,我倾向于为
b
的组件获取非常大或非常小的值

我希望执行相同的拟合,但将
b
的值限制在0和255之间

它看起来像是
scipy.optimize.fmin_slsqp()
是一个选项,但我发现对于我感兴趣的问题的大小来说它非常慢(
X
类似于
3375乘1500
,希望更大)

  • 是否有其他Python选项可用于执行受约束的最短路径 正方形适合吗
  • 或者是否有python例程用于执行岭回归或其他回归方法 哪个会惩罚大的
    b
    系数值

  • 最近的scipy版本包括一个解算器:

    on SO给出了leastsq_界,即
    +你提到的约束条件,如0你会发现套索回归或岭回归是可以接受的。包中提供了这些和许多其他约束线性模型。看看这本书


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

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

    但是,如果要将任何其他范围作为拟合参数的边界,可以使用相同的包构建自己的约束回归器。例如,请参见David Dale对的回答。

    我最近准备了一些。下面是一个选项(Gekko),其中包括对系数的约束

    约束多元线性回归 将numpy作为np导入 nd=100#数据集数量 nc=5#输入数量 x=np.random.rand(nd,nc) y=np.random.rand(nd) 从gekko进口gekko m=GEKKO(远程=假);m、 选项。IMODE=2 c=m.Array(m.FV,nc+1) 对于c中的ci: ci.状态=1 ci.LOWER=-10 ci.UPPER=10 xd=m.Array(m.Param,nc) 对于范围内的i(nc): xd[i].value=x[:,i] yd=m.Param(y);yp=m.Var() s=m.sum([c[i]*xd[i]表示范围内的i(nc)]) m、 方程(yp==s+c[-1]) m、 最小化((yd yp)**2) m、 求解(disp=True) a=[c[i]。范围(nc+1)内i的值[0] 打印('求解时间:'+str(m.options.SOLVETIME)) 打印('系数:'+str(a))
    它使用非线性解算器
    IPOPT
    来解决比
    scipy.optimize.minimize
    解算器更好的问题。Python中还有其他约束优化方法,正如中所讨论的。

    Nice,表面上这听起来正是我所需要的。能够为
    X
    输入变量矩阵行提供权重实际上对我也非常有用(我确实对各种数据点的可靠性有一种感觉,这可以让我充分利用)。我一定会试试的,谢谢!这是不是真的很好通过测试,希望它会为你工作。代码是纯python的,应该易于测试。scipy.opimize.nnls也是一个很好的技巧。仅仅限制非负值可能就足够了
    numpy.linalg.lstsq
    解决方案似乎在平衡巨大的正
    b
    值和同样巨大的负
    b
    值。sklearn套索: