
SVT矩阵补全算法的实现及应用
发布日期:2021-05-08 05:16:26
浏览次数:21
分类:原创文章
本文共 1902 字,大约阅读时间需要 6 分钟。
转载请标明出处:https://blog.csdn.net/zfhsfdhdfajhsr/article/details/109709889
作者:一穷二白到年薪百万
前言
最近在学习矩阵补全的方法主要是用来做药物重定位。入门矩阵补全方法后才发现这个坑有点大,需要太多的数学基础了。对于数学知识严重不足的我欲哭无泪,搞了两周之后对这个方法的现实意义跟数学背景有了一定的了解。在这里做个总结并用经典的SVT矩阵补全算法(《A singular value thresholding algorithm for matrix completion》)作为一个Demo(Python实现),解释一下矩阵补全的具体做法,感受一下矩阵补全到底是干啥的。
低秩矩阵补全的现实意义
这一部分内容参考我之前的博客
时间仓促没大块时间,码字先把代码贴出来,以后慢慢补解释。
""@Date :2020/11/15 19:54@Source 《A singular value thresholding algorithm for MC&RW》"""import numpy as np# creating datasvt_data = np.array([[0, 3, 0, 4], [3, 0, 4, 0], [0, 0, 2, 0], [5, 0, 3, 4], [0, 0, 4, 0], [0, 3, 3, 0]])# changing data type into floatsvt_data = svt_data.astype(float)# print(svt_data)# generating Omega :0 denotes None 1 denotes trueshape = svt_data.shapeOmega = np.zeros(shape)for i in range(0, shape[0]): for j in range(0, shape[1]): if svt_data[i, j] > 0: Omega[i, j] = 1# print(Omega)def svt_solve(A, Omega, tau=None, delta=None, epslion=1e-2, max_iterations=1000): # 矩阵初始化,生成一个和矩阵A形状一样的0矩阵 Y = np.zeros_like(A) if not tau: tau = 5 * np.sum(A.shape) / 2 if not delta: # 确定步长初始值 delta = 1.2 * np.prod(A.shape) / np.sum(Omega) for _ in range(max_iterations): # 对矩阵Y进行奇异值分解 U, S, V = np.linalg.svd(Y, full_matrices=False) # soft-thresholding operator print(type(S)) print(type(tau)) print(tau) S = np.maximum(S - tau, 0) # singular value shrinkage X = np.linalg.multi_dot([U, np.diag(S), V]) # Y的迭代 Y += delta * Omega * (A-X) # 误差计算 rel_recon_error = np.linalg.norm(Omega * (X-A)) / np.linalg.norm(Omega*A) if rel_recon_error < epslion: break return Xresult = svt_data_hat = svt_solve(svt_data, Omega)print(result)
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月03日 21时22分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
C++学习记录 四、基于多态的企业职工系统
2019-03-05
C++学习记录 五、C++提高编程(2)
2019-03-05
面试问道nginx优化怎么做的
2019-03-05
自学linux毕业shell面试题
2019-03-05
4 Java 访问控制符号的范围
2019-03-05
第9章 - 有没有替代原因(检验证据)
2019-03-05
VUE3(八)setup与ref函数
2019-03-05
Vue之Element标签页保留用户操作缓存。
2019-03-05
智能合约开发实践(1)
2019-03-05
2. Spring Boot学习——Yaml等配置文件教程
2019-03-05
MATLAB——操作矩阵的常用函数
2019-03-05
CMake自学记录,看完保证你知道CMake怎么玩!!!
2019-03-05
Eigen库中vector.transpose()函数什么意思
2019-03-05
ORB-SLAM2:LocalMapping线程学习随笔【李哈哈:看看总有收获篇】
2019-03-05
ORB-SLAM2:LoopClosing线程学习随笔【李哈哈:看看总有收获篇】
2019-03-05
牛客练习赛56 D 小翔和泰拉瑞亚(线段树)
2019-03-05