我有以下形式的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
,希望更大)
b
个系数值进行惩罚?答案 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的回答。