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

questionAnswers(2)

yourAnswerToTheQuestion