1

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

我的问题:我对来自两个向量 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

(我应该是下标的)

尽管我希望 a1 和 a2 这两个参数始终为正值,但即使向量 z 为负数(这意味着 a0 当然是负数),这也可以正常工作,因为这是真实模型的样子(z 总是与 x 和 z 正相关)。这可以使用最小二乘法吗?我也对其他线性回归算法持开放态度。

4

2 回答 2

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。

这应该给你你想要的。

于 2009-02-20T12:40:03.770 回答
1

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

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

A = [一个(长度(x),1),x,y];

磅 = [-inf, 0, 0];

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

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

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

A = [一个(长度(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);

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

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

调用 lsqnonneg 最多花费您两次,而第二次调用仅占时间的一小部分(缺少有关您的问题的任何信息,几率是第二次调用的 50%)。

于 2009-03-31T16:28:16.737 回答