使用python

时间:2019-11-17 19:39:48

标签: python cvxpy lasso-regression

融合套索(Tibshirani et al, 2005)鼓励系数的稀疏性以及它们之间差异的稀疏性。

这是损失函数和正则化的公式:[Screenshot of the formula](https://cdn1.imggmi.com/uploads/2019/11/17/967043f94a1382c5e14fdd1eb25bad9e-full.png)
第一项是L2(mse)损失,第二项是系数的L1罚分(套索正则化),最后一项是链接文章中引入的新项。

如何使用cvxpy软件包来模仿它-具体来说,如何实现上一个学期?

分别有LassoRidge惩罚的示例代码。我对代码的工作原理有一个大致的了解,但是有一些功能我不知道应该如何决定使用哪个代码。 例如,让我们比较套索和里奇罚码。

# 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

我们为它们两者创建了损失函数,但是它们是用不同的命令创建的吗?

1 个答案:

答案 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)