1. 程式人生 > >JUNG 計算圖屬性,相關度

JUNG 計算圖屬性,相關度

遍歷 title 轉化 -s sta 第三方 進行 ddl ali

本文介紹利用Java的第三方API JUNG 計算圖中:

closeness centrality;// 圖中某節點的 接近中心性/親密中心性

betweenness centrality;// 圖中某節點的 中介中心性/介數中心性

distance; // 圖中兩節點的最短距離

eccentricity; // 圖中某節點的 偏心率/離心率

radius; // 半徑

diameter. // 直徑


JUNG api參考文檔:

http://jung.sourceforge.net/doc/api/overview-summary.html


預處理

JUNG 中的計算方法基於JUNG內置圖類,本文基於自定義圖計算圖屬性,故需要先將自定義圖轉存為JUNG圖對象。

JUNG 提供 泛型接口,進行轉化或創建時利用自定義邊類型與節點類型即可。

以以下代碼為例:

/**
     * 將graph.Graph 轉為 JUNG.graph.Graph 過濾掉超邊.
     * 
     * @param g - 基於 graph.Graph
     * @return edu.uci.ics.jung.graph.Graph
     */
    public static edu.uci.ics.jung.graph.Graph<Vertex, Edge> graphTransform(Graph<Vertex, Edge> g) {
        edu.uci.ics.jung.graph.Graph
<Vertex, Edge> graph = new SparseGraph<>(); // 稀疏圖 for (Vertex vertex : g.vertices()) { graph.addVertex(vertex); } for (Edge edge : g.edges()) { if (edge.sourceVertices().size() == 0) { // 超邊 continue; }
if (edge.sourceVertices().size() == 1) { // 有向邊 graph.addEdge(edge, getVertex(edge.sourceVertices()), getVertex(edge.targetVertices()), EdgeType.DIRECTED); } else { // 無向邊 Vertex existV = getVertex(edge.vertices()); graph.addEdge(edge, existV, getVertexExcept(edge.vertices(), existV), EdgeType.UNDIRECTED); } } return graph; }

如此,獲得一個jung 圖對象。


Closeness Centrality

/**
     * 計算圖g中節點v的 closeness centrality.
     * 
     * @param g - to be calculate.
     * @param v - central vertex.
     * @return closeness centrality.
     */
    public static double closenessCentrality(Graph<Vertex, Edge> g, Vertex v) {
        edu.uci.ics.jung.graph.Graph<Vertex, Edge> graph = helper.Transformer.graphTransform(g);
        // 新建計算對象,傳入圖與待計算節點。
        ClosenessCentrality<Vertex, Edge> closenessCentrality = new ClosenessCentrality<>(graph, t);
        // 獲得 closeness centrality.
        double degree =  closenessCentrality.getVertexScore(v);
        return degree;
    }


Betweenness Centrality

/**
     * 計算圖g中節點v的 betweenness centrality.
     * 
     * @param g - to be calculate.
     * @param v - central vertex. *
     * @return betweeness centrality.
     */
    public static double betweennessCentrality(Graph<Vertex, Edge> g, Vertex v) {
        edu.uci.ics.jung.graph.Graph<Vertex, Edge> graph = helper.Transformer.graphTransform(g);
        // 新建計算對象,傳入圖與待計算節點。
        BetweennessCentrality<Vertex, Edge> betweennessCentrality =
                new BetweennessCentrality<>(graph, t);
        // 獲得 betweenness centrality.
        double degree = betweennessCentrality.getVertexScore(v);
        return degree;
    }


Distance (Dijkstra算法)

/**
     * 節點start和end之間的最短距離(需要區分有向圖和無向圖).
     * 
     * @param g - to be calculated in.
     * @param start - from.
     * @param end - to.
     * @return distance.
     */
    public static double distance(Graph<Vertex, Edge> g, Vertex start, Vertex end) {
        edu.uci.ics.jung.graph.Graph<Vertex, Edge> graph = helper.Transformer.graphTransform(g);
        DijkstraShortestPath<Vertex, Edge> dijkstraShortestPath =
                new DijkstraShortestPath<>(graph, t);
        // 計算由start到end的最短路徑,返回值為路徑上的邊組
        List<Edge> path = dijkstraShortestPath.getPath(start, end);
        // 統計總權值
        double distance = 0;
        for (Edge edge : path) {
            distance += edge.getWeight();
        }
        return distance;
    }


Eccentricity

在圖論中,頂點技術分享圖片偏心率(eccentricity),用來表示連接圖技術分享圖片中的頂點技術分享圖片到圖技術分享圖片中其它頂點之間的最大距離。

 /**
     * 偏心率.
     * 
     * @param g - to be calculated.
     * @param v - central vertex.
     * @return eccentricity of the specific vertex.
     */
    public static double eccentricity(Graph<Vertex, Edge> g, Vertex v) {
        double eccentricity = 0;
        for (Vertex end : g.vertices()) {
            // 跳過 v 自身
            if (v.equals(end)) {
                continue;
            }
            // 計算 distance 並記錄最遠距離
            double distance = distance(g, v, end);
            if (distance > eccentricity) {
                eccentricity = distance;
            }
        }
        return eccentricity;
    }


Radius

在圖論中,半徑(radius)表示圖的所有點的偏心率的最小值。

/**
     * 半徑,即偏心率的最小值.
     * 
     * @param g - to be calculated.
     * @return
     */
    public static double radius(Graph<Vertex, Edge> g) {
        double radius = 2 ^ 10; // 初始極大值
        // 遍歷節點計算偏心率,記錄偏心率最小值
        for (Vertex vertex : g.vertices()) {
            double distance = eccentricity(g, vertex);
            if (radius > distance && distance > 0) {
                radius = distance;
            }
        }
        return radius;
    }


Diameter

在圖論中,圖的直徑(diameter),表示取遍圖的所有頂點,得到的偏心率的最大值。

/**
     * 直徑,即偏心率的最大值.
     * 
     * @param g - to be calculated.
     * @return
     */
    public static double diameter(Graph<Vertex, Edge> g) {
        double diameter = 0;
        // 遍歷節點計算偏心率,記錄偏心率最大值
        for (Vertex vertex : g.vertices()) {
            double distance = eccentricity(g, vertex);
            if (diameter < distance) {
                diameter = distance;
            }
        }
        return diameter;
    }

JUNG 計算圖屬性,相關度