mol*_*oli 6 python lasso-regression cvxpy
Fused Lasso (Tibshirani 等人,2005)鼓励系数的稀疏性及其差异的稀疏性。
这是损失函数和正则化的公式:
第一项是 L2 (mse) 损失,第二项是对系数的 L1 惩罚(Lasso 正则化),最后一项是链接文章中引入的新项。
我如何用cvxpy包来模仿这个 - 具体来说,我如何实现最后一项?
分别有Lasso和Ridge 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)
我们为它们创建了一个损失函数,但它们是使用不同的命令创建的?
据我了解,您在表达对因数差异的惩罚时遇到困难\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)
| 归档时间: |
|
| 查看次数: |
1306 次 |
| 最近记录: |