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输油管问题
- 下一篇: 数据查询语句