代码之家  ›  专栏  ›  技术社区  ›  dinesh12

L1正则化最小二乘

  •  2
  • dinesh12  · 技术社区  · 7 年前

    α'* = arg min (||y’–B’α’||_2^2 + λ||α’||_1)
    

    在这里 α'* 是一个向量。尺寸 B’=(m+p)*p y’=(m+p)*1 , α‘=p*1

    我无法求解这个方程。请任何人解释一下 eqn 以及求解该等式的方法 L1 正则化最小二乘法。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Jonas Adler    7 年前

    这是一个典型的问题,可以用 ODL :

    import odl
    import numpy as np
    
    m = 2
    p = 100
    lam = 0.00001
    
    # Define B
    B = odl.MatrixOperator(np.random.rand(p, m + p))
    alpha_true = np.random.rand(m + p)
    y = B(alpha_true)
    
    # Define functionals
    l2dist = odl.solvers.L2NormSquared(B.range) * (B - y)
    l1 = lam * odl.solvers.L1Norm(B.domain)
    func = l2dist + l1
    
    # Initial point
    alpha = B.domain.zero()
    
    # Solve using steepest descent
    odl.solvers.steepest_descent(func, alpha,
                                 line_search=0.0003, maxiter=10000,
                                 callback=lambda x: print(func(x)))
    

    如果你想要一个更快的解决方案,你应该研究最近的方法(也可以在ODL中找到)。FISTA方法就是这样一个例子:

    import odl
    import numpy as np
    
    m = 2
    p = 100
    lam = 0.00001
    
    # Define B
    B = odl.MatrixOperator(np.random.rand(p, m + p))
    alpha_true = np.random.rand(m + p)
    y = B(alpha_true)
    
    # Define functionals
    l2dist = odl.solvers.L2NormSquared(B.range) * (B - y)
    l1 = lam * odl.solvers.L1Norm(B.domain)
    func = l2dist + l1
    
    # Use FISTA
    alpha = B.domain.zero()
    odl.solvers.accelerated_proximal_gradient(alpha, l1, l2dist,
                                              gamma=0.0001, niter=1000,
                                              callback=lambda x: print(func(x)))