我正在处理神经影像数据,由于数据量很大,我想在我的代码中使用稀疏矩阵(scipy.sparse.lil_matrix或csr_matrix)。
特别是,我需要计算矩阵的伪逆来解决最小二乘问题。我找到了sparse.lsqr方法,但效率不高。有没有一种方法可以计算Moore-Penrose伪逆(对应于普通矩阵的pinv)。
我的矩阵A的大小约为600,000 x 2000,在矩阵的每一行中,我将有从0到4个非零值。矩阵A的大小由体素x纤维束(白质纤维束)给出,我们预计最多有4个束穿过一个体素。在大多数白质体素中,我们预计至少有1个束,但我会说大约20%的线可能为零。
向量b不应该是稀疏的,实际上b包含每个体素的测量值,通常不为零。
我需要最小化误差,但向量x也有一些条件。当我在较小的矩阵上尝试模型时,我从未需要限制系统以满足这些条件(通常为0)。
这有帮助吗?有没有办法避免取A的伪逆?
谢谢
更新6月1日: 再次感谢您的帮助。 我无法展示关于我的数据的任何内容,因为Python代码给我带来了一些问题。然而,为了了解如何选择一个好的k,我尝试在Matlab中创建了一个测试函数。
代码如下:
你有没有想过k应该与F的大小相比如何?我已经尝试了250(超过1000),但结果并不令人满意(等待时间可接受,但不短)。 现在我可以将结果与已知解进行比较,但通常应该如何选择k呢? 我还附上了250个单值及其标准化平方的绘图。我不知道如何在matlab中更好地绘制screeplot。我现在正在尝试更大的k值,看看值是否会突然变小。
特别是,我需要计算矩阵的伪逆来解决最小二乘问题。我找到了sparse.lsqr方法,但效率不高。有没有一种方法可以计算Moore-Penrose伪逆(对应于普通矩阵的pinv)。
我的矩阵A的大小约为600,000 x 2000,在矩阵的每一行中,我将有从0到4个非零值。矩阵A的大小由体素x纤维束(白质纤维束)给出,我们预计最多有4个束穿过一个体素。在大多数白质体素中,我们预计至少有1个束,但我会说大约20%的线可能为零。
向量b不应该是稀疏的,实际上b包含每个体素的测量值,通常不为零。
我需要最小化误差,但向量x也有一些条件。当我在较小的矩阵上尝试模型时,我从未需要限制系统以满足这些条件(通常为0)。
这有帮助吗?有没有办法避免取A的伪逆?
谢谢
更新6月1日: 再次感谢您的帮助。 我无法展示关于我的数据的任何内容,因为Python代码给我带来了一些问题。然而,为了了解如何选择一个好的k,我尝试在Matlab中创建了一个测试函数。
代码如下:
F=zeros(100000,1000);
for k=1:150000
p=rand(1);
a=0;
b=0;
while a<=0 || b<=0
a=random('Binomial',100000,p);
b=random('Binomial',1000,p);
end
F(a,b)=rand(1);
end
solution=repmat([0.5,0.5,0.8,0.7,0.9,0.4,0.7,0.7,0.9,0.6],1,100);
size(solution)
solution=solution';
measure=F*solution;
%check=pinvF*measure;
k=250;
F=sparse(F);
[U,S,V]=svds(F,k);
s=svds(F,k);
plot(s)
max(max(U*S*V'-F))
for s=1:k
if S(s,s)~=0
S(s,s)=1/S(s,s);
end
end
inv=V*S'*U';
inv*measure
max(inv*measure-solution)
你有没有想过k应该与F的大小相比如何?我已经尝试了250(超过1000),但结果并不令人满意(等待时间可接受,但不短)。 现在我可以将结果与已知解进行比较,但通常应该如何选择k呢? 我还附上了250个单值及其标准化平方的绘图。我不知道如何在matlab中更好地绘制screeplot。我现在正在尝试更大的k值,看看值是否会突然变小。
再次感谢, Jennifer