Я работаю над алгоритмом обнаружения сообщества, который использует концепцию распространения меток на узлы. У меня проблема с выбором истинного типа для переменной Label_counter
.
у нас есть алгоритм с именем LPA(label propagation algorithm)
, который распространяет метки на узлы посредством итераций. воспринимайте ярлыки как свойство узла. начальная метка для каждого узла - это идентификатор узла, и в итерациях узлы обновляют свою новую метку на основе самой частой метки среди своих соседей. алгоритм, над которым я работаю, похож на LPA. сначала каждый узел имеет начальную метку, равную 0, а затем узлы получают новые метки. когда узлы обновляются и получают новые метки, в зависимости от некоторых условий Label_counter
следует увеличивать на единицу, чтобы использовать это значение в качестве метки для других узлов. например label = 1 или label = 2 и так далее. например, у нас есть набор данных клуба zachary karate, в котором 34 узла, а в наборе данных 2 сообщества. начальное состояние такое:
(1,0)
(2,0)
.
.
.
(34,0)
первое число - это идентификатор узла, второе - метка. по мере того, как узлы получают новую метку, Label_counter
приращения, а другие узлы в следующих итерациях получают новую метку и снова Label_counter
приращения.
(1,1)
(2,1)
(3,1)
.
.
.
(33,3)
(34,3)
узлы с одинаковой меткой принадлежат одному сообществу.
у меня есть проблема: поскольку узлы в RDD и переменные распределены по машинам (каждая машина имеет копию переменных), а исполнители не имеют связи друг с другом, если исполнитель обновляет Label_counter
, другие исполнители не будут проинформированы о новых значение Label_counter
и, возможно, узлы получат неправильные метки. Верно ли использовать Accumulator
в качестве счетчика меток в этом случае, потому что аккумуляторы являются общими переменными на разных машинах, или есть другие способы решения этой проблемы ???