框架-网络分析工具/算法

各种语言图相关的库

  • Java语言
JUNG:一个用Java编写的开源图论库,提供了创建、操作和可视化复杂网络的工具。
GraphStream:一个用Java编写的开源图论库,提供了创建、操作和可视化复杂网络的工具。
Apache Giraph:一个基于Hadoop的分布式图计算框架,支持大规模图数据的处理和分析。
Apache Flink Gelly:一个基于Flink的分布式图计算框架,支持大规模图数据的处理和分析。
Neo4j:一个用Java编写的开源图数据库,支持高效存储和查询大规模图数据。
JGraphT:一个用Java编写的开源图论库,提供了创建、操作和可视化复杂网络的工具。
Prefuse:一个用Java编写的开源可视化库,支持可视化大规模图数据和交互式图形应用。
YWorks:一个提供了多个Java图形库和工具的商业图形软件开发公司,支持各种类型的图形可视化和交互。
  • Python语言
NetworkX:一个用Python编写的开源图论库,提供了创建、操作和分析复杂网络的工具。
Graph-tool:一个用C++编写的开源图论库,提供了高效的图数据结构和图算法实现,并支持Python接口。
igraph:一个用C编写的开源图论库,提供了高效的图数据结构和图算法实现,并支持多种编程语言接口。
DGL:一个用Python编写的开源深度图神经网络库,支持大规模图神经网络的实现和训练。
PyTorch Geometric:一个用Python编写的开源图神经网络库,支持多种图神经网络模型和数据集的实现和训练。
Snap.py:一个用C++编写的开源图论库,提供了Python接口,支持大规模网络的创建、操作和分析。
Graphein:一个用Python编写的开源图论库,提供了创建、操作和可视化分子图的工具。
PyGraphistry:一个用Python编写的开源可视化库,支持将大规模图数据转换为可视化图形。
  • Python语言
Graph-tool:一个用C++编写的开源图论库,提供了高效的图数据结构和图算法实现,并支持Python接口。
igraph:一个用C编写的开源图论库,提供了高效的图数据结构和图算法实现,并支持多种编程语言接口。
Snap:一个用C++编写的开源图论库,提供了高效的图数据结构和图算法实现,并支持多种编程语言接口。
METIS:一个用C编写的开源图划分库,支持将大型图分割为多个子图,以便于并行计算。
HMETIS:一个用C编写的开源分布式图划分库,支持将大型图分割为多个子图,以便于分布式计算。
Boost.Graph:一个用C++编写的开源图论库,提供了创建、操作和分析复杂网络的工具。
Lemon:一个用C++编写的开源图论库,提供了高效的图数据结构和图算法实现,支持多种图形式和图算法。

社区发现算法

Girvan-Newman算法(2002):一种基于边介数的社区发现算法,通过反复删除网络中介数最大的边来划分社区。适用于中小型网络。
Clauset-Newman-Moore算法(2004):一种基于模块度的社区发现算法,通过优化网络的模块度来划分社区。适用于中小型网络。
Label Propagation算法(2007):一种基于标签传播的社区发现算法,将每个节点都赋予一个唯一的标签,然后将其传播给邻居节点,最终将具有相同标签的节点划分到同一个社区。适用于大规模网络。
Infomap算法(2008):一种基于信息流的社区发现算法,通过最小化信息传输的代价来划分社区。适用于大规模网络。
Louvain算法(2008):一种基于模块度的快速社区发现算法,通过迭代优化网络的模块度来划分社区。适用于大规模网络。
LPA-GL算法(2010):一种基于标签传播的高效社区发现算法,通过在图的不同粒度上运行标签传播算法来划分社区。适用于大规模网络。
BigClam算法(2013):一种基于对数似然函数的社区发现算法,将社区划分问题转化为概率模型的优化问题。适用于大规模网络。
COPRA算法(2013):一种基于标签传播的社区发现算法,通过将标签传播过程限制在具有高度内部连通性的社区中来划分社区。适用于大规模网络。
CNM算法(2016):是Clauset-Newman-Moore算法的改进版本,通过引入层次结构和节点加权来提高社区划分的准确性。
Leiden算法(2018):一种基于模块度的社区发现算法,通过局部优化网络的模块度来划分社区,具有高效和准确的特点。
EAGLE算法(2018):一种基于局部邻域相似性的社区发现算法,通过将节点映射到高维空间中进行聚类来划分社区。
GIC算法(2019):一种基于全局信息和局部信息的社区发现算法,通过在全局和局部层面上进行社区划分来提高社区划分的准确性和鲁棒性。
HLC算法(2019):一种基于高度重叠社区的社区发现算法,将社区看作是节点重叠的集合,通过最大化每个节点在不同社区中的权重来划分社区。
LabelRankT算法(2020):一种基于标签排序的社区发现算法,通过对每个节点的标签进行排序来划分社区。
GraphWave算法(2020):一种基于图信号处理的社区发现算法,通过对网络进行傅里叶变换来提取特征向量,然后将节点映射到低维空间中进行聚类来划分社区。
EComm算法(2021):一种基于高效通信的社区发现算法,通过最小化跨社区的通信成本来划分社区。

许多社区发现算法都有Python实现的库,以下是一些常见算法和相应的Python库:
Girvan-Newman算法:可以使用networkx库中的betweenness_centrality函数实现。
Clauset-Newman-Moore算法:可以使用networkx库中的community库实现。
Label Propagation算法:可以使用networkx库中的label_propagation_communities函数实现。
Infomap算法:可以使用igraph库中的方法实现。
Louvain算法:可以使用python-louvain库实现。
LPA-GL算法:可以使用networkx库中的asyn_lpa_communities函数实现。
BigClam算法:可以使用BigClamPy库实现。
COPRA算法:可以使用copperpy库实现。
CNM算法:可以使用networkx库中的community库实现。
Leiden算法:可以使用leidenalg库实现。
除了上述库,还有其他社区发现算法的Python库,如:
EAGLE算法:可以使用eaglepy库实现。
GIC算法:可以使用gicpy库实现。
HLC算法:可以使用python-louvain库中的hierarchical_louvain函数实现。
LabelRankT算法:可以使用scikit-network库中的label_ranking_t函数实现。
GraphWave算法:可以使用graphwave库实现。
EComm算法:可以使用ecommpy库实现。

社区发现与聚类算法概念上的区别?

社区发现和聚类算法都是将相似的节点或数据点归为一组的方法,但它们的应用场景和算法思路略有不同。

聚类算法是一种无监督学习方法,旨在将相似的数据点聚集在一起,形成具有相似特征的簇。
聚类算法通常基于距离度量或相似度度量来计算数据点之间的相似性,然后将相似性较高的数据点归为一组。
聚类算法的目标是将数据点划分成若干个簇,并使得同一簇内的数据点相似度尽可能高,不同簇之间的相似度尽可能低。
聚类算法常用于数据挖掘、机器学习、图像分析等领域。

社区发现算法是一种将网络节点划分成若干个社区的方法。在网络中,节点之间的关系通常是复杂的、非线性的,
因此社区发现算法通常考虑节点之间的复杂关系,并将节点划分成具有内部紧密联系的社区。
社区发现算法通常基于网络的拓扑结构和连接关系来计算节点之间的相似性,然后将相似性较高的节点划分为同一社区。
社区发现算法的目标是将网络划分成若干个社区,并使得同一社区内的节点之间具有高度的内部联系,不同社区之间的联系尽可能低。
社区发现算法常用于社交网络分析、生物信息学、互联网广告等领域。

虽然社区发现和聚类算法都是将相似的节点或数据点归为一组的方法,但它们的应用场景和算法思路略有不同。
聚类算法更侧重于数据分析和数据挖掘,而社区发现算法更侧重于网络分析和社交网络分析。

实践

  • JGraphT 实现路径计算,输入多个途经点,输出路径
import org.jgrapht.Graph;
import org.jgrapht.graph.DefaultWeightedEdge;
import org.jgrapht.graph.SimpleDirectedWeightedGraph;

import java.util.Arrays;
import java.util.List;

public class PathCalculator {

    private Graph<String, DefaultWeightedEdge> graph;

    public PathCalculator(Graph<String, DefaultWeightedEdge> graph) {
        this.graph = graph;
    }

    /**
     * 计算途经点之间的路径
     *
     * @param waypoints 途经点列表,第一个元素为起点,最后一个元素为终点
     * @return 路径列表,每个路径由一组边构成
     */
    public List<List<DefaultWeightedEdge>> calculatePath(List<String> waypoints) {
        List<List<DefaultWeightedEdge>> pathList = null;

        // 依次计算相邻两个途经点之间的路径
        for (int i = 0; i < waypoints.size() - 1; i++) {
            String source = waypoints.get(i);
            String target = waypoints.get(i + 1);
            List<DefaultWeightedEdge> path = DijkstraShortestPath.findPathBetween(graph, source, target);
            if (path == null) {
                return null;
            }
            if (pathList == null) {
                pathList = Arrays.asList(path);
            } else {
                pathList.add(path);
            }
        }

        return pathList;
    }

    public static void main(String[] args) {
        Graph<String, DefaultWeightedEdge> graph = new SimpleDirectedWeightedGraph<>(DefaultWeightedEdge.class);
        String[] vertices = {"A", "B", "C", "D", "E", "F", "G"};
        graph.addAllVertices(Arrays.asList(vertices));

        graph.setEdgeWeight(graph.addEdge("A", "B"), 5.0);
        graph.setEdgeWeight(graph.addEdge("A", "C"), 7.0);
        graph.setEdgeWeight(graph.addEdge("B", "C"), 2.0);
        graph.setEdgeWeight(graph.addEdge("B", "D"), 4.0);
        graph.setEdgeWeight(graph.addEdge("B", "E"), 6.0);
        graph.setEdgeWeight(graph.addEdge("C", "E"), 1.0);
        graph.setEdgeWeight(graph.addEdge("D", "E"), 3.0);
        graph.setEdgeWeight(graph.addEdge("D", "F"), 2.0);
        graph.setEdgeWeight(graph.addEdge("E", "D"), 1.0);
        graph.setEdgeWeight(graph.addEdge("E", "F"), 4.0);
        graph.setEdgeWeight(graph.addEdge("E", "G"), 5.0);
        graph.setEdgeWeight(graph.addEdge("F", "G"), 3.0);

        PathCalculator calculator = new PathCalculator(graph);
        List<String> waypoints = Arrays.asList("A", "B", "D", "F", "G");
        List<List<DefaultWeightedEdge>> pathList = calculator.calculatePath(waypoints);
        System.out.println(pathList);
    }
}

  • infomap
import igraph as ig

# 创建一个有向图对象
g = ig.Graph(directed=True)

# 添加节点和边,并设置不同权重
g.add_vertices(["A", "B", "C", "D", "E", "F", "G"])
g.add_edges([("A", "B"), ("A", "C"), ("B", "C"), ("B", "D"), ("B", "E"), ("C", "E"), ("D", "E"), ("D", "F"), ("E", "D"), ("E", "F"), ("E", "G"), ("F", "G")])
g.es["weight"] = [1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2]

# 使用Infomap算法进行社区发现
im = g.community_infomap(edge_weights="weight")

# 输出每个社区的标签和内容
for i, subgraph in enumerate(im.subgraphs()):
    print(f"Community {i}: {subgraph.vs['name']}")
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值