Python中的受限线性回归

23
我有一个经典线性回归问题,形式如下:
y = X b
其中,y是一个响应向量,X是一个输入变量的矩阵,b是我要寻找的拟合参数向量。
Python提供了numpy.linalg.lstsq( X , y )来解决这种形式的问题。
然而,当我使用它时,往往会得到极大或极小的 b 组件值。
我想执行相同的拟合,但将b的值限制在0到255之间。
看起来scipy.optimize.fmin_slsqp()是一个选择,但对于我感兴趣的问题规模(X大约为3375×1500,甚至更大),我发现它非常慢。
  1. 有没有其他Python选项可以执行受限最小二乘拟合?
  2. 或者有没有用于执行Lasso回归、岭回归或其他对大的b系数值进行惩罚的回归方法的Python程序?

5个回答

10

很好,表面上看起来正是我需要的。能够为“X”输入变量矩阵行提供权重对我也可能非常有用(我确实知道各种数据点的可靠性,这可能让我受益)。我一定会试一试,谢谢! - ulmangt
它并没有经过很好的测试,但希望它能对你有用。代码是纯Python编写的,应该很容易进行测试。 - tillsten
1
scipy.optimize.nnls也是一个不错的提示。仅限制为非负值可能就足够了。numpy.linalg.lstsq的解似乎会通过同等巨大的负b值来平衡巨大正数的b值。 - ulmangt

10

您提到Lasso回归或Ridge回归是可以接受的。这些以及许多其他受限制的线性模型都包含在scikit-learn软件包中。请查看广义线性模型部分

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


4

2
正如 @conradlee 所说,您可以在 scikit-learn 包中找到 Lasso 和 Ridge 回归的实现。如果您只想让拟合参数小或为正,则这些回归器可以满足您的目的。
然而,如果您想将任何其他范围作为拟合参数的边界,则可以使用相同的包构建自己的受限制回归器。请参见 David Dale 对 this question 的答案以获取示例。

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中还有其他受限制的优化方法,如Is there a high quality nonlinear programming solver for Python?所讨论的那样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接