LASSO是Least Absolute ShrinkageandSelection Operator的首字母缩写。随着Lasso的引入,回归模型的可预测性和可解释性得到了加强。因此,对数学的透彻理解将有助于ML的应用。使用ADMM,我们可以研究这个解决方案。
目录
- 简介
- 机器学习的背景
- 使用ADMM解决LASSO问题
- 实施
简介
LASSO通常与它从数据中选择一组较小的已知协变量来用于模型有关。用其他更熟悉的话来说,它可以被称为特征选择器。
一般来说,特征选择器是用来从所有原始观测数据中选择最相对相关的信息提供特征。
仔细回顾前面的陈述,我们可以看到,必须有一些逻辑来决定哪些特征被认为是更重要或更不重要的。最简单的方法是通过手动计算和比较数据的每个特征与结果的相关值。在进一步行动之前,我们可以研究一下。
对特征选择器的需求
数字化时代已经并正在产生大量的数据,为了跟上数据量并将其妥善利用,我们采用了ML技术。用不相关的特征/输入给我们建立的模型,自然会导致它产生相应的输出。一个定义良好的模型是只使用尽可能多的所需特征来提供准确的预测,
它
的优点
是。
- 非相关的特征不需要在训练模型时测量或考虑。
- 减少了数据杂波对模型性能的影响的可能性。
为了克服这个问题并更好地利用我们建立的模型,我们采取了特征选择器的帮助来简化我们的任务。
当数据量扩大时,手动分类并使用传统的方式来决定适合模型的特征就变得很繁琐/几乎不可能。LASSO为这个问题提供了一个自动化的解决方案。
机器学习的背景
现在让我们在ML术语中建立同样的内容。从机器学习的角度制定LASSO问题的灵感来自于以下几点:
考虑一个机器学习模型有'm'个特征和'n'个数据点,传统上我们将这些术语定义为。

这个模型利用每个数据点产生预测的函数说。

有助于改善模型预测的成本函数J(β)被定义为。

这里的目标是。

我们现在可以相应地修改目标函数以纳入决策项。我们首先考虑一个L0-Norm。

这里∥J(β) ∥0是一个描述非零项数量的项,τ是定义
对重要字符
的考虑强度的项
,换句话说,当τ的值增加时,那么解β的稀疏性就会增加。

上式中的目标函数f(n)是难以解决的,也就是说,不存在有效的算法来解决它。将
∥J(β)∥0
替换
为等效的L1规范∥J(β)∥1,我们得到。

同样地,这里的目标是。

相当于。

上述方程是基本形式,作为LASSO问题的起点。
使用ADMM解决LASSO问题
使用更常规的变量分配来解决一般的LASSO问题,我们可以将其定义为。

用ADMM格式表示相同的问题。


ADMM解决方案。
相应的Augmented Lagrangian形式可以写成。

为了找到x的更新,
假设z^k和y^k是已知的
,那么关于x的拉格朗日的最小化是这样做的。

考虑到与x有关的项。

展开L2规范项。

将关于x的一阶偏微分项等价为0(0向量),并简化得到x^(k+1)

最后,得到x的更新为。

同样,为了找到z的更新,对拉格朗日的最小化是这样做的:x^(k+1)已经被计算出来,y^k被假定为已知。

考虑依赖于z的项。

将y^Tz项推入L2准则并除以τ

将非z项分组。

使ρ成为一个共同的分母常数。

近似算子。考虑将变量v上的近似算子与某个常数α定义为。

在比较上述方程时,右手边的相似性导致我们将得到的z^(k+1)简化为更紧凑的形式,如。

x^(k+1)和z^(k+1)都已经计算出来了,利用它们,y的更新可以写成。

用u^k代替(1/ρ)y^k并把它放在一起,每个变量的更新就是。

实施
在Matlab中对综合数据的更新步骤进行简单而直观的代码实现,可以按照基本步骤进行。
- 创建一个玩具数据集(可能是像下面这样的线性数据集),我们的目的是验证更新是否按计划进行。
- 决定一个目标变量(在下面的实现中,它将是变量x0),并向系统添加噪声,这是为了模仿一个更真实的观察。
- 随机初始化所需的变量/为零。
- 对更新方程进行编码,并在其中循环足够多的次数/直到收敛。
- 输出由更新得到的最终值,如果做得正确,我们应该观察到一个相对接近的curated值和由系统定义的更新得到的预测值。
randn('seed', 0);
rand('seed',0);
m = 1500; % number of examples
n = 5000; % number of features
rho = 100/n; % sparsity density
% synthesizing required conditions
x0 = sprandn(n,1,rho);
A = randn(m,n);
A = A*spdiags(1./sqrt(sum(A.^2))',0,n,n); % normalize columns
b = A*x0 + sqrt(0.001)*randn(m,1); % adding deviations
lambda_max = norm( A'*b, 'inf' );
lambda = 0.1*lambda_max;
% maximum iterations set instead of convergence
MAX_ITER = 1000;
[m, n] = size(A);
% save a matrix-vector multiply
P = inv(A'*A+rho*eye(n))
x = zeros(n,1);
z = zeros(n,1);
u = zeros(n,1);
for k = 1:MAX_ITER
tmp = A'*b + rho*(z - u); % temporary value
% x-update
x = P*tmp;
% z-update
z = shrinkage(x + u, lambda/rho);
% u-update
u = u + (x - z);
end
h = {'x0' 'x'};
v = [x0, x];
R = [h;num2cell(v)]
oh = {'z' 'u'};
ov = [z, u];
oR = [oh;num2cell(ov)]
Matlab对辅助功能缩减的定义是。
function z = shrinkage(x, kappa)
z = pos(1 - kappa./abs(x)).*x;
end
输出
得到以下输出。
这里。
- x0代表我们期望通过更新在x中实现的综合数据
- 而z和u是相应的更新支持性变量值
