块坐标下降法(Block Coodinate Descent)

本文探讨了坐标下降法在求解凸优化问题中的应用,包括线性回归和支持向量机的具体实现,并对比了坐标下降法与梯度下降法的性能。

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

问题的描述:给定一个可微的凸函数,如果在某一点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,第二步使用等式约束。

### 块坐标下降(BCD)算法实现 #### Python 实现 块坐标下降法是一种迭代优化技术,每次更新变量的一个子集或一个分量。下面提供了一个简单的Python版本的块坐标下降算法框架: ```python import numpy as np def bcd_algorithm(X, y, num_blocks=10, max_iter=100, tol=1e-4): """ 使用块坐标下降法解决线性回归问题 参数: X : 特征矩阵 y : 目标向量 num_blocks : 划分为多少个块 max_iter : 最大迭代次数 tol : 收敛阈值 返回: w : 学习到的权重参数 """ n_samples, n_features = X.shape block_size = int(np.ceil(n_features / num_blocks)) # 初始化权重 w = np.zeros((n_features,)) for iteration in range(max_iter): start_index = 0 end_index = min(block_size, n_features) while start_index < n_features: # 获取当前块的数据 current_block_indices = slice(start_index, end_index) # 更新规则取决于具体的应用场景,在这里是基于最小二乘损失函数的情况下的梯度计算 gradient_for_current_block = compute_gradient(X[:,current_block_indices],y,w[current_block_indices]) # 进行单步最速下降来获得新的w_i^new step_direction = -gradient_for_current_block # 对应位置上的权值更新 w[current_block_indices] += step_direction # 移动至下一个block start_index += block_size end_index = min(end_index + block_size,n_features) if check_convergence(w,tol): break return w def compute_gradient(X,y,w): """ 计算给定数据X和标签y下模型预测误差相对于系数w的导数""" predictions = X.dot(w.T).flatten() errors = predictions-y.flatten() gradients = 2*X.T.dot(errors)/len(y) return gradients.reshape(-1) def check_convergence(w,tolerance): """ 检查是否满足收敛条件""" change_in_w = abs(sum([wi_new-wi_old for wi_new,wi_old in zip(w[:-1],w[1:])])) return True if change_in_w<tolerance else False ``` 此代码片段展示了如何通过定义`bcd_algorithm()`函数并调用辅助函数`compute_gradient()`, `check_convergence()`来进行块坐标的更新过程。 #### MATLAB 实现 对于MATLAB环境中的块坐标下降算法,可以采用如下方式编写: ```matlab function [beta] = BlockCoordinateDescent(X,Y,numBlocks,maxIter,tolerance) %BLOCKCOORDINATEDESCENT Performs block coordinate descent on linear regression problem. % % beta = BLOCKCOORDINATEDESCENT(X,Y,numBlocks,maxIter,tolerance) returns the estimated coefficients using % block coordinate descent method. [n,p]=size(X); blockSize = ceil(p/numBlocks); beta=zeros(p,1); % Initialize betas to zero vector for iter = 1:maxIter for i = 1:numBlocks idxStart=(i-1)*blockSize+1; idxEnd=min(i*blockSize,p); activeSetIdxs=[idxStart:idxEnd]; inactiveSetIdxs=setdiff(1:p,activeSetIdxs); Xi=X(:,activeSetIdxs); Yi=Y-X(:,inactiveSetIdxs)*(beta(inactiveSetIdxs)); beta(activeSetIdxs)=inv(Xi'*Xi)*(Xi'*Yi); end changes=sum(abs(beta-oldBeta)); oldBeta=beta; if(changes<=tolerance),break,end end end ``` 上述Matlab脚本实现了针对多元线性回归问题的块坐标下降求解器。注意这里的`oldBeta`是在第一次进入内层循环之前初始化为全零数组,并且在整个过程中保持不变直到完成一轮完整的外层循环之后再赋新值[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值