Как рассчитать показатели центральности в 4-миллионной пограничной сети, используя R?

9

У меня есть файл CSV с 4 миллионами ребер направленной сети, представляющих людей, общающихся друг с другом (например, Джон отправляет сообщение Мэри, Мэри отправляет сообщение Энн, Джон отправляет другое сообщение Мэри и т. Д.). Я хотел бы сделать две вещи:

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

  2. Получите визуализацию сети.

Я хотел бы сделать это в командной строке на сервере Linux, так как мой ноутбук не обладает большой мощностью. На этом сервере установлен R и библиотека statnet. Я нашел этот пост 2009 года, когда кто-то более компетентный, чем я, пытался сделать то же самое и столкнулся с проблемами. Так что мне было интересно, есть ли у кого-нибудь еще советы о том, как это сделать, желательно, чтобы шаг за шагом, потому что я знаю только, как загрузить файл CSV и ничего больше.

Просто чтобы дать вам представление, вот как выглядит мой CSV-файл:

$ head comments.csv
    "src","dest"
    "6493","139"
    "406705","369798"
$ wc -l comments.csv 
4210369 comments.csv
АМГ
источник
для некоторых из этих мер то, сможет ли R справиться с этим или заметить, будет зависеть от того, сколько отдельных людей (узлов) имеет сеть. R не обязательно может быть лучшим инструментом для вычислительных аспектов. Есть парень с фамилией Лесковец, который раньше был в Карнеги-Меллоне - я думаю, как студент - который сделал много вещей с описательной статистикой на больших графиках. Существует множество утилит для «визуализации» графиков, но в основном я обнаружил, что их довольно сложно интерпретировать или из чего они имеют смысл. График только распределения степеней может быть первым началом.
кардинал
Даже составление 4 миллионов точек может занять некоторое время ...
Вок
@ Воу, нет. Кусок пирога на современных компьютерах. В любом случае, вы всегда можете сначала выполнить дамп в PNG, и этого вполне достаточно для распределения степеней. График ОП на самом деле не такой уж большой.
кардинал

Ответы:

7

У вас есть список границ, который можно преобразовать в сетевой объект с помощью сетевой библиотеки. Вот пример использования фиктивных данных.

library(network)

src <- c("A", "B", "C", "D", "E", "B", "A", "F")
dst <- c("B", "E", "A", "B", "B", "A", "F", "A")

edges <- cbind(src, dst)
Net <- as.network(edges, matrix.type = "edgelist")

summary(Net)
plot(Net)

Тем не менее, предупреждение в порядке: у вас очень большая сеть, и я не уверен, что сюжет будет настолько информативным. Это, вероятно, будет выглядеть как большой клубок пряжи. Я также не уверен, насколько хорошо эти библиотеки справляются с такими большими наборами данных. Я предлагаю вам взглянуть на документацию по сетевым, статнетным и эргм библиотекам. Журнал статистического программного обеспечения (V24 / 3) предлагает несколько статей , охватывающих эти библиотеки. Вопрос можно найти здесь:

http://www.jstatsoft.org/v24

Джейсон Морган
источник
1
Я смутно помню карту мира сети Facebook, которая была сделана в R. Я думаю, что автор описал его процесс в своем блоге более подробно. Я полагаю, что при использовании этого подхода будет сгенерирована информативная карта даже с 4 миллионами узлов.
Ау Йессен
Извиняюсь за наивный вопрос, но как мне преобразовать таблицу в то, что у вас есть srcи dst. Это то, что я обычно делаю, чтобы загрузить файл (теперь файл с разделителями табуляции): el <- read.csv("comment-net/comments-ouids.tsv",header=T,sep="\t")
amh
read.csv () должен создать data.frame. as.network () может прочитать это напрямую или вам может потребоваться сделать as.matrix (el).
Джейсон Морган
Я довольно скептически отношусь к тому, что эти библиотеки могут многое сделать с графиком миллионов узлов. Вы действительно использовали их с сопоставимыми наборами данных?
Сабольч
Плакат имел в виду сеть с 4 миллионами ребер , а не узлов. Я использовал statnetсемейство библиотек в ненаправленной сети из более чем 3500 узлов (~ 8 миллионов возможных ребер). Это было вполне выполнимо, особенно когда целью было просто рассчитать статистику сети. Я даже оценил ERGM в сетях такого размера. Но ваша точка зрения хорошо принята; Я сомневаюсь, что сети миллионов узлов могут быть легко проанализированы.
Джейсон Морган
3

Я не думаю, что R является первым выбором здесь (может быть, я ошибаюсь). Здесь вам понадобятся огромные массивы для индексации и подготовки файлов вашей сети в соответствующем формате данных. Прежде всего, я попытаюсь использовать библиотеку SNAP Юре (Роб упоминает его в посте выше) ; он написан на C ++ и очень хорошо работает в больших сетях.

Andrej
источник
Спасибо за упоминание SNAP. Я смотрю на это. Вы использовали это? Образец центральности, который идет с ним, кажется близким к тому, что я хочу. Я попытался изменить его, чтобы он работал с данными моего многонаправленного графа, но он не смог скомпилироваться. Я не уверен , если это уместно задать вопрос об этом здесь, так что я мог бы создать новую Q.
АМГ
1
@andresmh, вы могли бы попытаться уменьшить свой график, чтобы сначала иметь одно наблюдение для каждой направленной пары. Что касается собственных значений, ваши данные, вероятно, похожи или эквивалентны взвешенному случайному блужданию на графике. Я не уверен, поддерживает ли это SNAP, но, скорее всего, так и будет. Если ничего не помогает, вы можете отправить очень конкретное электронное письмо Jure. Он очень хороший парень, поэтому я не удивлюсь, если он предоставит быстрое руководство.
кардинал
@cardinal: Я нашел пример кода в SNAP, который делает именно то, что я хочу, но для неориентированного графа. Я думаю, что мой график - это то, что в документах SNAP называется «направленный мультиграф». Поэтому я изменил только одну строку centrality.cppс TUNGraphна TNEGraph(см. Pastebin.com/GHUquJvT строка 24). Это больше не компилируется. Я подозреваю, что это требует другого типа узла? Я получаю centrality.cpp:24: error: conversion from ‘TUNGraph::TNodeI’ to non-scalar type ‘TNEGraph::TNodeI’ requested
следующую
3

Gephi ( http://gephi.org/ ) может быть простым способом изучения данных. Вы почти наверняка можете визуализировать это и выполнить некоторые вычисления (хотя я не использовал это в течение некоторого времени, поэтому я не могу вспомнить все функции).

celenius
источник
3

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

Зубин
источник
@andresmh, Maslov и Sneppen ( Science , 2002) имеют визуализацию, которая может быть полезна в этом контексте. Просматривая недавние ссылки на эту статистику, связанные с stats / comp-sci, я также нашел это . Здесь может быть другая связанная работа.
кардинал
1

Если вас интересует размер сети, вы можете попробовать igraphпакет в R. И если он плохо работает внутри R, он может работать лучше как модуль Python. Или даже networkxпакет для Python

fioghual
источник
1

Вы подозреваете, что в сети имеется небольшое количество очень больших подключенных компонентов? Если нет, вы можете разложить его на отдельные компоненты, что значительно облегчит вычисление показателей центральности.

Майкл Бишоп
источник
+1 к этому - если это полностью связанный компонент, это одно, но если вы можете разложить сеть, у вас будут как меньшие данные, так и фактически несколько независимых сетей, которые можно анализировать параллельно.
Fomite
1

Можно использовать несколько программных пакетов R, включая «sna» и «network». NetworkX - это то, на что я не обязательно буду полагаться, если у вас проблемы с производительностью в sna. Я до смерти люблю NetworkX и использую его для большей части моего анализа, но NetworkX довольно горд тем, что является в основном чисто Pythonic реализацией. Он не особенно хорошо использует быстрый предварительно скомпилированный код, и sna часто значительно опережает NetworkX.

фомиты
источник