Java中度中心度的计算

Java中度中心度的计算,java,Java,我遇到了一个问题,我需要计算某个网络中某个用户的度中心,我为此使用了R,但由于内存问题,R无法计算该值,因为我有一个非常大的数据帧。我的数据看起来像是一个csv文件 uID1 uID2 6661 1591 6661 28065 6661 42783 6661 3113 6661 21647 6661 3825 6661 29695 1003905 2372780 1003905 7712239 1003905 7456377 1003905 361

我遇到了一个问题,我需要计算某个网络中某个用户的度中心,我为此使用了R,但由于内存问题,R无法计算该值,因为我有一个非常大的数据帧。我的数据看起来像是一个csv文件

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和其他中心性分数的数据帧,如 中心性得分

6661      20
 .
 . 
 .
8484       2

我想用java计算度中心分数,就像有人推荐我使用java一样,但我对java一无所知,我只是用R进行分析。我希望我能得到回应。

根据我的经验,用于SNA分析的Java网络库有点有限。需要大量的样板代码和所有的泛型,不容易理解正在发生的事情(项目已经死了约5年),很好,但有点不稳定,有时需要与开发人员合作找出一些bug,等等

如果我是你,我会简单地使用,因为你有一些R的经验。它是用C编写的,因此主要没有效率问题


举个例子:我的一个用数据校准的动态网络模型在JUNG那里运行了一个多星期,我无法轻松提高那里的性能。同一模拟的R变体在一天内完成。我知道,这种比较并没有真正说明什么,但仍然把它看作是一个侧面信息。p> 在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();
}

将返回:

1 4
2 1
3 2
4 3
5 2
6 2
编辑:

+评论

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));

这个问题因“范围太广”而被搁置。如果您能更清楚地说明如何进行此计算,它可能会重新打开。您想要一个独立的程序来读取/写入作为文件的输入/输出吗?或者您正在寻找一种可以调用的方法,使用某些数据结构作为输入/输出?或者您已经在使用某个图形库了?我在R中遇到了一个问题,每当我运行centrality命令时,我都会给我一个错误,错误是“无法分配大小为2GB的向量”。那么,您的图形似乎相当大。你试过类似的东西吗?它被设计用来处理巨大的图形)。不是很友好,但是可以处理巨大的网络,可以测量所有类型的东西,并且正在积极开发。我不太熟悉C。如何以C#加载数据文件?如果要使用数据文件格式而不是.csv,请将.Split(“,”)替换为.Split(null),它将在空白处拆分。
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));