坐标下降法(Coordinate descent)

本文探讨了坐标下降法(coordinate-wise minimization)的基本原理及其在不同情况下的应用,包括线性回归和支持向量机(SVM)。介绍了Tseng(2001)关于坐标下降法收敛性的开创性工作,并通过实验对比了坐标下降法与梯度下降法在求解线性回归问题上的性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先介绍一个算法:coordinate-wise minimization

问题的描述:给定一个可微的凸函数,如果在某一点x,使得f(x)在每一个坐标轴上都是最小值,那么f(x)是不是一个全局的最小值。

形式化的描述为:是不是对于所有的d,i都有

这里的代表第i个标准基向量。

答案为成立。


这是因为:


但是问题来了,如果对于凸函数f,若不可微该会怎样呢?


答案为不成立,上面的图片就给出了一个反例。

那么同样的问题,现在,其中g是可微的凸函数,每一个hi都是凸的?

答案为成立。


证明如下,对每一个y



坐标下降(Coordinate descent):

这就意味着,对所有的,其中g是可微的凸函数,每一个hi都是凸的,我们可以使用坐标下降寻求一个最小值,我们从一个最初的猜想开始,对k进行循环:


每一次我们解决了,我们都会使用新的值。

Tseng (2001)的开创性工作证明:对这种f(f在紧集上连续,且f到达了其最小值),的极限值,k=1,2,3….是f的一个最小元(minimizer)。

在实分析领域:

随后收敛与x*( Bolzano-Weierstrass)

收敛于f*( monotoneconvergence)

其中:

坐标下降的顺序是任意的,可以是从1到n的任意排列。

可以在任何地方将单个的坐标替代成坐标块

关键在于一次一个地更新,所有的一起更新有可能会导致不收敛


我们现在讨论一下坐标下降的应用:


线性回归:

,A有p列:

最小化xi,对所有的xj,j不等于i:


解得:


坐标下降重复这个更新对所有的

对比坐标下降与梯度下降在线性回归中的表现(100个实例,n=100,p=20)


将坐标下降的一圈与梯度下降的一次迭代对比是不是公平呢?是的。


其中r=y-Ax。每一次的坐标更新需要O(n)个操作,其中O(n)去更新r,O(n)去计算,所以一圈就需要O(np),跟梯度下降是一样的。


我们用相同的例子,用梯度下降进行比较,似乎是与计算梯度下降的最优性相违背。

那么坐标下降是一个一阶的方法吗?事实上不是,它使用了比一阶更多的信息。


现在我们再关注一下支持向量机:

SVM对偶中的坐标下降策略:


SMO(Sequentialminimal optimization)算法是两块的坐标下降,使用贪心法选择下一块,而不是用循环。

回调互补松弛条件(complementaryslackness conditions):


v,d,s是原始的系数,截距和松弛,其中,使用任何的(1)中i使得来计算d,利用(1)(2)来计算2.

SMO重复下面两步:

选出不满足互补松弛的αi,αj

最小化αi,αj使所有的变量满足条件


第一步使用启发式的方法贪心得寻找αi,αj,第二步使用等式约束。

### 块坐标下降法的原理与实现 块坐标下降法(Block Coordinate Descent Method)是一种常用的优化方法,广泛应用于高维空间中的非线性优化问题。该方法通过将变量分组为若干块,并针对每一组块分别进行优化,从而简化复杂的目标函数求解过程。 #### 算法原理 块坐标下降法的核心思想是在每一次迭代过程中仅更新目标函数的一小部分变量(即一块),其余变量保持不变。设目标是最小化一个多变量函数 \(f(x_1, x_2, ..., x_n)\),其中 \(x_i\) 表示第 \(i\) 组块变量,则算法可以通过以下方式描述:在每次迭代中选取某一特定块 \(j\) 并固定其他所有块的情况下,寻找使目标函数减小的最佳值[^3]。 具体来说,如果我们将所有的决策变量分为多个独立的部分或“块”,那么就可以轮流对每一个这样的子集执行局部搜索操作直到达到预定停止准则为止。这种方式不仅能够有效降低单步计算负担而且有助于更好地探索解空间结构特征[^5]。 #### 数学推导 给定一个待优化的目标函数 \(f(x)\),其中 \(x=[x^{(1)},...,x^{(N)}]\) 被划分为 N 个互斥且覆盖完整的区块。假设初始猜测点为 \(x^0\) ,则标准形式下的 k-th 次迭代可以表示成如下两阶段的过程: 1. **选择活动块**: 根据某些预定义规则挑选下一个要被激活更新的那个维度索引 j(k); 2. **执行单变量最优化** : 在选定好的那个方向上面做进一步细化调整动作也就是解决下面这个辅助子问题: \[ x_j^{k+1}=\operatorname*{argmin}_{y} f([x_1^k,\dots,y,\dots,x_N^k]) \] 重复上述两个步骤直至满足收敛条件比如相邻两次所得结果差异小于指定阈值或者超出最大允许循环数目限制等等即可终止运算进程[^3]。 #### 实现步骤概述 虽然不允许使用诸如'首先','然后'之类的引导词来进行条理分明地阐述各个组成部分之间的先后顺序关系但是仍然可以从功能模块角度出发概括总结一下主要环节构成要素如下几点内容供参考借鉴之用: - 初始化参数设置包括但不限于设定起始位置向量初值还有控制精度指标以及最大许可轮次计数器初始化等工作; - 设立评判机制用来衡量当前状态下距离理想终点有多远以便适时结束程序运行; - 编写核心业务逻辑单元负责完成每一轮内的实际数值变换作业任务; 以下是基于Python语言环境的一个简单示范案例展示如何运用块坐标下降技术来处理多元回归建模场景下的权重估计难题解决方案代码清单: ```python import numpy as np def block_coordinate_descent(X, y, alpha=0.1, tol=1e-4, max_iter=1000): """ Perform Block Coordinate Descent for linear regression with Lasso penalty. Parameters: - X: Feature matrix of shape (n_samples, n_features). - y: Target vector of length n_samples. - alpha: Regularization strength parameter. - tol: Tolerance for stopping criteria based on change in coefficients. - max_iter: Maximum number of iterations allowed. Returns: Coefficient array after optimization converges or reaches maximum iteration limit. """ n_samples, n_features = X.shape w = np.zeros(n_features) prev_w = None iters = 0 while True: if iters >= max_iter: break updated_blocks = False for idx in range(n_features): residual = y - X @ w + X[:,idx]*w[idx] z_idx = sum((X[:,idx])**2) rho_idx = X[:,idx].T@residual /z_idx signum = -1 if rho_idx < (-alpha/(2*z_idx)) else (+1 if rho_idx>(alpha/(2*z_idx))else 0 ) new_val =signum*(abs(rho_idx)-alpha/(2*z_idx)) new_val=new_val if abs(new_val)>tol else 0 old_val=w[idx] w[idx]=new_val diff_abs=np.abs(old_val-new_val) if(diff_abs>tol): updated_blocks=True if not updated_blocks : break iters +=1 return w ``` --- ###
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值