我可以强制三向线性回归中的两个成分是正面的吗?

时间:2009-02-20 09:09:17

标签: math matlab linear-regression

如果我没有使用正确的数学术语,我很抱歉,但我希望你能理解我想要完成的任务。

我的问题: 我对两个向量x和y的值使用线性回归(当前最小二乘法)对结果z。这是在matlab中完成的,我正在使用\ -operator来执行回归。我的数据集将包含几千个观测值(最多约50000个)。

x值将在10-300(大多数在60到100之间)的区域中,而y值在1-3区域中。

我的代码如下所示:

X = [ones(size(x,1) x y];
parameters = X\y;

输出“参数”是这个公式中使用的三个因子a0,a1和a2:

a0 * 1 + a1 * xi + a2 * yi = zi

(i应该是下标的)

这就像预期的那样工作,虽然我希望两个参数a1和a2总是正值,即使矢量z是负数(这意味着a0将是负数,当然),因为这是真实的模型看起来像(z总是与x和z正相关)。这可能使用最小二乘法吗?我也对其他线性回归算法持开放态度。

2 个答案:

答案 0 :(得分:1)

让我试着改写一下来澄清一下。根据您的模型,z始终与x和y正相关。但是,有时当你解决系数的线性回归时,这会给你一个负值。

如果你对数据是正确的,那么只有当正确的系数很小时才会发生这种情况,并且噪声恰好是负数。你可以把它分配给零,但是这些方法不能正确匹配。

在这种情况下,正确的解决方案如jpalacek所述,但在此处详细解释:

  1. 尝试对x和y进行回归。如果两者都是积极的结果。
  2. 如果a1为负数,则假设它应为零。对y回归z。如果a2为正,那么将a1作为0,将a0和a2作为回归。
  3. 如果a2为负数,则假设它也应为零。将z反对1,并将其作为a0。设a1和a2为0。
  4. 这可以给你你想要的东西。

答案 1 :(得分:1)

简单的解决方案是使用旨在解决它的工具。也就是说,使用来自优化工具箱的lsqlin。为三个参数中的两个设置下限约束。

因此,假设x,y和z都是COLUMN向量,

A = [ones(length(x),1),x,y];

lb = [-inf,0,0];

a = lsqlin(A,z,[],[],[],[],lb);

这将仅约束第二个和第三个未知参数。

如果没有优化工具箱,请使用lsqnonneg,它是matlab本身的一部分。解决方案也很容易。

A = [ones(length(x),1),x,y];

a = lsqnonneg(A,z);

您的模型将

z = a(1)+ a(2)* x + a(3)* y

如果a(1)基本上为零,即它在零容差范围内,则假设第一个参数受零点约束。在这种情况下,通过更改A中列的符号来解决第二个问题。

A(:,1)= -1;

a = lsqnonneg(A,z);

如果此解决方案的(1)显着非零,则第二个解决方案必须优于第一个解决方案。您的模型现在将

z = -a(1)+ a(2)* x + a(3)* y

最多两次拨打lsqnonneg的费用,第二次拨打的时间只有一小部分(缺少关于你的问题的信息,可能性是第二次通话的50%)。