5 Stimmen

Python: Äquivalent zu Matlab's svds(A, k) für große Arrays?

Ich versuche, etwas Code von Matlab nach Python zu portieren, und ich bin auf ein Problem gestoßen. Ich kann anscheinend kein Äquivalent zu svds finden.

Ich habe versucht, mit numpy.corrcoef und dann numpy.linalg.eig, aber numpy.corrcoef funktioniert nicht für große Arrays (sagen wir 500 x 20000).

Hier ist der Code in Matlab, falls es einen Unterschied macht:

s = size(data, 2)
mean = sum(data, 2)/s
m_data = ( data - repmat(mean, 1, s) ) / sqrt(s - 1)
[res_u,res_s] = svds(m_data, s)
eigenvals = diag(res_s).^2
eigenvecs = res_u

3voto

eat Punkte 7340

Was Sie also suchen, wäre etwas wie dieses in python y numpy (Ich habe mir die Freiheit genommen, den Text nicht "direkt zu übersetzen". matlab -Code zu python y numpy Stattdessen habe ich es ein wenig umgestaltet, damit es sich mehr anfühlt. pythonic [Natürlich kann eine ganz ähnliche Umstrukturierung auch auf die matlab -Code auch]):

import numpy as np

def _cas(D):
    """Center at mean and standardize."""
    return (D- D.mean(1)[:, None])/ (D.shape[1]- 1)** .5

def example(D):
    """Eigenvalues and -vectors, based on SVD."""
    u, s, v= np.linalg.svd(D, full_matrices= False);
    return np.diag(s)** 2, u

if __name__ == '__main__':
    data= np.random.rand(5, 20)
    data= _cas(data) # preprocess data according to your requirements
    eigenvals, eigenvecs= example(data)
    print eigenvals
    print eigenvecs

Aber Sie haben ein Leistungsproblem damit?

Können Sie jetzt genauer sagen, wie hoch Ihre derzeitige Leistung ist und inwieweit Sie wirklich erwarten, dass sie verbessert werden sollte? FTIW in meinem bescheidenen Computer, eine zufällige (500, 20000) Matrix wird die Ausführung von example(.) etwa 20 Sek.

Ich kann (dank grundlegender linearer Algebra) die Ausführungszeit trivialerweise auf etwa 2,5 Sekunden reduzieren (eine fast 10-fache Verbesserung)! Wenn Sie nun eine viel bessere Leistung als diese suchen, dann erläutern Sie bitte sehr viel detaillierter die "Natur" Ihrer data !

Woher stammen Ihre Daten? Was ist Ihr spezieller Fall, in dem Sie die berechneten Eigenwerte und -vektoren verwenden wollen, d.h. was ist Ihr Hauptziel, das Sie erreichen wollen?

2voto

chairmanK Punkte 91

Wenn Ihre Matrix spärlich ist, können Sie Folgendes verwenden scipy.sparse.linalg.svds in einer aktuellen Scipy-Distribution. Es wickelt die Sparse SVD-Routine in ARPACK ein. Meiner Erfahrung nach ist sie fehlerhaft (ich bin mir nicht sicher, ob dies die Schuld von scipy oder ARPACK ist), daher empfehle ich, Tests durchzuführen, um zu prüfen, ob die Singulärwerte wie erwartet sind.

Wenn Ihre Matrix dicht ist, ist 500 mal 20000 groß, aber auf einem handelsüblichen Desktop heutzutage nicht unlösbar. Sie sind aufrufen numpy.linalg.svd con full_matrices=False richtig?

Was verwenden Sie numpy.corrcoef für? In dem von Ihnen geposteten MATLAB-Codefragment ist nichts dergleichen zu finden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X