0

我想用非线性函数的总和来近似一个常数函数。我可以用普通的最小二乘来做到这一点,但是用套索会出错,可能是因为要逼近的函数是常数。我在下面的 Matlab 中给出了一个玩具示例:

t = -1:0.01:1; %horizontal axis
x = [exp(-(t+0.5).^2); exp(-t.^2); exp(-(t-0.5).^2);]'; %I use radial basis functions in this example
y = 0.7 * ones(201,1); %Approximate a constant function by a weighted sum of radial basis functions

w = y'/x'; %ordinary least squares works fine
plot(t,w*x'); hold on; plot(t,y,'--k'); axis([-1,1,0,1]); %show results

b = lasso(x,y); %lasso does not work, this gives only zeros
w = b(:,1); %zero weights
plot(t,w*x'); hold on; plot(t,y,'--k'); axis([-1,1,0,1]); %show results

我注意到套索首先从输入和输出中减去平均值,所以这将给出零输出,因此所有零权重都是由套索产生的。有什么办法可以规避这种情况吗?或者另一种方法来获得权重的稀疏结果?

4

1 回答 1

0

如果我没记错的话,LASSO 会尝试删除那些没有关于输出信息的预测变量(输入变量)。

在您的示例中,没有时间相关变量的线性组合会给出(拟合)始终相同的值(恒定输出),因此 LASSO 确定您的输入(及其组合)都没有关于输出的信息;它们不相关。

LASSO 是弹性网的一种特殊情况。'Alpha' 参数默认为 1.0,'Alpha' 越高,选择的预测变量越少。作为您的两个预测变量:x(:,1) 和 x(:,3) 高度相关 (r=0.77),例如,您尝试将“Alpha”参数设置为 0.5;即使 'Alpha 值非常低,输出也始终为 0。所有预测变量都被排除以实现恒定输出,即,要始终实现相同的输出,您不需要任何输入变量。

我希望不会错。

PS:普通最小二乘是用反斜杠('\')计算的。见: http: //www.mathworks.es/es/help/matlab/ref/lscov.html

最好的!

于 2014-10-08T17:07:44.077 回答