He estado trabajando a través del siguiente ejemplo de los detalles del algoritmo de Markov La agrupación:Markov algoritmo de clústeres de
http://www.cs.ucsb.edu/~xyan/classes/CS595D-2009winter/MCL_Presentation2.pdf
Siento que he representado con precisión el algoritmo, pero no estoy obteniendo los mismos resultados que esta guía, al menos, estaba recibiendo esa información.
código actual está en: http://jsfiddle.net/methodin/CtGJ9/
No estoy seguro de si tal vez he acaba de perder una pequeña hecho o sólo hay un pequeño pellizco en algún lugar para esto, pero he intentado algunas variaciones, incluyendo:
- Intercambio de la inflación/expansión
- Comprobación de la igualdad sobre la base de una precisión
- Extracción de la normalización (ya que la guía original no lo requiere, aunque el oficial d MCL estados de ocupación para normalizar la matriz en cada pasada)
Todos estos han arrojado el mismo resultado: el nodo solo influye en sí mismo.
incluso he encontrado una aplicación algoritmo similar en VB: http://mcl.codeplex.com/SourceControl/changeset/changes/17748#MCL%2fMCL%2fMatrix.vb
Y mi código parece coincidir con la excepción de su numeración (600 - distancia, por ejemplo).
Esta es la función de expansión
// 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;
};
Y esta es la función de la inflación
// 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);
};
Y, finalmente, la función principal de tránsito
// 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;
};
el enlace jsfiddle parece estar roto, ¿su implementación todavía está disponible en alguna parte? ¡Gracias! – skyork
Extraño. Me pregunto dónde fue? Aquí hay una esencia con el código: https://gist.github.com/methodin/1573728 – methodin
Aquí hay un códepen: http://codepen.io/Xeoncross/pen/NqWqWe?editors=101 – Xeoncross