pseudo inverso da matriz esparsa em python
Estou trabalhando com dados de neuroimagem e, devido à grande quantidade de dados, gostaria de usar matrizes esparsas para meu código (scipy.sparse.lil_matrix ou csr_matrix
Em particular, precisarei calcular o pseudo-inverso da minha matriz para resolver um problema do quadrado mínimo. Eu encontrei o método sparse.lsqr, mas não é muito eficiente. Existe um método para calcular o pseudo-inverso de Moore-Penrose (correspondente a pinv para matrizes normais
O tamanho da minha matriz A é de cerca de 600.000 x 2000 e em todas as linhas da matriz terei de 0 a 4 valores diferentes de zero. O tamanho da matriz A é dado pelo feixe de fibras voxel x (faixas de fibras de substância branca) e esperamos que no máximo 4 faixas sejam cruzadas em um voxel. Na maioria dos voxels de substância branca, esperamos ter pelo menos 1 trato, mas direi que cerca de 20% das linhas podem ser zero
O vetor b não deve ser esparso, na verdade b contém a medida para cada voxel, que geralmente não é zer
Eu precisaria minimizar o erro, mas também existem algumas condições no vetor x. Como tentei o modelo em matrizes menores, nunca precisei restringir o sistema para satisfazer essas condições (em geral, 0
Isso é de alguma ajuda? Existe uma maneira de evitar tomar o pseudo-inverso de A?
Obrigad
Update 1 de junho: obrigado novamente pela ajuda. Eu realmente não posso mostrar nada sobre meus dados, porque o código em python me causa alguns problemas. No entanto, para entender como eu poderia escolher um bom k, tentei criar uma função de teste no Matla
O código é o seguinte:
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)
Você tem alguma idéia do que deve ser k comparado ao tamanho de F? Eu tomei 250 (mais de 1000) e os resultados não são satisfatórios (o tempo de espera é aceitável, mas não curto). Agora também posso comparar os resultados com a solução conhecida, mas como se pode escolher k em geral? Anexei também o gráfico dos 250 valores únicos que recebo e os quadrados normalizados. Não sei exatamente como fazer um screeplot no matlab. Agora estou prosseguindo com um k maior para ver se de repente o valor será muito meno
Obrigado novamente, Jennifer