【问题标题】:LASSO regression implementation without python libraries没有 python 库的 LASSO 回归实现
【发布时间】:2019-01-28 22:21:34
【问题描述】:

我是一个 python 新手,正在认真寻找一个不使用 python 库(例如 sklearn 等)的 LASSO 的 python 实现

我对此特别感兴趣,以帮助我了解底层数学如何转换为 Python 代码。为此,我更喜欢 LASSO 的裸 python 实现,没有使用任何示例数据集的 python 库。

谢谢!!!

【问题讨论】:

  • 内置数据类型不太适合该任务。因此,任何实现都可能至少使用 numpy,因为没有理由避免它。
  • @LukasNeugebaue,是的,numpy,pandas 等都可以。它们确实是处理数据类型等所必需的,但不是像 sklearn 这样已经编写了套索函数的东西。我真正想看到的是,套索的数学如何在不使用已经为套索编写的库的情况下被翻译成可行的 Python 代码。
  • 那我就不明白了。 LASSO 以某种方式用 python IN sklearn 编写。您可以查看 sklearn 中的源代码以了解其实现方式。不过这会有点工作,因为 LASSO 继承自 ElasticNet,而 ElasticNet 继承自 LinearModel。
  • @LukasNeugebauer 不建议这样做,该实现是在 Cython 中实现的,对于新手来说很难理解(处理预先计算 gram 矩阵的情况等)。

标签: python machine-learning data-science lasso-regression regularized


【解决方案1】:

首先,您的问题是不恰当的,因为存在许多算法来解决 Lasso。 现在最流行的是坐标下降。这是算法的骨架(没有停止标准)。我使用了 numba/jit,因为 for 循环在 python 中可能很慢。

import numpy as np

from numba import njit

@njit
def ST(x, u):
    "Soft thresholding of x at level u"""
    return np.sign(x) * np.maximum(np.abs(x) - u, 0.)



@njit
def cd_solver(X, y, alpha, max_iter):
    n_samples, n_features = X.shape


    beta = np.zeros(n_features)
    R = y.copy()  # residuals y - X @ beta
    lc = (X ** 2).sum(axis=0)  # lipschitz constants for coordinate descent
    for t in range(max_iter):
        for j in range(n_features):
            old = beta[j]
            beta[j] = ST(old + X[:, j].dot(R) / lc[j], alpha / lc[j])

            # keep residuals up to date
            if old != beta[j]:
                R += (old - beta[j]) * X[:, j]


        # I'll leave it up to you to implement a proper stopping criterion

    return beta



X = np.random.randn(100, 200)
y = np.random.randn(100)

if not np.isfortran(X):
    X = np.asfortranarray(X)        

alpha_max = np.max(np.abs(X.T.dot(y)))

cd_solver(X, y, alpha_max / 2., 100)

您也可以尝试使用近端梯度/ISTA,但根据我的经验,它比 CD 慢。

【讨论】:

    猜你喜欢
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2019-06-17
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多