[英]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 1500
是3375 by 1500
,希望更大)。
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.