Mam plik CSV z 4 milionami krawędzi ukierunkowanej sieci reprezentującej osoby komunikujące się ze sobą (np. John wysyła wiadomość do Mary, Mary wysyła wiadomość do Ann, John wysyła inną wiadomość do Mary itp.). Chciałbym zrobić dwie rzeczy:
Znajdź stopnie, miary między (a może) centralność wektora własnego dla każdej osoby.
Uzyskaj wizualizację sieci.
Chciałbym to zrobić w wierszu polecenia na serwerze Linux, ponieważ mój laptop nie ma dużej mocy. Mam zainstalowany R na tym serwerze i bibliotece statnet. Znalazłem ten post w 2009 roku kogoś bardziej kompetentnego ode mnie, próbującego zrobić to samo i mającego z tym problemy. Zastanawiałem się więc, czy ktokolwiek ma jakieś wskazówki, jak to zrobić, najlepiej krok po kroku, ponieważ wiem tylko, jak załadować plik CSV i nic więcej.
Aby dać Ci wyobrażenie, tak wygląda mój plik CSV:
$ head comments.csv
"src","dest"
"6493","139"
"406705","369798"
$ wc -l comments.csv
4210369 comments.csv
Odpowiedzi:
To, co masz, to lista brzegowa, którą można przekształcić w obiekt sieciowy za pomocą biblioteki sieciowej. Oto przykład wykorzystujący fikcyjne dane.
Jednak ostrzeżenie jest w porządku: masz bardzo dużą sieć i nie jestem pewien, czy fabuła będzie tak pouczająca. Prawdopodobnie będzie to wyglądać jak duża kula przędzy. Nie jestem również pewien, jak dobrze te biblioteki radzą sobie z tak dużymi zestawami danych. Proponuję zapoznać się z dokumentacją bibliotek sieciowych, statnet i ergm. Journal of Statistical Software (V24 / 3) oferuje kilka artykułów dotyczących tych bibliotek. Problem można znaleźć tutaj:
http://www.jstatsoft.org/v24
źródło
src
idst
. Tak zazwyczaj robię, aby załadować plik (teraz plik rozdzielany tabulatorami):el <- read.csv("comment-net/comments-ouids.tsv",header=T,sep="\t")
statnet
rodziny bibliotek w nieukierunkowanej sieci złożonej z ponad 3500 węzłów (~ 8 milionów możliwych krawędzi). Było to całkiem wykonalne, zwłaszcza gdy celem było po prostu obliczenie statystyk sieciowych. Oszacowałem nawet ERGM w sieciach tej wielkości. Ale twój punkt widzenia jest słuszny; Wątpię, czy sieci milionów węzłów można łatwo przeanalizować.Nie sądzę, że R jest tutaj pierwszym wyborem (może się mylę). Będziesz potrzebował tutaj ogromnych tablic, aby zindeksować i przygotować pliki sieciowe w odpowiednim formacie danych. Przede wszystkim spróbuję użyć biblioteki SNAP Jure'a (Rob wspomniał o nim w powyższym poście) ; jest napisany w C ++ i działa bardzo dobrze w dużych sieciach.
źródło
centrality.cpp
zTUNGraph
naTNEGraph
(patrz pastebin.com/GHUquJvT linia 24). To się już nie kompiluje. Podejrzewam, że wymaga innego typu węzła? Występuje błąd:centrality.cpp:24: error: conversion from ‘TUNGraph::TNodeI’ to non-scalar type ‘TNEGraph::TNodeI’ requested
(zobacz pełny błąd na pastebin.com/86mCbByG )Gephi ( http://gephi.org/ ) może być łatwym sposobem na eksplorację danych. Prawie na pewno możesz to zwizualizować i wykonać pewne obliczenia (chociaż nie używałem go od jakiegoś czasu, więc nie pamiętam wszystkich funkcji).
źródło
Na podstawie dotychczasowych doświadczeń z siecią 7 milionów węzłów, myślę, że wizualizacja całej sieci da niezrozumiały obraz. Mogę zasugerować różne wizualizacje przy użyciu podzbiorów danych, takich jak użycie 10 najlepszych węzłów z największą liczbą linków przychodzących lub wychodzących. Drugą sugestię celeniusa dotyczącą używania gephi.
źródło
Jeśli martwisz się rozmiarem sieci, możesz wypróbować
igraph
pakiet w R. A jeśli działa on słabo w R, może działać lepiej jako moduł Pythona. Lub nawetnetworkx
pakiet dla Pythonaźródło
Czy podejrzewasz, że sieć ma niewielką liczbę bardzo dużych podłączonych komponentów? Jeśli nie, możesz go rozłożyć na odrębne komponenty, co znacznie ułatwi obliczenie miar centralności.
źródło
Można użyć kilku pakietów oprogramowania R, w tym „sna” i „sieć”. Jedną z rzeczy, nie koniecznie polegać na, jeśli masz problemy z wydajnością z SNA jest NetworkX. Uwielbiam NetworkX na śmierć i używam go do większości moich analiz, ale NetworkX jest dumny z tego, że jest implementacją czysto pytonową. Nie wykorzystuje szczególnie dobrze szybkiego, wstępnie skompilowanego kodu, a sna często znacznie wyprzedza NetworkX.
źródło