我正在构建一个二分网络生成器,我正在使用How to filter the result of KNeighborhoodFilter?中的代码,当我的网络很小(5000个节点)时,它可以正常工作。
现在我正在使用具有60.000个节点和250.000个链接的网络。为了加快速度,我想知道在提取节点的2-dist邻居时是否可以随机抽取一些节点,比如只有50%的2-dist邻居...
我真的不知道如何实现这一点,也不知道如果没有黑客攻击KNeighborhoodFilter类本身(我知道我无法做到这一点......)。
现在我拿结果然后选择一个随机样本,但我不知道我是否在正确的道路上:
Predicate<Node> onlyUsers = new Predicate<Node>() {
@Override
public boolean apply(Node node) {
return node.getName().startsWith("u");
}
};
// find neighbors of nodes with degree i
Filter<Node, Edge> filter = new KNeighborhoodFilter<Node, Edge>(u, 2, KNeighborhoodFilter.EdgeType.IN_OUT);
// retrieve everything at distance 2 from node u
List<Node> twoDistNei = Lists.newArrayList(filter.transform(zpa).getVertices());
// sample the collection
List<Node> sampledUsers = Lists.newArrayList();
for (int i = 0; i < 2000; i++) {
sampledUsers.add(twoDistNei.get(context.getRNG().nextInt(twoDistNei.size())));
}
Set<Node> sampledNodesHashed = Sets.newHashSet(sampledNodes);
Set<Node> twoDistUsers = Sets.newHashSet(Collections2.filter(sampledNodesHashed, onlyUsers));
我的目标是让这段代码运行得更快。非常感谢你的时间。
祝你好运, 西蒙娜
答案 0 :(得分:1)
如果你想加快速度,可以采取以下几种方法。他们都涉及一些黑客行为。 :)
(1)修改KNeighborhoodFilter,为您提供一个以一定概率p遍历边缘的版本。
对此的概括是指定每个跳的概率,即第一跳使用一个概率,第二跳使用一个概率等。
进一步的推广将对每个边缘使用单独的概率,可能基于所涉及的节点/边缘的某些属性(例如,如果目标具有高度,则可能或多或少地追随边缘。)
请注意,此解决方案需要认真考虑哪种随机抽样适合您的情况。如果你真正想要的是 已经在完整结果中的节点的统一随机抽样,那么你基本上需要生成完整的结果然后过滤它。
这可能是最简单的解决方案;它真的不会涉及很多工作。
(2)创建KNeighborhoodFilter的修改版本,将不同处理器之间的工作分开。您可能正在使用&gt;的计算机上运行此功能。 1核心,所以你可以创建多个线程,让Java将它们分配给不同的机器;如果你真的想加快速度(并且你有一个合适的设置),那么你就可以把它放到不同的机器上,MapReduce风格。