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 代码) 的相关文章

  • 使用sklearn在PCA中恢复explained_variance_ratio_的特征名称

    我正在尝试从使用 scikit learn 完成的 PCA 中恢复 which特征被选择为relevant IRIS 数据集的经典示例 import pandas as pd import pylab as pl from sklearn
  • Fortran 中等级(形状)未知的子例程参数

    我想知道如何在 Fortran 中最好地处理采用未知等级参数的子例程 例如 Real 8 array1 2 2 array2 2 2 3 call mysubroutine array1 call mysubroutine array2 就
  • 如何在 R caret 包中执行主成分回归后提取成分以进行进一步分析

    我有一个包含 151 个变量的数据集 这些变量被发现具有很高的共线性 因此我通过执行以下操作对其进行主成分回归 ctrl lt trainControl method repeatedcv repeats 10 savePred T mod
  • 获取mysql查询中一行的排名

    我使用此查询根据每个名字获得的票数为他们分配排名 但它返回错误 1248 每个派生表必须有自己的别名 这是我的代码 SELECT rownum rownum 1 AS rank name vote FROM table SELECT row
  • MySQL 中的 ROW_NUMBER()

    MySQL 有没有一种很好的方法来复制 SQL Server 功能ROW NUMBER 例如 SELECT col1 col2 ROW NUMBER OVER PARTITION BY col1 col2 ORDER BY col3 DES
  • PCA 中第一个分量覆盖的 99% 方差的显着性

    当第一个分量覆盖 PCA 分析中总方差的 99 以上时 这意味着什么 我有一个大小为 500X1000 的特征向量 我在其中使用了 Matlab 的 pca 函数 该函数返回 coeff score latent tsquared expl
  • 使用 Excel 中的排名函数

    很抱歉 如果这个问题已经得到解答 我觉得可能有 但我正在努力寻找一个可以帮助我走向成功的答案 我有一个计时赛结果的基本电子表格 该电子表格适用于男性和女性 基本上 所有参赛者中以 30 秒为间隔的最快时间都会获得积分 这很好 Cloumn
  • R 中主成分载荷的置信区间

    我使用以下代码使用 R 中的 prcomp 函数对 iris 数据集的前 4 列进行主成分分析 gt prcomp iris 1 4 Standard deviations 1 2 0562689 0 4926162 0 2796596 0
  • 使用 PCA 时出现数学域错误

    我正在使用 python 的 scikit learn 包来实现 PCA 我正在学习数学 domain error C Users Akshenndra Anaconda2 lib site packages sklearn decompo
  • Weka 的主成分分析

    我刚刚在训练集上计算了 PCA Weka 返回了新属性及其选择和计算方式 现在 我想使用这些数据构建一个模型 然后在测试集上使用该模型 不知道有没有办法根据新的属性类型自动修改测试集 您是否需要主成分进行分析或仅将其输入分类器 如果不是 只
  • 在 ggplot2 示例中绘制来自 vegan 的 ordiellipse 不起作用

    我正在尝试在 ggplot 中绘制一个带有椭圆体的 pca 双图 我在中找到了一个例子这个线程在这里 https stackoverflow com questions 13794419 plotting ordiellipse funct
  • sklearn多类SVM函数

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

    我有显示两个子图的代码 graph rankdir LR subgraph cluster01 label t 0 a0 label A a1 label B a2 label C a5 label E a0 a1 a1 a2 a2 a0
  • 如何在 500,000 个点的 100 维空间中找到最近的 2 个点?

    我有一个 100 维空间中有 500 000 个点的数据库 我想找到最接近的 2 个点 我该怎么做 更新 空间是欧几里得的 抱歉 并感谢所有的答案 顺便说一句 这不是家庭作业 里面有一章算法简介 http en wikipedia org
  • PySpark 中的 PCA 分析

    看着http spark apache org docs latest mllib Dimensionality reduction html http spark apache org docs latest mllib dimensio
  • PySpark PCA:避免 NotConvergedException

    我试图通过 ml linalg 方法使用 PCA 来减少广泛的数据集 51 个特征 约 1300 个个体 如下所示 1 将我的列命名为一个列表 features indi prep df select c for c in indi pre
  • mysql 中的 Rank() 优于 Partition by

    我完全困惑于在mysql中从rank over partition by x order by y desc 创建一个新列 LoginRank 在sql server中 我将编写以下查询 以创建一个按 login 分组并按 id 排序的列
  • 获取矩阵条目的排名?

    假设一个矩阵 gt a lt matrix c 100 90 80 20 2 2 gt a 1 2 1 100 80 2 90 20 假设我想将矩阵的元素转换为等级 gt rank a lt rank a gt rank a 1 4 3 2
  • 部分拟合是否在 sklearn.decomposition.IncrementalPCA 中并行运行?

    我已经关注了伊马诺 卢恩戈 https stackoverflow com users 764322 imanol luengo s answer https stackoverflow com a 44335148 10183880建立部
  • 从sklearn PCA获取特征值和向量

    如何获取 PCA 应用程序的特征值和特征向量 from sklearn decomposition import PCA clf PCA 0 98 whiten True converse 98 variance X train clf f

随机推荐