ho lavorato attraverso il seguente esempio dei dettagli dell'algoritmo Markov Clustering:Markov Clustering Algoritmo
http://www.cs.ucsb.edu/~xyan/classes/CS595D-2009winter/MCL_Presentation2.pdf
Mi sento come se avessi accuratamente rappresentato l'algoritmo, ma io non sto ottenendo gli stessi risultati che questa guida, almeno, stava ottenendo quell'input.
codice attuale e ': http://jsfiddle.net/methodin/CtGJ9/
Non sono sicuro se forse ho appena perso un piccolo fatto o solo bisogno di un piccolo ritocco da qualche parte per questo, ma ho provato un paio di varianti, tra cui:
- Scambiare l'inflazione/espansione
- Controllo per l'uguaglianza sulla base di una precisione
- Rimozione della normalizzazione (dal momento che la guida originale non ha richiesto, anche se la MCL d ufficiale ocumentation afferma di normalizzare la matrice su ogni passaggio)
Tutti questi hanno restituito lo stesso risultato - il nodo influenza solo se stesso.
Ho anche trovato un'implementazione algoritmo simile in VB: http://mcl.codeplex.com/SourceControl/changeset/changes/17748#MCL%2fMCL%2fMatrix.vb
E il mio codice sembra combaciare con l'eccezione di loro numerazione (600 - distanza, per esempio).
Questa è la funzione di espansione
// Take the (power)th power of the matrix effectively multiplying it with
// itself pow times
this.matrixExpand = function(matrix, pow) {
var resultMatrix = [];
for(var row=0;row<matrix.length;row++) {
resultMatrix[row] = [];
for(var col=0;col<matrix.length;col++) {
var result = 0;
for(var c=0;c<matrix.length;c++)
result += matrix[row][c] * matrix[c][col];
resultMatrix[row][col] = result;
}
}
return resultMatrix;
};
E questa è la funzione di gonfiaggio
// Applies a power of X to each item in the matrix
this.matrixInflate = function(matrix, pow) {
for(var row=0;row<matrix.length;row++)
for(var col=0;col<matrix.length;col++)
matrix[row][col] = Math.pow(matrix[row][col], pow);
};
Infine la funzione principale passante
// Girvan–Newman algorithm
this.getMarkovCluster = function(power, inflation) {
var lastMatrix = [];
var currentMatrix = this.getAssociatedMatrix();
this.print(currentMatrix);
this.normalize(currentMatrix);
currentMatrix = this.matrixExpand(currentMatrix, power);
this.matrixInflate(currentMatrix, inflation);
this.normalize(currentMatrix);
while(!this.equals(currentMatrix,lastMatrix)) {
lastMatrix = currentMatrix.slice(0);
currentMatrix = this.matrixExpand(currentMatrix, power);
this.matrixInflate(currentMatrix, inflation);
this.normalize(currentMatrix);
}
return currentMatrix;
};
il collegamento jsfiddle sembra essere rotto, la tua implementazione è ancora disponibile da qualche parte? Grazie! – skyork
Strano. Mi chiedo dove sia andata? Ecco un sommario con il codice: https://gist.github.com/methodin/1573728 – methodin
Ecco una codepen: http://codepen.io/Xeoncross/pen/NqWqWe?editors=101 – Xeoncross