Robust PCA Low-rank(附matalb 代码)

2023-05-16

最近在看的论文中,包括人脸识别,以及深度神经网络模型压缩等论文中,都会有low-rank(低秩),低秩稀疏分解等解决方法,感觉关于low-rank的研究还挺火的,这个问题和Robust PCA问题很像,都需要解决一下问题:
1
在此之前,我需要先把一些资料的链接放出来,这些资料很有用。
Robust PCA 原理:原理1
原理2
Robust PCA matlab code:code
这个code里面有很多有趣的例子
包括:


视频分解:将视频中的前景与背景分离。(我试了下,代码可以跑起来)
修复:通过低秩表示学习恢复损坏的图像。
玩具数据示例:小玩具矩阵分解成低秩和稀疏分量。


原理里讲了很多范数的优化问题,我觉得需要认真看一下,最好自己推导一下,里面有详细的推导过程,还有软阈值函数等的推导,在Robust PCA求解问题中,这些会用到。(这两篇原理看懂了,我觉得基本可以了)
在文章里要讲的求解算法是:交替方向法(ADM)
算法更新步骤如下:
2
注意 D1/μk,Sλ/μk 都是阈值函数,在原理中有详细的推导,你可以画出函数长什么模样。
下面是matlab code,我设计了一个低秩+稀疏矩阵测试了一下:

function [L, S] = RobustPCA(X, lambda, mu, tol, max_iter)
    % - X is a data matrix (of the size N x M) to be decomposed
    %   X can also contain NaN's for unobserved values
    % - lambda - regularization parameter, default = 1/sqrt(max(N,M))
    % - mu - the augmented lagrangian parameter, default = 10*lambda
    % - tol - reconstruction error tolerance, default = 1e-6
    % - max_iter - maximum number of iterations, default = 1000

    [M, N] = size(X);
    unobserved = isnan(X);
    %在使用Matlab做仿真的时候难免会出现数据不是数字的情况,就是NaN的情况,这些数据是不能使用的,用isnan函数解决。
    %tf=isnan(A):返回一个与A相同维数的数组,若A的元素为NaN(非数值),在对应位置上返回逻辑1(真),否则返回逻辑0(假)。
    %对虚数z,如果z的实部或虚部都是NaN,那么isnan函数返回逻辑1,如果实部和虚部都是inf,则返回逻辑0。
    X(unobserved) = 0;
    normX = norm(X, 'fro');%n=norm(A),返回A的最大奇异值,即max(svd(A))

    % default arguments
    if nargin < 2%matalb 提供两个获取函数参数数目的函数,nargin返回函数输入参数的数量
        lambda = 1 / sqrt(max(M,N));
    end
    if nargin < 3
        mu = 10*lambda;
    end
    if nargin < 4
        tol = 1e-6;
    end
    if nargin < 5
        max_iter = 1000;
    end

    % initial solution
    L = zeros(M, N);
    S = zeros(M, N);
    Y = zeros(M, N);

    for iter = (1:max_iter)
        % ADMM step: update L and S
        L = Do(1/mu, X - S + (1/mu)*Y);%更新低秩矩阵
        S = So(lambda/mu, X - L + (1/mu)*Y);%更新稀疏矩阵
        % and augmented lagrangian multiplier
        Z = X - L - S;
        Z(unobserved) = 0; % skip missing values
        Y = Y + mu*Z;

        err = norm(Z, 'fro') / normX;
        if (iter == 1) || (mod(iter, 10) == 0) || (err < tol)
            fprintf(1, 'iter: %04d\terr: %f\trank(L): %d\tcard(S): %d\n', ...
                    iter, err, rank(L), nnz(S(~unobserved)));
        end
        if (err < tol) break; end
    end
end

function r = So(tau, X)
    % shrinkage operator
    r = sign(X) .* max(abs(X) - tau, 0);
end

function r = Do(tau, X)
    % shrinkage operator for singular values
    [U, S, V] = svd(X, 'econ');
    r = U*So(tau, S)*V';
end

i=[1  2  4];j=[1  3  5];s = [6  7  8]; 
A = sparse(i,j,s)
B=full(A)
C=ones(4,5)
D=1.0*(B+C)
[m,n]=size(D)
lambda=1.0/sqrt(max(m,n))
mu = 10*lambda
tol = 1e-6
max_iter = 1000
[L, S] = RobustPCA(D, lambda, mu, tol, max_iter)

速度挺快的,这个代码看起来还是挺简洁的,但是需要认真看一下一些原理推导。
注:其实这里面的内容都不是我自己的,我之前找的Robust PCA很多都是讲原理,没有代码,我就整合了一下。大家可以在网上多找找代码。
如有错误,欢迎指出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Robust PCA Low-rank(附matalb 代码) 的相关文章

  • Fortran 中等级(形状)未知的子例程参数

    我想知道如何在 Fortran 中最好地处理采用未知等级参数的子例程 例如 Real 8 array1 2 2 array2 2 2 3 call mysubroutine array1 call mysubroutine array2 就
  • 熊猫滚动窗口百分位排名

    我正在尝试在滚动窗口内按列计算数据的百分位数排名 test pd DataFrame np random randn 20 3 pd date range 1 1 2000 periods 20 A B C test Out 111 A B
  • R:ggfortify:“自动绘图不支持 prcomp 类型的对象”

    我正在尝试使用 ggfortify 来可视化我使用 prcomp 所做的 PCA 结果 示例代码 iris pca lt iris c 1 2 3 4 autoplot prcomp iris pca 错误 自动绘图不支持 prcomp 类
  • 比较 R 中的 svd 和 princomp

    我想要得到singular values of a matrix in R获取主成分 然后也使用 princomp x 来比较结果 我知道 princomp 会给出主要成分 Question 如何从 d u 和 v 中获取主成分 解决方案s
  • 使用MySQL,如何选择某一特定行的查询结果排名?

    今天我花了很多时间尝试各种事情 但似乎都不起作用 这是我的情况 我希望能够根据特定排序行中的 ID 选择行的排名 例如 如果我的查询类似于 SELECT id name FROM people ORDER BY name ASC 结果如下
  • 使用PCA选择特征

    我正在做无监督分类 为此 我有 8 个特征 绿色方差 绿色标准差 红色平均值 红色方差 红色标准差 色调平均值 色调方差 色调标准差 用于分类每个图像 我想使用 PCA 选择 3 个最重要的特征 我编写了以下代码用于特征选择 其中特征尺寸为
  • R数据帧按组排名(按排名分组),带有包 dplyr

    我有一个数据框 测试 如下所示 session id seller feedback score 1 1 282470 2 1 275258 3 1 275258 4 1 275258 5 1 37831 6 1 282470 7 1 26
  • 如何添加排名栏?

    我想选择记录并确定每个相似数据的排名号 我的数据如下 MEMBER ID LOAN AMOUNT 1 2 000 00 2 1 000 00 3 4 000 00 4 1 000 00 我想要的结果如下所示 RANK MEMBER ID L
  • Hotelling 在 python 中的 T^2 分数

    我在 python 中使用 matplotlib 将 pca 应用于数据集 然而 matplotlib 并不像 Matlab 那样提供 t 平方分数 有没有办法像Matlab一样计算Hotelling的T 2分数 Thanks matplo
  • 如何使用 FactoMineR 包以编程方式确定主成分的列索引?

    给定一个包含混合变量 即分类变量和连续变量 的数据框 例如 digits 0 9 set seed for reproducibility set seed 17 function to create random string creat
  • sklearn多类SVM函数

    我有多个类标签 想要计算模型的准确性 我有点困惑我需要使用哪个 sklearn 函数 据我了解 以下代码仅用于二元分类 dividing X y into train and test data X train X test y train
  • R 中 PCA 的结果载荷

    在R中进行PCA时 p lt princomp iris 1 4 我通过以下两种方法得出不同Component的系数 IrisLoading lt p loadings 1 2 methods1 use the fist two Comp
  • R:具有两个变量和 ties.method random 的排名函数

    R中有没有一种方法可以使用带有多个条件和ties method的rank函数 或类似的函数 通常 排名用于对向量中的值进行排名 如果存在联系 您可以使用其中一种联系方法 平均 随机 第一 但是当对矩阵中的一列进行排名时 我想使用多列and关
  • tidyverse 计算多列中每行的排名

    我有以下数据框 dat lt data frame id c a b c d x1 c 1 3 5 7 x2 c 4 2 6 0 x3 c 2 2 5 9 我现在想计算排名per row跨越我的三个 x 列 并希望将该结果存储到我的dat数
  • PySpark PCA:避免 NotConvergedException

    我试图通过 ml linalg 方法使用 PCA 来减少广泛的数据集 51 个特征 约 1300 个个体 如下所示 1 将我的列命名为一个列表 features indi prep df select c for c in indi pre
  • Matlab - 多维数据的PCA分析与重构

    我有一个大型多维数据集 132 维 我是数据挖掘的初学者 我想使用 Matlab 来应用主成分分析 不过 我看到网上有很多功能解释 但我不明白它们应该如何应用 基本上 我想应用 PCA 并从我的数据中获取特征向量及其相应的特征值 在此步骤之
  • 查找字符串的*最*常见前缀 - 更好的方法吗?

    我有一个钥匙列表 foo a foo b foo c fnord 这里所有类似的解决方案都假设您没有fnord在你的文字中 我有这个代码可以完成这项工作 def detect prefix keys PCT 0 70 cutof pre l
  • sklearn 中的 pca.inverse_transform

    将我的数据拟合后 X 我的数据 pca PCA n components 1 pca fit X X pca pca fit transform X 现在 X pca 具有一维 当我根据定义执行逆变换时 它不是应该返回原始数据 即 X 二维
  • Oracle SQL - 如何使用 RANK() 或 DENSE_RANK() 和 ROW_NUMBER() 分析函数获取不同的行?

    我希望获得每个部门前 3 名不同的薪资 我能够使用RANK or DENSE RANK or ROW NUMBER 但我的表有一些工资相同的记录 下面提到的是我的查询及其结果 20部薪资前三名应该是6000 3000 2975 但是有 2
  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679

随机推荐