Làm thế nào để tính toán các biện pháp trung tâm trong mạng 4 triệu cạnh bằng R?


9

Tôi có một tệp CSV với 4 triệu cạnh của một mạng được định hướng đại diện cho những người giao tiếp với nhau (ví dụ: John gửi tin nhắn cho Mary, Mary gửi tin nhắn cho Ann, John gửi một tin nhắn khác cho Mary, v.v.). Tôi muốn làm hai điều:

  1. Tìm mức độ, giữa và (có thể) các biện pháp trung tâm eigenvector cho mỗi người.

  2. Nhận một hình dung của mạng.

Tôi muốn làm điều này trên dòng lệnh trên máy chủ Linux vì máy tính xách tay của tôi không có nhiều năng lượng. Tôi đã cài đặt R trên máy chủ đó và thư viện statnet. Tôi tìm thấy bài đăng năm 2009 này của một người có thẩm quyền hơn tôi đang cố gắng làm điều tương tự và có vấn đề với nó. Vì vậy, tôi đã tự hỏi nếu có ai khác có bất kỳ gợi ý về cách làm điều này, tốt nhất là đưa tôi từng bước vì tôi chỉ biết cách tải tệp CSV và không có gì khác.

Chỉ cần cung cấp cho bạn một ý tưởng, đây là cách tệp CSV của tôi trông như sau:

$ head comments.csv
    "src","dest"
    "6493","139"
    "406705","369798"
$ wc -l comments.csv 
4210369 comments.csv

đối với một số biện pháp này, liệu R có thể xử lý hay không, tùy thuộc vào số lượng người (nút) riêng biệt mà mạng có. R có thể không nhất thiết là công cụ tốt nhất cho các khía cạnh tính toán. Có một anh chàng có tên cuối cùng là Leskovec, người đã từng ở Carnegie Mellon --- Tôi nghĩ là một sinh viên --- đã làm rất nhiều thứ với các số liệu thống kê mô tả trên các biểu đồ lớn. Có rất nhiều tiện ích ngoài kia để "trực quan hóa" đồ thị, nhưng chủ yếu là tôi thấy chúng khá khó để giải thích hoặc có ý nghĩa nhiều. Chỉ vẽ đồ thị phân phối độ có thể là một khởi đầu đầu tiên.
Đức hồng y

Ngay cả âm mưu 4 triệu điểm cũng có thể mất một lúc ...
Chảo

@wok, không. Miếng bánh trên máy tính ngày nay. Dù sao, bạn luôn có thể chuyển sang PNG trước và điều đó có thể đủ tốt để phân phối độ. Đồ thị của OP thực sự không lớn lắm.
Đức hồng y

Câu trả lời:


7

Những gì bạn có là một danh sách cạnh, có thể được chuyển đổi thành một đối tượng mạng bằng thư viện mạng. Dưới đây là một ví dụ sử dụng dữ liệu hư cấu.

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)

Tuy nhiên, một cảnh báo là theo thứ tự: bạn có một mạng lưới rất lớn và tôi không chắc chắn một âm mưu sẽ là tất cả những thông tin đó. Nó có thể sẽ trông giống như một quả bóng sợi lớn. Tôi cũng không chắc các thư viện này xử lý tốt như thế nào với các bộ dữ liệu lớn như vậy. Tôi đề nghị bạn xem tài liệu về các thư viện mạng, statnet và ergm. Các Tạp chí phần mềm thống kê (v24 / 3) cung cấp một số bài viết về các thư viện này. Vấn đề có thể được tìm thấy ở đây:

http://www.jstatsoft.org/v24


1
Tôi lờ mờ nhớ bản đồ thế giới của mạng facebook, được thực hiện ở R. Tôi nghĩ rằng tác giả đã mô tả quá trình của mình một số chi tiết trong blog của mình. Tôi cho rằng sử dụng phương pháp đó sẽ tạo ra một bản đồ có nhiều thông tin ngay cả với 4 triệu nút.
Owe Jessen

Xin lỗi cho câu hỏi ngây thơ, nhưng làm thế nào để tôi chuyển đổi một bảng thành những gì bạn có srcdst. Đây là những gì tôi thường làm để tải tệp (bây giờ là tệp được phân định bằng tab): el <- read.csv("comment-net/comments-ouids.tsv",header=T,sep="\t")
am

read.csv () sẽ tạo ra một data.frame. as.network () có thể đọc trực tiếp hoặc bạn có thể cần phải làm as.matrix (el).
Jason Morgan

Tôi khá hoài nghi về việc các thư viện này có thể làm được nhiều việc với một biểu đồ gồm hàng triệu nút. Bạn đã thực sự sử dụng chúng với các bộ dữ liệu so sánh?
Szabolcs

Các poster đã đề cập đến một mạng có 4 triệu cạnh , không phải các nút. Tôi đã sử dụng statnethọ thư viện trên một mạng không mong muốn gồm hơn 3500 nút (~ 8 triệu cạnh có thể). Điều đó hoàn toàn có thể thực hiện được, đặc biệt khi mục tiêu chỉ là tính toán số liệu thống kê mạng. Tôi thậm chí đã ước tính ERGM trên các mạng có kích thước này. Nhưng quan điểm của bạn cũng thực hiện; Tôi nghi ngờ mạng lưới của hàng triệu nút có thể được phân tích dễ dàng.
Jason Morgan

3

Tôi không nghĩ rằng R là lựa chọn đầu tiên ở đây (có lẽ tôi đã sai). Bạn sẽ cần các mảng lớn ở đây để lập chỉ mục và chuẩn bị các tệp mạng của bạn ở định dạng dữ liệu phù hợp. Trước hết, tôi sẽ cố gắng sử dụng thư viện SNAP của Jure (Rob đề cập đến anh ấy trong bài viết ở trên) ; nó được viết bằng C ++ và hoạt động rất tốt trên các mạng lớn.


Cảm ơn đã đề cập đến SNAP. Tôi đang nhìn vào nó. Bạn đã sử dụng nó? Mẫu trung tâm đi kèm với nó có vẻ gần với những gì tôi muốn. Tôi đã thử sửa đổi nó để nó hoạt động với dữ liệu đồ thị đa hướng của tôi nhưng không thể biên dịch. Tôi không chắc có thích hợp để đặt câu hỏi về vấn đề này ở đây không, vì vậy tôi có thể tạo một Q. mới
sáng

1
@andresmh, trước tiên bạn có thể thử giảm biểu đồ của mình để có một quan sát duy nhất cho mỗi cặp được định hướng. Đối với công cụ eigenvalue, dữ liệu của bạn có thể tương tự hoặc tương đương với bước đi ngẫu nhiên có trọng số trên biểu đồ. Tôi không chắc liệu SNAP có hỗ trợ điều đó không, nhưng có khả năng là vậy. Nếu vẫn thất bại, bạn có thể gửi một email rất cụ thể đến Jure. Anh ấy là một chàng trai rất tốt, vì vậy tôi sẽ không ngạc nhiên nếu anh ấy cung cấp một số hướng dẫn nhanh.
Đức hồng y

@cardinal: Tôi đã tìm thấy một mã mẫu trong SNAP thực hiện chính xác những gì tôi muốn nhưng đối với một đồ thị không có hướng. Tôi nghĩ rằng biểu đồ của tôi là thứ mà các tài liệu SNAP gọi là "đa đồ thị có hướng". Vì vậy, tôi đã thay đổi chỉ một dòng centrality.cpptừ TUNGraphthành TNEGraph(xem pastebin.com/GHUquJvT dòng 24). Nó không được biên dịch nữa. Tôi nghi ngờ nó đòi hỏi một loại nút khác nhau? Lỗi tôi nhận được là: centrality.cpp:24: error: conversion from ‘TUNGraph::TNodeI’ to non-scalar type ‘TNEGraph::TNodeI’ requested(xem lỗi đầy đủ tại pastebin.com/86mCbByG )
sáng

3

Gephi ( http://gephi.org/ ) có thể là một cách dễ dàng để khám phá dữ liệu. Bạn gần như chắc chắn có thể hình dung nó và thực hiện một số tính toán (mặc dù tôi đã không sử dụng nó trong một thời gian vì vậy tôi không thể nhớ tất cả các chức năng).


3

Từ kinh nghiệm trong quá khứ với mạng lưới 7 triệu nút, tôi nghĩ rằng trực quan hóa mạng hoàn chỉnh của bạn sẽ cho bạn một hình ảnh không thể giải thích được. Tôi có thể đề xuất các hình ảnh trực quan khác nhau bằng cách sử dụng các tập hợp con dữ liệu của bạn, chẳng hạn như chỉ sử dụng 10 nút hàng đầu với các liên kết trong hoặc ngoài nước nhiều nhất. Tôi đề nghị thứ hai của celenius về việc sử dụng gephi.


@andresmh, Maslov và Sneppen ( Science , 2002) có một hình dung có thể hữu ích trong bối cảnh này. Tìm kiếm thông qua các trích dẫn gần đây / comp-sci liên quan đến tác phẩm này, tôi cũng tìm thấy điều này . Đây có thể là một công việc liên quan khác.
Đức hồng y

1

Nếu bạn quan tâm đến kích thước của mạng, bạn có thể thử igraphgói trong R. Và nếu điều đó hoạt động kém bên trong R, thì nó có thể hoạt động tốt hơn như mô-đun Python. Hoặc thậm chí là networkxgói cho Python


1

Bạn có nghi ngờ rằng mạng có một số lượng nhỏ các thành phần được kết nối rất lớn không? Nếu không, bạn có thể phân tách nó thành các thành phần riêng biệt, điều này sẽ giúp việc tính toán các phép đo trung tâm dễ dàng hơn nhiều.


+1 cho điều này - nếu là một thành phần được kết nối hoàn toàn, đó là một điều, nhưng nếu bạn có thể phân tách mạng, bạn có cả dữ liệu nhỏ hơn và thực tế là một số mạng độc lập có thể được phân tích song song.
Fomite

1

Có một số gói phần mềm R người ta có thể sử dụng, bao gồm "sna" và "mạng". Một điều tôi không nhất thiết phải dựa vào nếu bạn gặp vấn đề về hiệu năng với sna là NetworkX. Tôi yêu NetworkX cho đến chết, và sử dụng nó cho hầu hết các phân tích của tôi, nhưng NetworkX khá tự hào vì là một triển khai Pythonic hoàn toàn đơn thuần. Nó không đặc biệt khai thác tốt mã được biên dịch trước nhanh chóng và sna thường vượt trội so với NetworkX bởi một biên độ đáng kể.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.