Ich habe eine Adjazenz-Matrix eines Netzwerks und möchte den Adamic-Adar-Score berechnen. Es ist folgendermaßen definiert: Für jedes Kantenpaar x und y sei z einer ihrer gemeinsamen Nachbarn und | z | ist der Grad des Nachbarn.MATLAB: Schnelle Berechnung von Adamic-Adar Score
Jetzt wird die Punktzahl als Summe über alle gängigen Nachbarn z definiert:
this paper, page 3 Siehe zum Beispiel.
Ich habe einen kleinen Algorithmus für MATLAB geschrieben, aber es verwendet zwei for-Schleifen. Ich bin überzeugt, dass es viel schneller gemacht werden kann, aber ich weiß nicht wie. Könnten Sie bitte Wege aufzeigen, wie Sie das beschleunigen können?
% the entries of nn will always be 0 or 1, and the diagonal will always be 0
nn=[0 0 0 0 1 0; ...
0 0 0 1 1 0; ...
0 0 0 0 1 0; ...
0 1 0 0 0 1; ...
1 1 1 0 0 0; ...
0 0 0 1 0 0];
deg=sum(nn>0);
AAScore=zeros(size(nn));
for ii=1:length(nn)-1
for jj=ii+1:length(nn)
NBs=nn(ii,:).*nn(jj,:);
B=NBs.*deg;
C=B(B>1);
AAScore(ii,jj)=sum(1./log(C));
end
end
AAScore
Ich würde jeden Vorschlag, danke!
Vergleich Runtimes
Mein nn hat ~ 2% Einträge, so kann es durch angenähert werden:
kk=1500;
nn=(rand(kk)>0.98).*(1-eye(kk));
- Mein Doppel für: 37,404445 Sekunden.
- Divakars erste Lösung: 58.455826 Sekunden.
- Divakars aktualisierte Lösung: 22,333510 Sekunden.
@Divakar, ja, es wird immer nur 0s und 1s sein. (Ich bearbeite die Frage) – NicoDean
Was ist die typische Größe von 'nn'? – Divakar
Die typische Größe von nn liegt zwischen 5000x5000 oder 6000x6000. – NicoDean