Numpy 约束线性回归简介
阅读更多:Numpy 教程
什么是线性回归?
线性回归是一种用于数据分析的标准统计学方法,它建立了一个基于线性关系的模型,用于预测自变量和因变量之间的关系。线性回归通常用于建立模型,可以通过最小二乘法的方法来拟合数据,找到最佳拟合线,建立线性模型。
线性回归中的约束
约束线性回归是指在普通线性回归的基础上,添加了约束条件,以满足实际应用的需要。在某些情况下,线性回归可能受到以下限制:
- 系数必须为非负值
- 算法要求线性回归的系数和必须等于1
- 可能需要保持线性回归的系数在一个固定的范围内
这些条件可实现在线性回归中,用于保证模型结果的 可解释性和 可控性。
为什么要使用约束线性回归?
约束线性回归的一个重要作用是避免问题过拟合。我们必须牢记,数据的一致性是模型可靠性的前提,所以在训练模型时,必须限制模型的泛化能力。过拟合是指模型对训练数据过于敏感,并且无法很好地推广到新的数据集。
将自然约束条件添加到模型中可以有助于控制变量并避免无意义的结果。例如,在某些情况下,我们可能需要通过在回归系数上添加非负性约束来保证它们的实际可解释性。这可以理解为约束,因为我们将必须确定能够从模型中摘取有用信息的那些变量。
用numpy进行约束线性回归
numpy提供了一个很好的解决方案实现约束线性回归。像OV-1约束的技术前提下,numpy的普通最小二乘法函数可以被扩展为一个有约束的优化问题,为此我们需要使用numpy中的线性规划函数。
在此之前,我们需要先构造一个约束矩阵和约束条件,这可以通过numpy的封装来实现,常用的方法是构建标准形式的约束矩阵。
import numpy as np
from scipy.optimize import linprog
def constrained_linear_regression(X, y, constraints):
#获取变量数目
n_coef = X.shape[1]
#标准线性回归系数
lin_reg_res = np.linalg.lstsq(X, y, rcond=None)
#构造函数参数
c_ = np.row_stack(([0] * n_coef, [1] * n_coef))
b_ = np.array([0, 1])
res_ = lin_reg_res[0]
#构造标准线性回归的约束矩阵
A_ = np.zeros((0, n_coef))
b = np.zeros((0, 1))
for cons in constraints:
if isinstance(cons[1], int):
Aidx = [cons[1]]
Aval = [1]
else:
Aidx = cons[1]
Aval = [1]*len(Aidx)
row_ = np.zeros((1, n_coef))
row_[0, Aidx] = np.array(Aval)
A_ = np.row_stack((A_, row_))
b_ = np.row_stack((b_, [cons[2]]))
#调用Scipy中的LP求解器,求解约束线性回归结果
res = linprog(c=c_, A_ub=A_, b_ub=b_, bounds=[(None, None)] * n_coef)
#返回约束线性回归结果
return res.x
接下来,我们将讨论三种不同的回归约束模式
非负约束模式
在许多情况下,最小二乘解可能为负值,而回归系数相应的物理意义可能不太明显,因此有时我们需要将系数限制在非负值范围内。通过添加约束,我们可以简单地将模型的各种线性回归系数的范围限制为非负值。
#构造约束
constraints = [(0, i, None) for i in range(n_coef)]
#调用约束线性回归函数
res = constrained_linear_regression(X, y, constraints)
方案系数之和约束模式
在某些情况下,对线性回归系数的总和应用约束是有用的。例如,当我们需要确保带权重的平均损失是1时,这种约束是非常有用的。
#构造约束
constraints = [(1, list(range(n_coef)), 1)]
#调用约束线性回归函数
res = constrained_linear_regression(X, y, constraints)
固定值范围约束模式
在某些情况下,系数可能需要保持在一个固定的范围内。例如,当我们在收集回归数据时,可能会出现不可避免的误差;在这种情况下,我们可以将回归系数范围分配到每个变量上,并酌情处理错误。
#构造约束
constraints = [(None, [0], 2), (None, [1], 2)]
#调用约束线性回归函数
res = constrained_linear_regression(X, y, constraints)
总结
约束线性回归可以在标准线性回归模型的基础上添加约束,以满足实际应用的需要。使用Numpy进行约束线性回归较为便捷,可以通过构造约束矩阵和约束条件的方式实现。在构造约束时,约束矩阵可以通过标准线性回归的方式构造出来。约束线性回归适用于不同的应用场景,在有需要的时候可应用于实际生产过程中。
极客教程