融合套索(Tibshirani et al, 2005)鼓励系数的稀疏性以及它们之间差异的稀疏性。
这是损失函数和正则化的公式:
第一项是L2(mse)损失,第二项是系数的L1罚分(套索正则化),最后一项是链接文章中引入的新项。
如何使用cvxpy
软件包来模仿它-具体来说,如何实现上一个学期?
分别有Lasso和Ridge惩罚的示例代码。我对代码的工作原理有一个大致的了解,但是有一些功能我不知道应该如何决定使用哪个代码。 例如,让我们比较套索和里奇罚码。
# Lasso
import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt
def loss_fn(X, Y, beta):
return cp.norm2(cp.matmul(X, beta) - Y)**2
def regularizer(beta):
return cp.norm1(beta)
def objective_fn(X, Y, beta, lambd):
return loss_fn(X, Y, beta) + lambd * regularizer(beta)
def mse(X, Y, beta):
return (1.0 / X.shape[0]) * loss_fn(X, Y, beta).value
# Ridge
import cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt
def loss_fn(X, Y, beta):
return cp.pnorm(cp.matmul(X, beta) - Y, p=2)**2
def regularizer(beta):
return cp.pnorm(beta, p=2)**2
def objective_fn(X, Y, beta, lambd):
return loss_fn(X, Y, beta) + lambd * regularizer(beta)
def mse(X, Y, beta):
return (1.0 / X.shape[0]) * loss_fn(X, Y, beta).value
我们为它们两者创建了损失函数,但是它们是用不同的命令创建的吗?
答案 0 :(得分:0)
据我了解,您很难表达系数\sum_k|b_k - b_{k-1}|
的差异所带来的损失。
为此,您只需要定义矢量差矩阵。然后,您可以用它打beta
,为您提供差异的载体。从那里,您可以使用标准的L1规范原子cvx.norm1
。
def diff_op(shape):
mat = np.zeros(shape)
mat[range(2, shape[0]), range(1, shape[1])] = 1
mat -= np.eye(shape)
return mat
def difference_pen(beta, epsilon):
return cvx.norm1(diff_op(beta.shape) @ beta)