20

我有一个经典的线性回归问题,形式如下:

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. 或者是否有用于执行套索回归或岭回归或其他一些惩罚大b系数值的回归方法的 python 例程?
4

5 回答 5

10

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

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.lsq_linear.html#scipy.optimize.lsq_linear

于 2012-04-14T15:53:34.163 回答
10

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

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

于 2012-05-30T10:55:41.467 回答
4

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

于 2012-04-15T11:21:09.943 回答
1

我最近准备了一些关于 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 的高质量非线性规划求解器中的讨论?.

于 2020-09-04T00:41:40.223 回答
1

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

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

于 2019-08-20T02:19:32.173 回答