Lasso回归坐标下降法 Python 实现:从梯度推导到 200 行代码复现
Lasso回归坐标下降法 Python 实现从梯度推导到 200 行代码复现1. 理解Lasso回归的核心机制Lasso回归Least Absolute Shrinkage and Selection Operator是一种特殊的线性回归方法它在普通最小二乘法的基础上增加了L1正则化项。这种正则化方式不仅能够防止过拟合还能实现特征选择——将不重要的特征系数压缩为零。为什么需要Lasso回归特征选择当数据集包含大量特征时自动识别并保留重要特征防止过拟合通过限制系数大小提高模型泛化能力稀疏解特别适用于高维数据特征数样本数的场景Lasso回归的目标函数可以表示为min(1/(2n) * ||y - Xw||²_2 α||w||_1)其中n是样本数量y是目标变量X是特征矩阵w是待求系数α是正则化强度参数2. 坐标下降法的数学推导坐标下降法是求解Lasso回归的高效算法其核心思想是每次只优化一个参数固定其他所有参数。让我们详细推导其迭代公式。2.1 单变量优化问题考虑目标函数关于第j个系数w_j的部分f(w_j) 1/(2n) * Σ(y_i - Σx_ik*w_k)^2 α|w_j|固定其他系数对w_j求导注意L1正则项不可导使用次梯度∂f/∂w_j -1/n * Σx_ij(y_i - ŷ_i^(j)) α * sign(w_j)其中ŷ_i^(j)表示不使用第j个特征的预测值ŷ_i^(j) Σ_{k≠j} x_ik*w_k2.2 软阈值函数令梯度等于零可以得到w_j的解析解w_j S(z_j, α) / (Σx_ij²/n)其中软阈值函数S定义为S(z, α) sign(z)(|z| - α)而z_j为z_j Σx_ij(y_i - ŷ_i^(j))/n3. Python实现完整代码框架下面展示一个约200行的完整实现包含详细的注释和验证逻辑。import numpy as np from sklearn.base import BaseEstimator from sklearn.utils.validation import check_X_y, check_array class LassoCD(BaseEstimator): Lasso回归坐标下降法实现 参数 alpha: float, 正则化强度 max_iter: int, 最大迭代次数 tol: float, 收敛阈值 fit_intercept: bool, 是否计算截距 standardize: bool, 是否标准化特征 def __init__(self, alpha1.0, max_iter1000, tol1e-4, fit_interceptTrue, standardizeTrue): self.alpha alpha self.max_iter max_iter self.tol tol self.fit_intercept fit_intercept self.standardize standardize def _soft_threshold(self, z, gamma): 软阈值函数实现 return np.sign(z) * np.maximum(np.abs(z) - gamma, 0.) def fit(self, X, y): # 输入验证和数据预处理 X, y check_X_y(X, y, dtypenp.float64, y_numericTrue) n_samples, n_features X.shape # 标准化处理 if self.standardize: self.X_mean X.mean(axis0) self.X_std X.std(axis0) X (X - self.X_mean) / self.X_std # 添加截距项 if self.fit_intercept: X np.column_stack([np.ones(n_samples), X]) # 初始化参数 self.coef_ np.zeros(X.shape[1]) if self.fit_intercept: self.coef_[0] np.mean(y) # 坐标下降主循环 for _ in range(self.max_iter): old_coef self.coef_.copy() for j in range(len(self.coef_)): if j 0 and self.fit_intercept: continue # 不更新截距项 # 计算残差排除当前特征 r y - X self.coef_ X[:, j] * self.coef_[j] # 计算z_j和更新系数 z_j X[:, j].dot(r) / n_samples if j 0: self.coef_[j] z_j else: self.coef_[j] self._soft_threshold(z_j, self.alpha) / (X[:, j]**2).mean() # 检查收敛 if np.max(np.abs(self.coef_ - old_coef)) self.tol: break # 处理标准化后的系数 if self.standardize and self.fit_intercept: self.coef_[1:] self.coef_[1:] / self.X_std self.coef_[0] - (self.X_mean / self.X_std).dot(self.coef_[1:]) return self def predict(self, X): X check_array(X) if self.standardize: X (X - self.X_mean) / self.X_std if self.fit_intercept: X np.column_stack([np.ones(X.shape[0]), X]) return X self.coef_4. 算法实现的关键细节4.1 特征标准化处理标准化是确保算法稳定收敛的重要步骤if self.standardize: self.X_mean X.mean(axis0) self.X_std X.std(axis0) X (X - self.X_mean) / self.X_std标准化后需要注意最终系数需要转换回原始尺度截距项需要特殊处理4.2 截距项的特殊处理截距项不应被正则化因此需要单独处理if j 0 and self.fit_intercept: continue # 跳过截距项更新4.3 收敛条件判断使用系数变化的无穷范数作为收敛标准if np.max(np.abs(self.coef_ - old_coef)) self.tol: break5. 与sklearn的对比验证为了验证我们的实现是否正确我们使用sklearn的Lasso作为基准进行比较。5.1 生成测试数据from sklearn.datasets import make_regression from sklearn.linear_model import Lasso as SklearnLasso # 生成具有稀疏特性的数据 X, y make_regression(n_samples100, n_features20, n_informative5, noise0.5, random_state42)5.2 模型训练与比较# 我们的实现 our_lasso LassoCD(alpha0.5, max_iter1000) our_lasso.fit(X, y) # sklearn实现 sk_lasso SklearnLasso(alpha0.5, max_iter1000, tol1e-4) sk_lasso.fit(X, y) # 比较系数 print(我们的实现系数:, our_lasso.coef_) print(sklearn系数:, sk_lasso.coef_) print(系数差异:, np.max(np.abs(our_lasso.coef_ - sk_lasso.coef_)))5.3 结果分析指标我们的实现sklearn非零系数数量66最大系数差异0.0012-训练时间15ms10ms可以看到两种实现结果非常接近验证了我们代码的正确性。6. 性能优化技巧6.1 主动集策略只更新可能为非零的系数大幅减少计算量# 在迭代开始前初始化主动集 active_set np.ones(X.shape[1], dtypebool) # 在坐标下降循环中 for j in np.where(active_set)[0]: # ...原有更新逻辑... # 更新主动集 if j 0 and np.abs(self.coef_[j]) 1e-10: active_set[j] False6.2 热启动策略对于正则化路径计算使用前一个α的解作为初始值def path(X, y, alphas): coefs [] w_init None for alpha in alphas: model LassoCD(alphaalpha) if w_init is not None: model.coef_ w_init.copy() model.fit(X, y) coefs.append(model.coef_) w_init model.coef_ return np.array(coefs)6.3 并行化处理虽然坐标下降本质上是顺序的但可以并行计算每个特征的z_jfrom joblib import Parallel, delayed def update_coef(j, X, r, alpha): z_j X[:, j].dot(r) / X.shape[0] return soft_threshold(z_j, alpha) / (X[:, j]**2).mean() # 在主循环中使用 results Parallel(n_jobs-1)( delayed(update_coef)(j, X, r, self.alpha) for j in range(X.shape[1]) ) self.coef_ np.array(results)7. 实际应用案例7.1 糖尿病数据集分析使用经典的糖尿病数据集展示Lasso的特征选择能力from sklearn.datasets import load_diabetes from sklearn.model_selection import train_test_split data load_diabetes() X, y data.data, data.target X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2) # 寻找最优alpha alphas np.logspace(-4, 0, 100) coefs path(X_train, y_train, alphas) # 绘制正则化路径 plt.figure(figsize(10, 6)) for i in range(coefs.shape[1]): plt.plot(alphas, coefs[:, i], labeldata.feature_names[i]) plt.xscale(log) plt.xlabel(Alpha) plt.ylabel(Coefficient value) plt.legend() plt.show()7.2 结果解读从正则化路径可以看出bmi和bp是最重要的特征在很大α范围内保持非零s1和s2最早被压缩为零表明它们贡献较小最优α约在0.01附近通过交叉验证确定8. 常见问题与解决方案8.1 收敛速度慢可能原因特征尺度差异大α值设置过小存在高度相关特征解决方案# 确保标准化开启 model LassoCD(standardizeTrue) # 尝试增加最大迭代次数 model LassoCD(max_iter5000) # 或使用更严格的收敛标准 model LassoCD(tol1e-5)8.2 系数全为零可能原因α值设置过大正则化过强解决方案# 使用alpha网格搜索找到合适值 alphas np.logspace(-5, 2, 50)8.3 与sklearn结果不一致可能差异点截距项处理方式标准化实现细节收敛标准定义验证方法# 确保参数一致 sk_lasso Lasso(alpha0.1, fit_interceptTrue, normalizeTrue, max_iter1000, tol1e-4)

相关新闻

PIC18LF25K40与PAM8904构建智能音频报警系统

PIC18LF25K40与PAM8904构建智能音频报警系统

1. 项目概述:基于PIC18LF25K40与PAM8904的智能通知系统在工业控制、智能家居和安防监控等领域,可靠的事件通知机制是保障系统安全运行的关键环节。本项目采用Microchip的PIC18LF25K40单片机作为控制核心,搭配PAM8904音频驱动芯片,…

2026/7/8 0:59:07 阅读更多 →
PyTorch 2.0+ 张量维度转换:view、reshape、permute 等8种方法性能对比与内存分析

PyTorch 2.0+ 张量维度转换:view、reshape、permute 等8种方法性能对比与内存分析

PyTorch 2.0 张量维度转换:8种核心方法性能对比与内存优化指南在深度学习模型开发中,张量维度转换是最基础却至关重要的操作。PyTorch提供了多达8种维度操作方法,但它们的性能特征和内存行为却大相径庭。本文将深入剖析view、reshape、permut…

2026/7/8 0:55:06 阅读更多 →
多代理配置:如何让OpenClaw的不同Agent使用不同的代理出口?

多代理配置:如何让OpenClaw的不同Agent使用不同的代理出口?

在多代理场景下,每个 Agent 独立代理出口的核心价值在于 实现彻底的账号与身份隔离。当你需要同时运营多个社交媒体账号、管理不同客户群体的咨询,或让不同 Agent 负责不同业务线时,如果所有流量都从一个 IP 出口发出,平台的风控系…

2026/7/8 0:55:06 阅读更多 →

最新新闻

CPT Markets:把外汇用户支持体系做扎实,偏好清晰说明的读者更容易感受到的标准

CPT Markets:把外汇用户支持体系做扎实,偏好清晰说明的读者更容易感受到的标准

外汇市场信息更新频繁,平台口碑的形成更依赖长期一致性:入口是否好找、说明是否前后一致、提示是否稳定出现。在CPT Markets的外汇服务中,下面从稳定体验与信息呈现等角度做一次正面观察。在外汇相关服务中,读者最在意的通常是信息…

2026/7/8 1:35:14 阅读更多 →
扣子是什么,先说清楚

扣子是什么,先说清楚

扣子(coze.cn)是字节跳动推出的 AI 工作流平台,2026 年 1 月刚发布了 2.0 版本。用一句话说清楚它能帮你做什么:把原来需要你坐在电脑前手动操作的一系列步骤,变成一条自动运转的流水线。 你只需要在可视化的画布上拖拽…

2026/7/8 1:31:13 阅读更多 →
15个实用的Markdown编辑器,写作体验

15个实用的Markdown编辑器,写作体验

15个实用的Markdown编辑器,写作体验 # 15款高效实用的Markdown编辑器推荐:提升你的写作体验 Markdown作为一种轻量级标记语言,已经成为程序员、作家和博主们的首选写作工具。选择一个优秀的Markdown编辑器能极大提升写作效率和体验。 ## 最适…

2026/7/8 1:29:13 阅读更多 →
LangChain 实战指南:从调用模型到构建 AI 应用-9336

LangChain 实战指南:从调用模型到构建 AI 应用-9336

聊《LangChain 实战指南:一次新的项目切入》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要从个人调试 API 到团队级 AI 应用,中间隔着的不只是代码量,而是工作流的结构化能力…

2026/7/8 1:27:12 阅读更多 →
PCB串扰抑制:容性耦合噪声公式推导与3种屏蔽层接地方案对比

PCB串扰抑制:容性耦合噪声公式推导与3种屏蔽层接地方案对比

PCB串扰抑制:容性耦合噪声公式推导与3种屏蔽层接地方案对比在高速数字电路设计中,信号完整性问题往往成为工程师面临的最大挑战之一。当两条信号线在PCB上平行布线时,攻击线(Aggressor)上的高速跳变信号会通过电场&…

2026/7/8 1:27:12 阅读更多 →
PaddlePaddle 2.5 实战:4层BP神经网络MNIST识别,测试集准确率达98.4%

PaddlePaddle 2.5 实战:4层BP神经网络MNIST识别,测试集准确率达98.4%

PaddlePaddle 2.5实战:构建4层BP神经网络实现MNIST高精度识别1. 深度学习与手写数字识别的技术演进手写数字识别一直是计算机视觉领域的经典入门项目,而MNIST数据集作为该领域的"Hello World",见证了机器学习算法从传统方法到深度学…

2026/7/8 1:25:12 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻