donEnno / gamma_delta

1 stars 0 forks source link

numpy_to_graph() Performanz #5

Closed mbruhns closed 3 years ago

mbruhns commented 3 years ago

Hast du das Problem mit dem MemoryError lösen können? Mit einem naiven Networkit-Ansatz dauert die Konvertierung einer 15.000x15.000 Matrix zwar knapp 200 Sekunden, wirft dafür aber keinen Fehler:

import numpy as np
import networkit as nk

def numpy_to_graph_naive(dist_mat):
    m, _ = dist_mat.shape
    G = nk.Graph(m, weighted=True)

    mask_x, mask_y = np.mask_indices(m, np.tril, -1)
    masking_zip = zip(mask_x, mask_y, dist_mat[mask_x, mask_y])

    for nodeA, nodeB, weight in masking_zip:
        G.addEdge(nodeA, nodeB, weight)

    return G

Ich konnte in deinem Code nicht sicher nachvollziehen, welches Verhalten du von der Funktion erwartest, passt das so?

donEnno commented 3 years ago

Danke dir! Das hilft.

donEnno commented 3 years ago

Mit der Louvain Variante erhalte ich für die drei Distanzmatrizen folgendes:

BLOSUM45
-------------------  ------------
num communities           2
min community size   2250
max community size   8461
avg. community size  5355.5
modularity              0.0575446
-------------------  ------------

BLOSUM80
-------------------  ------------
# communities           3
min community size   2244
max community size   5684
avg. community size  3570.33
modularity              0.0606794
-------------------  ------------

GONNET1992
-------------------  ------------
# communities           2
min community size   2444
max community size   8267
avg. community size  5355.5
modularity              0.0481457
-------------------  ------------

Hat es einen Grund, außer Laufzeitreduktion, dass du mit mask_x, mask_y = np.mask_indices(m, np.tril, -1) nur die Dreiecksmatrix berechnest? 2 bzw. 3 Communites scheint sehr wenig zu sein und ich frage mich, ob das an der Dreiecksmatrix liegen kann?

donEnno commented 3 years ago

Hier mal die UMAPs für alle Sequenzen

ASB45 ASB80 ASG92

mbruhns commented 3 years ago

Hat es einen Grund, außer Laufzeitreduktion, dass du mit mask_x, mask_y = np.mask_indices(m, np.tril, -1) nur die Dreiecksmatrix berechnest?

Die CSV-Dateien enthalten doch sowieso nur die unteren Dreiecksmatrizen, oder? Dann erhalten wir ja keine weiteren Informationen, wenn wir die Null-Einträge einbeziehen.

2 bzw. 3 Communites scheint sehr wenig zu sein und ich frage mich, ob das an der Dreiecksmatrix liegen kann?

Schau dafür am besten in die Dokumentation der Louvain-Implementierung welches Eingabeformat erwartet wird. Bei Louvain kann man typischerweise die Distanzmetrik sowie die Anzahl der nächsten Nachbarn für den Graphen auswählen, das hat dann entsprechende Auswirkungen auf die Anzahl der Communities.

donEnno commented 3 years ago

Die CSV-Dateien enthalten doch sowieso nur die unteren Dreiecksmatrizen, oder? Dann erhalten wir ja keine weiteren Informationen, wenn wir die Null-Einträge einbeziehen.

Ich hab die großen DMs als volle Matrix laufen lassen. Gibt es np.mask_indices(m, np.tril, -1) auch für die komplette Matrix? Ich habe da leider nichts verlgeichbares finden können und habe mich deshalb mit nested for loops zufrieden gegeben, um das ganze mal gegenzuckecken.

Schau dafür am besten in die Dokumentation der Louvain-Implementierung welches Eingabeformat erwartet wird.

In der Networkit-Doku konnte ich nichts dergleichen finden. Steht nur drin, dass es einen Graphen braucht.

donEnno commented 3 years ago

Es hat jetzt mit networkx und der darauf laufenden Version des Louvain Algorithmus geklappt. Die Bilder sind in dem plots Ordner 👍