如果我没有使用正确的数学术语,我很抱歉,但我希望你能理解我想要完成的任务。
我的问题: 我对两个向量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正相关)。这可能使用最小二乘法吗?我也对其他线性回归算法持开放态度。
答案 0 :(得分:1)
让我试着改写一下来澄清一下。根据您的模型,z始终与x和y正相关。但是,有时当你解决系数的线性回归时,这会给你一个负值。
如果你对数据是正确的,那么只有当正确的系数很小时才会发生这种情况,并且噪声恰好是负数。你可以把它分配给零,但是这些方法不能正确匹配。
在这种情况下,正确的解决方案如jpalacek所述,但在此处详细解释:
这可以给你你想要的东西。
答案 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%)。