2014-09-05 35 views
2

我有一個問題,我需要計算一個用戶在某個網絡中的程度中心性,我爲此目的使用R,但由於內存問題R無法將該值計算爲我有一個非常大的數據框。我的數據是這樣的一個CSV文件在Java中計算度中心性

uID1 uID2 
6661 1591 
6661 28065 
6661 42783 
6661 3113 
6661 21647 
6661 3825 
6661 29695 
1003905 2372780 
1003905 7712239 
1003905 7456377 
1003905 3617193 
1003905 2378092 
1003905 326275 
1003905 1389620 
1003905 2970597 
1003905 4111006 
8484 3062783 
8484 12173837 
8484 735670 

輸出將是一列UID和其他核心地位的分數一樣 UID中心地位的數據框得分

6661  20 
. 
. 
. 
8484  2 

我想什麼是計算使用java作爲有人推薦我使用Java的程度中心性分數,但我沒有任何有關Java的知識我只是使用R作爲我的分析目的。我希望我能得到答覆。

+0

這個問題被擱置的 「過寬」。如果你更清楚地描述你想如何做這個計算,也許它可能會重新開放。你想要一個獨立的程序讀/寫輸入/輸出文件?或者你是否在尋找一種可以調用的方法,將某些數據結構作爲輸入/輸出?或者你已經在使用一些圖形庫? – Marco13 2014-09-05 11:21:36

回答

0

用於SNA分析的Java網絡庫對我的經驗有點限制。 JUNG需要大量的樣板代碼,並且所有的仿製藥都不易理解發生了什麼(並且該項目已經死了5年左右),GraphStream很棒,但有點不穩定,有時需要與開發者合作找出一些錯誤等

如果我是你,我只是簡單地使用R interface for igraph,因爲你有一些R的經驗。它是用C編寫的,所以主要沒有效率問題。

只是一個例子:我的博士生動態網絡模型中有一個用數據校準過,與JUNG運行了一週多的時間,我無法輕鬆提高性能。一天之內完成相同仿真的R變體。我知道這種比較並沒有真正說出任何內容,但仍然認爲它是一個附帶信息。

+0

我在R面臨一個問題,並且是每當我運行中心性命令我給我一個錯誤,錯誤是「無法分配一個2 GB大小的向量」 – 2014-09-05 11:28:46

+0

那麼,看起來你的圖形是相當巨大的。你有沒有嘗試類似[Pajek](http://vlado.fmf.uni-lj。SI /酒吧/網絡/ pajek /)?它被設計來處理巨大的圖表)。不是說用戶友好,而是處理龐大的網絡,可以測量各種事物並積極開發。 – rlegendi 2014-09-05 11:31:48

0

度中心度只是g的底層簡單圖中頂點的頂點度列表。

在C#中,這將是:

輸入的
public string DegreeCentrality(List<Tuple<long, long>> items) 
{ 
    var sb = new StringBuilder(); 
    var total = new List<long>(); 
    total.AddRange(items.Select(o => o.Item1).ToList()); 
    total.AddRange(items.Select(o => o.Item2).ToList()); 
    foreach (var group in total.GroupBy(o => o).OrderByDescending(o => o.Count())) 
    { 
    sb.Append(string.Format("{0}\t{1}\n", group.Key, group.Count())); 
    } 
    return sb.ToString(); 
} 

2 1 
1 5 
5 4 
4 6 
6 1 
1 3 

enter image description here

將返回:

1 4 
2 1 
3 2 
4 3 
5 2 
6 2 

編輯:

File.WriteAllText(@"d:\out.txt", DegreeCentrality(File.ReadAllText(@"d:\in.csv").Split('\n').Skip(1).Select(row => row.Trim().Split(',')).Select(item => Tuple.Create(long.Parse(item[0]), long.Parse(item[1]))).ToList())); 

+評論

File.WriteAllText(
    @"d:\out.txt",        //8) write output here 
    DegreeCentrality(       //7) Use list to generate results 
    File.ReadAllText(@"d:\in.csv")    //1) read input from here 
     .Split('\n')        //2) split content to lines 
     .Skip(1)         //3) skip header 
     .Select(row => row.Trim().Split(','))  //4) split at ',' 
               //5) parse text as number pair 
     .Select(item => Tuple.Create(long.Parse(item[0]), long.Parse(item[1]))) 
     .ToList()         //6) Execute results in list 
)); 

或臨時變量

var input = File.ReadAllText(@"d:\in.csv"); 
var lines = input.Split('\n').Skip(1); 
var arries = lines.Select(row => row.Trim().Split(null)); 
var items = arries.Select(item => Tuple.Create(long.Parse(item[0]), long.Parse(item[1]))).ToList(); 
File.WriteAllText(@"d:\out.csv", DegreeCentrality(items)); 
+0

我不熟悉C#。我怎樣才能加載我的數據文件在C#中? – 2014-09-05 11:30:11

+0

如果您想要使用您的數據文件格式而不是.csv,請將**。Split(',')**替換爲** .Split(null)**,並且它將以空格分隔。 – Margus 2014-09-05 11:56:28