gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:17:13 32 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

据我了解,您在表达系数差异的惩罚时遇到困难 \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)

关于python - 在python中使用cvxpy包构建融合套索惩罚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58904447/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com