在python中使用cvxpy包构建融合套索惩罚

mol*_*oli 6 python lasso-regression cvxpy

Fused Lasso (Tibshirani 等人,2005)鼓励系数的稀疏性及其差异的稀疏性。

这是损失函数和正则化的公式:【公式截图】(https://cdn1.imggmi.com/uploads/2019/11/17/967043f94a1382c5e14fdd1eb25bad9e-full.png)
第一项是 L2 (mse) 损失,第二项是对系数的 L1 惩罚(Lasso 正则化),最后一项是链接文章中引入的新项。

我如何用cvxpy包来模仿这个 - 具体来说,我如何实现最后一项?

分别有LassoRidge Penalties 的示例代码。我大致了解这些代码是如何工作的,但有一些功能我不知道我应该如何决定使用哪一个。例如,让我们比较 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

Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)

我们为它们创建了一个损失函数,但它们是使用不同的命令创建的?

geo*_*n91 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)
Run Code Online (Sandbox Code Playgroud)