从matlab中的一组向量中提取最大的线性独立向量集

时间:2015-01-12 17:02:11

标签: matlab vector

我是使用matlab的新手。我找不到从给定的一组矢量中提取线性独立矢量的最大子集的明显方法。

因此给定一组V = [v1 v2-vn]其中dim(vi)>> n(i = 1,2,3,....)我需要找到一组随机的r线性独立向量" vi" (其中r是最大的),即去除所有(n-r)线性相关的" vi"来自V的向量。抱歉,如果这是含糊不清的,但无法找到更好的说明方式。

4 个答案:

答案 0 :(得分:5)

我将假设你的向量都是n - 维度,并且我们可以将它们全部连接成一个矩阵。如果我们进入矩阵和线性代数,你要找的是矩阵的the Column Space。简而言之,列空间被定义为矩阵中的列集,可以在n维空间中唯一地生成另一个向量。或者,它是列向量的所有可能线性组合的集合。因此,如果要查找最大的线性独立向量集,您所要做的就是确定矩阵的列空间是什么。

因此,假设您的矩阵V大小为n x m,我们有m列/向量,每列的大小为n x 1(或{{ 1}}行),您可以调用rref R ow- R 导出 E chelon F < / strong> orm(RREF)命令。这会将矩阵缩小到row-reduced echelon form。这是找到矩阵的列空间的开始。你可以这样称呼它:

n

[R, RB] = rref(V); 将包含R的RREF表单,而V将包含RB的索引或列号,构成列空间 。因此,如果要生成线性独立向量,则只需执行以下操作:

R

VMax = V(:,RB); 将仅包含形成列空间的VMax列,因此只包含线性独立向量的列。如果您想确定我们拥有的多少独立向量,您只需计算我们拥有的V的值:

RB

这里有一个简单的例子来说明我的观点。假设我有这个矩阵:

r = numel(RB);

第二列/向量就是第一个向量。第三列/向量只是第一个向量加上第二个向量,或者它可以是第一个或第二个向量的两倍。无论哪种方式,这都是一个线性独立的向量,因为它是基于第一个向量。第二个向量也是如此。最后一个向量独立于其他三个,因为我们无法创建组合或缩放,可以从其他三个生成最后一个向量。如果我们打电话给>> V = [1 1 2 0; 2 2 4 9; 3 3 6 7; 4 4 8 3] V = 1 1 2 0 2 2 4 9 3 3 6 7 4 4 8 3 ,就会发生这种情况:

rref

>> [R, RB] = rref(V) R = 1 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 RB = 1 4 包含行减少的梯队形式,而R告诉我们哪些线性独立或形成RB的列空间。如您所见,只有第1列和第4列是线性独立的,这非常有意义。如果你还看一下A的最后两行,我们可以看到它们全部由零组成。这暗示了矩阵的rank,其中它只是非零的总行数(或列,取决于您正在做的事情)。这也告诉你有多少向量构成列空间。

要完成您的任务,只需执行以下操作:

R

如您所见,>> VMax = V(:,RB) VMax = 1 0 2 9 3 7 4 3 的每一列都是VMax的线性独立向量,它也构成了V的列空间。

现在,您的下一个任务是每次运行算法时从此列空间中随机选择线性独立的向量。请记住,因为有多种方法可以生成列空间,V的解决方案只会为您提供一个这样的列空间。如果我正确地解释您的问题,您希望生成随机列空间并每次选择这些向量的子集。感谢Luis Mendo(以及来自knedlsepp的温和产品),您可以做的是随机重新排列或置换列,然后在此置换矩阵上运行rref

因此,您可以这样做:

rref

randperm将生成一个随机排列数组,从1到您指定给ind = randperm(size(V,2)); Vperm = V(:,ind); [R,RB] = rref(Vperm); VMax = Vperm(:,RB); 的参数。在我们的示例中,这是矩阵randperm中的总列数。我们使用此数组随机地移动V的列,将其存储到V并运行我们之前完成的代码。通过执行此随机改组,您将输入偏向Vperm,以便强制它选择不同的基矢量,但如果您有几个线性相关的矢量,那么我们将选择一个矢量这些线性依赖向量构建我们的基础。

答案 1 :(得分:3)

这种寻找矢量空间基础的问题的天真方法类似于 Luis Mendo的。然而,与n相比,它应具有最大rank n choose r - 计算的理论最坏情况复杂度。缺点是,最好的情况将执行r rank - 计算,而不是1

这个想法很简单:

  • 计算rank的{​​{1}} r。这是您集合中的最大向量数。
  • V向量的集合定义为空。
  • 对于chosen中的每个向量V(:,k)(随机选择):
    • 如果向量V与集合V(:,k)中的向量线性无关:
      • 将其添加到所选矢量集中。
    • 如果集chosen已有chosen元素:
      • 返回r向量作为解决方案。

生成的代码如下所示:

chosen

补充说明:

当您处理稀疏矩阵时,这种方法可能是有益的,因为线性相关性的检查可以由线性系统的解决方案代替排名计算。由于排名计算涉及对function chosen = randBasis(V) % V is a matrix of column vectors % chosen are the indices of the randomly selected column vectors, % so that span(V(:,chosen)) == span(V) n = size(V,2); r = rank(V); chosen = []; currentRank = 0; for k = randperm(n) if rank(V(:, [chosen, k])) > currentRank currentRank = currentRank+1; chosen = [chosen, k]; end if currentRank==r break end end 的调用,因此相比之下它非常昂贵。尽管 rayryeng svd - 解决方案更优雅,但出于某种原因,即使对于非稀疏矩阵,这种天真的方法似乎也更快。

使用rref加速版本:

mldivide

请注意:

这些迭代方法都存在一个非显而易见的数值问题: 考虑矩阵:

function chosen = randBasis(V)
n = size(V,2);
if issparse(V)
    r = sprank(V)
else
    r = rank(V);
end
chosen = []; 
for k = randperm(n)
    if isLinearlyIndependent(V(:,chosen),V(:,k))
        chosen = [chosen, k];
    end
    if numel(chosen)==r
        break
    end
end
end

function b = isLinearlyIndependent(V, v)
    warning('off','MATLAB:singularMatrix');
    bestapprox = V\v;
    bestapprox(~isfinite(bestapprox)) = 0;
    b = ~(norm(V*bestapprox-v,'inf')<=eps*norm(V,'inf'));
    warning('on','MATLAB:singularMatrix');
end

数学上你会说这个矩阵排名第五。然而,数字上只有最后两列与其他列相比非零。这就是V = diag(10.^(-40:10:0)) V = 1e-40 0 0 0 0 0 1e-30 0 0 0 0 0 1e-20 0 0 0 0 0 1e-10 0 0 0 0 0 1e+00 给出rank(V)的原因。这种迭代方法的问题在于,向我们的集合添加线性独立向量实际上可以导致线性相关集合! 想象一下这个算法选择第一个向量。即使所有其他向量在数学上和数字上都是线性无关的,但子集2没有数字等级2,但可以通过我们的函数选择。这就是为什么这个算法只适用于类似规范的向量。

结论是:

  • 数学数学很棘手。
  • 如果你想要稳定,你必须付出计算成本的代价。
  • {V(:,1), V(:,5)}是解决此问题的方法。

答案 2 :(得分:1)

我会尝试这些方法。但它可能不会很快:

  1. 计算由向量形成的矩阵的等级。称之为 r
  2. 生成取自r
  3. 1:n个数字的所有组合
  4. 随机排序这些组合。
  5. 取第一个组合,检查该组合指示的向量是否独立(最高等级)。如果不是,请测试下一个组合。通过施工,可以确保某种组合能够成功。
  6. 代码:

    vectors = randi(3,4,3); %// example. Each vector is a row
    n = size(vectors,1);
    r = rank(vectors); %// step 1
    combs = nchoosek(1:n,r); %// step 2
    c = size(combs,1);
    combs = combs(randperm(c),:); %// step 3
    for s = 1:r %// step 4
        pick = combs(s,:);
        if rank(vectors(pick,:))==r
            break %// we're done. Now `pick` contains the selected vectors
        end
    end
    result = vectors(pick,:); %// each row is a vector
    

答案 3 :(得分:-1)

对示例的部分解决方案...抱歉,我没有注意到您的评论 &#34; 不同的线性独立集&#34; ...你的意思是&#34;不同的最大线性独立集合&#34;?我道歉我发现只有一个最大线性独立集...但使用[R, RB] = rref(M)的解决方案给出了相同的答案

+ echo ('on')
+ more ('off')
+ format ('bank')
+ M = [0, 0, 1; 0, 1, 1; 0, 1, 0]'
M =

   0.00   0.00   0.00
   0.00   1.00   1.00
   1.00   1.00   0.00

+ [U, S, V] = svd (M)
U =

   0.00   0.00  -1.00
  -0.71   0.71   0.00
  -0.71  -0.71   0.00

S =

Diagonal Matrix

   1.73      0      0
      0   1.00      0
      0      0  -0.00

V =

  -0.41  -0.71  -0.58
  -0.82   0.00   0.58
  -0.41   0.71  -0.58

+ U (:, 1:2) * S (1:2, 1:2) * V (1:2, 1:2)'
ans =

   0.00   0.00
   0.00   1.00
   1.00   1.00

来自Applications_of_the_SVD

的引用
  

对应于M的非零奇异值的左奇异向量跨越M的范围。