как реализовать вычисление собственного значения с помощью MapReduce/Hadoop?

Это возможно, потому что PageRank был формой собственного значения, и именно поэтому был введен MapReduce. Но, кажется, есть проблемы в реальной реализации, например, каждый подчиненный компьютер должен поддерживать копию матрицы?


person Community    schedule 23.12.2008    source источник
comment
Для MapReduce вам нужен алгоритм «разделяй и властвуй». Взгляните на en.wikipedia.org/wiki/Divide-and-conquer_eigenvalue_algorithm   -  person Thomas Ahle    schedule 09.06.2012


Ответы (5)


PageRank решает проблему доминирующего собственного вектора, итеративно находя стационарное состояние дискретного потока в сети.

Если матрица NxM A описывает вес звена (объем потока) от узла n к узлу m, то

p_{n+1} = A . p_{n} 

В пределе, когда p сходится к устойчивому состоянию (p_n+1 = p_n), это задача на собственные вектора с собственным значением 1.

Алгоритм PageRank не требует хранения матрицы в памяти, но неэффективен на плотных (не разреженных) матрицах. Для плотных матриц MapReduce является неправильным решением — вам нужна локальность и широкий обмен между узлами — и вместо этого вам следует обратить внимание на LaPACK, MPI и им подобных.

Вы можете увидеть работающую реализацию рейтинга страниц в библиотеке wukong (потоковая передача hadoop для ruby) или в подмодуле рейтинга страниц Heretrix. (Код Heretrix работает независимо от Heretrix)

(отказ от ответственности: я автор wukong.)

person mrflip    schedule 21.04.2009

ПРЕАМБУЛА:

При правильной секвестрации данных можно добиться результатов параллельных вычислений без полного набора данных на каждой машине.

Возьмем, к примеру, следующий цикл:

for (int i = 0; i < m[].length; i++)
{
    for (int j = 0; j < m[i].length; j++)
    {
        m[i][j]++; 
    }
}

И дана матрица следующего вида:

       j=0   j=1   j=2
 i=0  [   ] [   ] [   ]
 i=1  [   ] [   ] [   ]
 i=2  [   ] [   ] [   ]

Параллельные конструкции существуют, так что столбец J может быть отправлен на каждый компьютер, а отдельные столбцы вычисляются параллельно. Трудная часть распараллеливания возникает, когда у вас есть циклы, содержащие зависимости.

for (int i = 0; i < m[].length; i++)
{
    for (int j = 0; j < m[i].length; j++)
    {
        //For obvious reasons, matrix index verification code removed
        m[i][j] = m[i/2][j] + m[i][j+7]; 
    }
}

Очевидно, что цикл, подобный приведенному выше, становится чрезвычайно проблематичным (обратите внимание на матричные индексаторы). Но существуют методы развертывания циклов такого типа и создания эффективных параллельных алгоритмов.

ОТВЕТ:

Возможно, Google разработал решение для вычисления собственного значения без сохранения копии матрицы на всех подчиненных компьютерах. -Или- Они использовали что-то вроде Monte Carlo или что-то другое Алгоритм приближения для разработки "достаточно точного" расчета.

На самом деле, я бы даже сказал, что Google сделает все возможное, чтобы сделать любые расчеты, необходимые для их алгоритма PageRank, максимально эффективными. Когда вы используете такие машины, как эти и это (обратите внимание на кабель Ethernet) вы можете' не передавать большие наборы данных (сотни гигабайт), потому что это невозможно, учитывая их аппаратные ограничения обычных карт NIC.

С учетом сказанного, Google умеет удивлять сообщество программистов, и их реализация может быть совершенно другой.

ОТПРАВКА:

Некоторые хорошие ресурсы для параллельных вычислений включают OpenMP и MPI. Обе параллельные реализации подходят к параллельным вычислениям с очень разных парадигм, некоторые из которых связаны с машинной реализацией (кластерные и распределенные вычисления).

person Gavin Miller    schedule 24.12.2008
comment
Вполне возможно, что собственное значение будет вычислено без сохранения копии матрицы на всех подчиненных компьютерах. ??? Как вы пришли к такому выводу? Матрицы PageRank разрежены. - person Jason S; 24.12.2008
comment
@Jason - Мой смысл и то, как я это написал, были разными. Я сделал правку на этот счет. Спасибо что подметил это. - person Gavin Miller; 26.12.2008

Я подозреваю, что это неразрешимо для большинства матриц, кроме тех, которые имеют специальные структуры (например, разреженные матрицы или матрицы с определенными шаблонами блоков). Слишком много связи между матричными коэффициентами и собственными значениями.

PageRank использует очень разреженную матрицу особой формы, и любые выводы из вычисления его собственных значений почти наверняка не распространяются на общие матрицы. (изменить: вот другая ссылка, которая выглядит интересной)

person Jason S    schedule 24.12.2008

Теперь я могу ответить себе. Алгоритм PageRank использует разреженную матрицу, где он должен сходиться по собственному значению с несколькими самоумножениями. Таким образом, в практике PageRank действует процедура Map/Reduce. Вы можете выполнить умножение матриц в процедуре Map и сформировать разреженную матрицу в процедуре Reduce. Но для общего нахождения собственного значения матрицы это все еще сложная задача.

person Community    schedule 01.01.2009

В проекте Apache hama реализована интересная реализация алгоритма собственных значений Якоби. Работает на хаупе. Обратите внимание, что вращение происходит при сканировании матрицы, а не при уменьшении карты.

person dspiteself    schedule 08.02.2010