pracuję poprzez następujący przykład o szczegółach algorytm klastrowania Markowa:Markowa klastrowania Algorytm
http://www.cs.ucsb.edu/~xyan/classes/CS595D-2009winter/MCL_Presentation2.pdf
czuję jakbym dokładnie reprezentuje algorytm, ale nie otrzymuję takie same wyniki że ten poradnik przynajmniej dostał dla tego wejścia.
Aktualny kod jest pod adresem: http://jsfiddle.net/methodin/CtGJ9/
Nie jestem pewien, czy może mam po prostu brakowało mały fakt, czy wystarczy mały uszczypnąć gdzieś na tym, ale próbowałem kilka odmian, w tym:
- Zamiana inflacja/Expansion
- Sprawdzanie równości opiera się na precyzyjnym
- Usuwanie normalizację (ponieważ oryginalny przewodnik nie wymagają, chociaż oficjalna MCL d Stany dokumentacji do normalizacji macierzy na każdym przejściu)
Wszystkie te elementy zwróciły ten sam wynik - węzeł wpływa tylko na siebie.
mam nawet znaleźć podobną realizację algorytmu w VB: http://mcl.codeplex.com/SourceControl/changeset/changes/17748#MCL%2fMCL%2fMatrix.vb
A mój kod wydaje się zgadzać z wyjątkiem ich numeracji (600 - odległość, na przykład).
Jest to funkcja ekspansja
// 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;
};
I to jest funkcja inflacja
// 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);
};
I wreszcie główną funkcją passthru
// 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;
};
link jsfiddle wydaje się być uszkodzony, czy twoja implementacja jest gdzieś dostępna? dzięki! – skyork
Dziwne. Zastanawiam się, gdzie poszło? Oto klucz z kodem: https://gist.github.com/methodin/1573728 – methodin
Tutaj jest codepen: http://codepen.io/Xeoncross/pen/NqWqWe?editors=101 – Xeoncross