BPG-MF学习笔记
论文及代码出处
论文原文:Beyond Alternating Updates for Matrix Factorization with Inertial Bregman Proximal Gradient Algorithms
补充材料下载链接:https://proceedings.neurips.cc/paper/2019/file/bc7f621451b4f5df308a8e098112185d-Supplemental.zip
代码出处:https://github.com/mmahesh/cocain-bpg-matrix-factorization
BPG-MF算法
算法流程
无正则
根据算法流程对 P k P^k Pk和 Q k Q^k Qk进一步推导,可以得到无正则项的BPG-MF算法为如下形式:
L2正则
代码结构
作者提供的程序包实现了BPG-MF、CoCaIn BPG-MF、
BPG-MF-WB、PALM和iPALM五种算法,可以通过修改main.py文件中的algo参数进行选择。同时还可以通过修改dataset_option对使用的数据集进行选择。
算法功能实现的函数在my_functions.py中,主要函数及其功能如下:
| main_func | 计算数据一致项 |
| grad | 计算光滑项g的梯度 |
| make_update | 实现算法的更新策略 |
| breg | 计算Bregman距离 |
make_update函数
breg_num为1时,该函数实现了PALM与iPALM;breg_num为2时,该函数实现了BPG相关算法。接下来讨论BPG算法的代码实现。
BPG算法的abs_fun_num可以选择正则化形式,等于3时实现了无正则和L2正则(因为L2正则与无正则仅差一次项系数,详见supplementary),等于2时实现了L1正则。
无正则和L2正则
if breg_num ==2:# Calculates CoCaIn BPG-MF, BPG-MF, BPG-MF updates# 计算g对U和Z的偏导grad_u, grad_z = grad(A, U1, Z1, lam, fun_num=0)# 计算h对U和Z的偏导grad_h_1_a = U1*(np.linalg.norm(U1)**2 + np.linalg.norm(Z1)**2)grad_h_1_b = Z1*(np.linalg.norm(U1)**2 + np.linalg.norm(Z1)**2)grad_h_2_a = U1grad_h_2_b = Z1# 是否为对称矩阵sym_setting = 0if abs_fun_num == 3:# Code for No-Regularization and L2 Regularizationif exp_option==1:# No-Regularization is equivalent to L2 Regularization with lam=0# 计算P^kp_l = (1/uL_est)*grad_u - (c_1*grad_h_1_a + c_2*grad_h_2_a) # uL_est = 1, means lambda = 1# 计算 Q^k # lambda_0 is corresponding to lamq_l = (1/uL_est)*grad_z - (c_1*grad_h_1_b + c_2*grad_h_2_b)if sym_setting == 0: #default option# 解三次方程,temp_y为根coeff = [c_1*(np.linalg.norm(p_l)**2 + np.linalg.norm(q_l)**2), 0,(c_2 + (lam/uL_est)), -1]temp_y = np.roots(coeff)[-1].real# U^(k+1) = -r * P^k, Z^(k+1) = -r * Q^k, return (-1)*temp_y*p_l, (-1)*temp_y*q_lelse:p_new = p_l + q_l.Tcoeff = [4*c_1*(np.linalg.norm(p_new)**2), 0,2*(c_2 + (lam/uL_est)), -1]temp_y = np.roots(coeff)[-1].realreturn (-1)*temp_y*p_new, (-1)*temp_y*(p_new.T)L1正则
if abs_fun_num == 2:if exp_option==1:# L1 Regularization simpletp_l = (1/uL_est)*grad_u - (c_1*grad_h_1_a + c_2*grad_h_2_a) # 计算 P^kp_l = -np.maximum(0, np.abs(-tp_l)-lam*(1/uL_est))*np.sign(-tp_l) # 计算 -S_t0(-P^k)tq_l = (1/uL_est)*grad_z - (c_1*grad_h_1_b + c_2*grad_h_2_b) # 计算 Q^Kq_l = -np.maximum(0, np.abs(-tq_l)-lam*(1/uL_est))*np.sign(-tq_l) # 计算 -S_t0(-Q^k)# 解三次方程,temp_y为根coeff = [c_1*(np.linalg.norm(p_l)**2 + np.linalg.norm(q_l)**2), 0,(c_2), -1]temp_y = np.roots(coeff)[-1].real# 为了统一U^k和Z^k的计算形式,p_l和q_l相较于论文多了负号return (-1)*temp_y*p_l, (-1)*temp_y*q_l总结
以上是生活随笔为你收集整理的BPG-MF学习笔记的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: pyhton输油管问题
- 下一篇: 数据查询语句