GraphX ​​или GraphFrame - обнаружение сообщества в неориентированном взвешенном графе - PullRequest
3 голосов
/ 07 мая 2020

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

Проблема является частью более широкого решения Databricks, поэтому Spark GraphX ​​и GraphFrames являются первым выбором для ее решения.

Как вы можете видеть из прикрепленного рисунка, мне нужно найти вершину «X» как точку, где можно разделить большую непрерывную группу, идентифицированную подключенными алгоритмами componect (val result = g.connectedComponents.run ())

Метод сильно связанных компонентов (только для ориентированного графа), подсчет треугольников или алгоритмы определения сообщества LPA не подходят, даже если все веса одинаковы, например 1.

Картинка с точкой, где должна быть вырезать большую группу ST0

Подобное logi c хорошо описано в вопросе « Вырезать взвешенный неориентированный связанный граф », но только как математическое выражение.

Спасибо за подсказку.

// Vertex DataFrame
val v = sqlContext.createDataFrame(List( 
  (1L, "A-1", 1),       // "St-1"
  (2L, "B-1", 1),
  (3L, "C-1", 1),
  (4L, "D-1", 1),

  (5L, "G-2", 1),      // "St-2"
  (6L, "H-2", 1),
  (7L, "I-2", 1),
  (8L, "J-2", 1),  
  (9L, "K-2", 1),

  (10L, "E-3", 1),     // St-3
  (11L, "F-3", 1),
  (12L, "Z-3", 1),

  (13L, "X-0", 1)      // split point
)).toDF("id", "name", "myGrp")

// Edge DataFrame
val e = sqlContext.createDataFrame(List( 
  (1L, 2L, 1),
  (1L, 3L, 1),
  (1L, 4L, 1),
  (1L, 13L, 5),  // critical edge
  (2L, 4L, 1),

  (5L, 6L, 1),
  (5L, 7L, 1),
  (5L, 13L, 7),   // critical edge
  (6L, 9L, 1),    
  (6L, 8L, 1),  
  (7L, 8L, 1),   

  (12L, 10L, 1),
  (12L, 11L, 1),
  (12L, 13L, 9),  // critical edge
  (10L, 11L, 1)
)).toDF("src", "dst", "relationship")

val g = GraphFrame(v, e)

1 Ответ

1 голос
/ 19 июня 2020

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

Насколько я знаю, GraphFrame не имеет не центральности по промежуточности и ее кратчайшего Путь просто указывает количество обручей между вершинами без перечисления фактического пути. Использование метода bfs (поиск в ширину) может дать нам разумное приближение (примечание: bfs также не отражает расстояние / длину ребра; он также обрабатывает каждый график как указано):

  • Убедитесь, что каждая вершина определяется в обоих направлениях, чтобы bfs обрабатывать граф как неориентированный
  • Объявить изменяемую структуру (например, ArrayBuffer) pathMembers со следующими полями [fromId, toId, pathId, vertexId]
  • Для каждой вершины o в вашем graph g.vertices (внешний l oop)
    • Для каждой вершины i в вашем графике g.vertices.filter($"id" < lit(o.id)) (внутренний l oop - смотрит только на i.id, меньший, чем o.id, потому что shorttestPath (o .id, i.id) точно так же, как shortPath (i.id, o.id) в неориентированном графе)
      • apply val paths = g.bfs.fromExpr("id = " + o.id).toExpr("id = " + i.id).run()
      • transpose paths для сохранения всех вершин в путь для каждого пути и сохраните их в pathMembers
  • Подсчитайте, сколько раз каждый vertexId присутствовал в каждом fromId, toId пути (т.е. vertexId количество, разделенное на pathId количество для каждой fromId, toId пары)
  • Суммируйте расчет для каждой * 1 045 *, чтобы получить меру центральности между

Вершина «X» для схемы получит максимальное значение. Значение для вершин, непосредственно связанных с «X», упадет. Различие будет большим, если большинство групп, связанных крестом "X", имеют сопоставимый размер.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...