SVT矩阵补全算法的实现及应用

1 前言

  最近在学习矩阵补全的方法主要是用来做药物重定位。入门矩阵补全方法后才发现这个坑有点大,需要太多的数学基础了。对于数学知识严重不足的我欲哭无泪,搞了两周之后对这个方法的现实意义跟数学背景有了一定的了解。在这里做个总结并用经典的SVT矩阵补全算法(《A singular value thresholding algorithm for matrix completion》)作为一个Demo(Python实现),解释一下矩阵补全的具体做法,感受一下矩阵补全到底是干啥的。

2 低秩矩阵补全的现实意义

  这一部分内容参考我之前的博客(矩阵分解方法概述
  
时间仓促没大块时间,码字先把代码贴出来,以后慢慢补解释。

""
@Date   :2020/11/15 19:54
@Source 《A singular value thresholding algorithm for MC&RW》
"""
import numpy as np

#  creating data
svt_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 float
svt_data = svt_data.astype(float)
# print(svt_data)

#  generating Omega :0 denotes None 1 denotes true
shape = svt_data.shape
Omega = 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 X


result = svt_data_hat = svt_solve(svt_data, Omega)
print(result)

  • 12
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 32
    评论
### 回答1: Matlab中常用的矩阵补全工具有以下几种: 1. 零补全(Zero-filling):将矩阵中的缺失值补全为0。此方法简单且易于实现,但缺乏准确性和完整性。 2. 平均值补全(Mean imputation):将矩阵中的缺失值补全为该列的平均值或者该行的平均值。该方法适用于数据缺失较少的情况,但在存在大量缺失值的情况下可能会引入偏差。 3. K近邻补全(KNN-imputation):对于每个缺失值,找到其K个最近邻点,然后利用邻居的平均值或加权平均值来进行补全。该方法能够更准确地补全缺失值,但计算复杂度较高。 4. 矩阵分解补全方法(Matrix Completion):该方法主要是利用矩阵分解的技术,把目标矩阵分解成多个矩阵相乘的形式,然后通过优化目标函数,来得到最佳的矩阵补全结果。 5. 插值法补全(Interpolation):该方法利用已有的数据点之间的关系,通过插值算法来预测缺失值。插值算法包括线性插值、大气插值、双线性插值等,可根据实际情况选择合适的方法进行补全。 总之,选择适当的矩阵补全方法,需要根据具体的数据情况,结合实际应用需求和算法的效率进行综合考虑,以得到准确的矩阵补全结果。 ### 回答2: Matlab中有许多矩阵补全工具,主要分为两类: 1.基于低秩矩阵补全的工具,例如:NuclearNormMinimization、SVT、soft-Impute等。 这些工具通常利用矩阵的低秩性质,通过最小化核范数或奇异值阈值来对矩阵进行补全,能够处理缺失值比较少的矩阵。 2.基于矩阵分解的工具,例如:NMF、PCA、kmeans、LSA等。这些工具通常采用矩阵分解的方法对缺失矩阵进行补全。其中,NMF基于矩阵的非负性进行分解,而PCA基于矩阵的特征向量进行分解,kmeans基于聚类的思想进行分解,LSA则是一种基于奇异值分解(SVD)的矩阵分解方法。 除了以上主要的工具外,还有一些其他的矩阵补全工具,例如:Singular Spectrum Analysis、Robust PCA、Tensor Completion等。这些工具具有不同的特点和适用范围,可以根据实际需求选择合适的工具进行矩阵补全

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值