Алгоритм Кластеризации Маркова
Я работал через следующий пример деталей алгоритма кластеризации Маркова:
http://www.cs.ucsb.edu/~xyan/classes/CS595D-2009winter/MCL_Presentation2.pdf
Я чувствую, что я точно представил алгоритм, но я не получаю те же результаты, что и это руководство, по крайней мере, для этого ввода.
текущий код в: http://jsfiddle.net/methodin/CtGJ9/
Я не уверен, что, возможно, я просто пропустил небольшой факт или просто нужна небольшая настройка где-то для этого, но я попробовал несколько вариантов, включая:
- замена инфляции / расширения
- проверка равенства на основе точности
- удаление нормализации (так как оригинальное руководство не требовало этого, хотя в официальной документации MCL говорится о нормализации матрицы на каждом проходе)
все они возвращены тот же результат - узел влияет только на себя.
Я даже нашел аналогичную реализацию алгоритма в VB: http://mcl.codeplex.com/SourceControl/changeset/changes/17748#MCL%2fMCL%2fMatrix.vb
и мой код, похоже, совпадает с исключением их нумерации (например, 600 - расстояние).
Это функция расширения
// 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;
}; 
и это функция инфляции
// 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);
};
и, наконец, основная функция пропускания
// 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;
};
2 ответов
ваша реализация-это правильно. Пример просто неправильный.
три матрицы результатов на слайде" повторить шаги 5 и 6 до достижения устойчивого состояния (сходимости) " являются результатами только выполнения инфляции.
чтобы прояснить некоторые моменты об алгоритме.
- расширение затем инфляция.
- точность является важным фактором. Уравнения никогда не приведут к сходимости математически. Его ограниченная точность операции с плавающей запятой на процессорах, которые заставляют некоторые элементы в матрице становиться нулем, а не бесконечно малыми числами. Фактически официальная реализация использует значение отсечки для устранения определенного количества элементов в столбце, чтобы ускорить сходимость и улучшить временную сложность алгоритма. В оригинальной диссертации автор проанализировал эффект этого и пришел к выводу, что отсечка дает на практике такой же результат, как и незначительное повышение инфляции параметр.
- нормализация является неотъемлемой частью шага инфляции, прочитайте уравнение в этом руководстве еще раз.
относительно вашего кода.
- массив.slice создает мелкую копию, но это не важно в вашем случае, так как вы создаете новый массив в matrixExpand.
- ваша реализация matrixExpand игнорирует переменную pow и всегда делает мощность 2.
результат, где есть все в первом строки, которая интерпретируется как все элементы находятся в одном кластере.
использование currentMatrix.срез для клонирования матрицы выглядит подозрительно. Это поверхностный клон, и так как вы мутируете, это может вызвать проблемы.
использование раунда также выглядит немного странно, так как нет упоминания о округлении как части шага нормализации в этой презентации powerpoint.
