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