我是使用matlab的新手。我找不到从给定的一组矢量中提取线性独立矢量的最大子集的明显方法。
因此给定一组V = [v1 v2-vn]其中dim(vi)>> n(i = 1,2,3,....)我需要找到一组随机的r线性独立向量" vi" (其中r是最大的),即去除所有(n-r)线性相关的" vi"来自V的向量。抱歉,如果这是含糊不清的,但无法找到更好的说明方式。
答案 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)
我会尝试这些方法。但它可能不会很快:
r
。1:n
个数字的所有组合
代码:
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
的引用
对应于M的非零奇异值的左奇异向量跨越M的范围。