要解決的問題
在風控領域圖視覺化場景中,由於視覺化圖中的節點多且關係複雜,導致使用者很難看清節點之間的關聯關係;通常我們會使用一些圖佈局演算法對整張圖進行佈局,使整張圖的關係更加清晰,便於使用者分析。
常見的圖佈局演算法有圓形佈局,分層佈局,正交佈局和力導向佈局等,通常我們都會在一張大圖中應用某一種佈局演算法,或者提供切換整張圖佈局的互動方式來幫助使用者分析問題,但是往往在大圖中進行單一的佈局很難滿足業務訴求,因為每種佈局演算法都有一定的優勢和劣勢,例如圓形佈局和同心圓佈局便於發現圖中度數最多的節點,但是不適合節點較多的情況;分層佈局適合看清節點所處的層級,但是會造成空間上的浪費;力導佈局可以很好避免節點重疊的情況,但是經常會造成連線錯綜複雜,難以分析圖中節點關聯關係,並且在大圖場景佈局計算效能比較低下。而通過切換圖佈局的方式則需要對整張圖的節點位置進行重新計算,由於所有節點的位置都發生了變化,不僅不利於分析,而且還比較影響效能。
通常使用者的迫切需求是在一張大圖中能夠選擇其中任意的節點進行自定義佈局,因此,本方法旨在解決在圖視覺化場景中傳統單一佈局方式無法很好展示圖中節點關聯關係的問題。
技術背景
子圖
子圖的概念最早來源於圖論,指的是節點集和邊集分別是某一圖的節點集和邊集的子集的圖,例如:設\(G=<V,E>\),\(G'=<V',E'>\)為兩圖(同無向圖和有向圖),若 \(V'\subset V\)且\(G=<V,E>\),則稱 \(G\) 為 \(G'\) 的子圖。
力導佈局演算法(Fruchterman-Reingold)
力導佈局最早是由 Peter Eades 在1982 年的“啟發式畫圖演算法”一文中提出,目的是為了減少佈局中邊的交叉,儘量使邊的長度保持一致。該方法使用彈簧模型模擬模擬佈局過程,用彈簧模擬兩個節點之間的關係,節點在受到彈力的作用後,過近的節點會被彈開而過遠的點會被拉近,通過不斷的迭代,最終使整個圖佈局達到動態平衡,趨於穩定。
之後Thomas Fruchterman & Edward Reingold於1991年提出了全新的力導佈局演算法的概念,即FR演算法(Fruchterman-Reingold)。該演算法改進了之前的彈簧模型,豐富了節點之間的物理模型,加入節點之間的靜電力,通過計算系統的總能量並使得能量最小化,從而達到佈局的目的。無論是這種改進後的能量模型,還是之前的彈簧模型,其演算法的本質是能量優化問題,區別在於優化函式的組成不同,優化物件包括引力和斥力部分,不同演算法對引力和斥力的表達方式不同。
例如對於一個圖 \(G\),分別有節點\(i\)和節點\(j\),用表示兩個點的歐式距離(即真實距離),\(s(i,j)\) 表示彈簧的自然長度,\(k\)是彈力系數,\(r\)是兩個節點之間的靜電力常數,\(w\)是兩節點之間的權重。那麼兩種演算法的公式分別如下:
彈簧模型:
能量模型:
相似方案調研
一種基於圖多階段任務系統模組分解的視覺化佈局方法
該佈局方法首先呼叫多階段任務系統模組分解演算法對圖進行分解,生成模組分解樹,以樹的形式來表示圖的內在子結構,樹中節點按照連結規律劃分為 Parallel、Serial 和 Neighbor 三種型別;其次,自上而下,按照節點型別對子圖進行區域性佈局,不同型別子圖採用不用的佈局演算法,原則是美觀、無重疊以及能反映節點聚類特性;最後,按照畫布大小與實際需求,設定樹節點位置,然後自上而下,結合父節點的位置以及子節點相對於父節點的位移對樹中所有節點進行整體佈局,最後獲得的葉子節點位置即為佈局結果。
基於圖多階段任務系統模組分解的視覺化佈局方法,通過將所有節點分為三種型別的方式來進行子圖佈局,意味著一個圖中最多隻能支援三種佈局,並且節點是通過模組分解演算法來分解的,沒有提供使用者自定義選擇節點來進行子圖佈局的互動方法,這樣會導致使用者無法對圖中的任意子圖進行分析。
例如在一個複雜的關係圖中,使用者通常會選擇多個想要分析的節點,然後再選擇相應的佈局演算法對子圖進行佈局,利用不同佈局演算法的優勢,可以快速識別子圖中每個節點的特徵。
因此本方案針對以上兩個缺點,提出了一種基於自定義子圖的視覺化佈局方法,該方法可以讓使用者任意選取一張大圖中的多個子圖來進行多種佈局的方式,使使用者能夠快速有效的分析圖中的蘊含的資訊。
本方案的實現流程
本方案實現過程的詳細說明:
1. 子圖切分
使用者可以根據自定義的需求從一張大圖中篩選出想要佈局的子圖。如下圖所示,不同顏色的節點點代表不同的子圖。如下圖所示
2. 子圖佈局引數輸入
本方法可以支援現有的任意佈局演算法對子圖進行佈局,因此需要使用者設定子圖佈局的相關的佈局引數。
3. 子圖中所有節點位置計算
每個子圖會根據使用者設定的佈局引數計算出子圖中所有的節點位置。例如可以對上圖中的子圖分別進行同心圓佈局和網格佈局計算。
4. 是否有確定的子圖中心位置
在對每個子圖中的節點進行佈局計算後,會造成子圖之間存在重疊的情況,因此本方法可以讓使用者自定義每個子圖的中心位置,在小資料量的場景下,由於圖結構比較簡單,使用者很容易自定義這種方式通常比較有效;但是在大資料量場景下,由於圖結構會變得非常複雜,使用者很難自定義出每個子圖的中心位置,因此本方案提供了一種力導佈局演算法,可以避免佈局後的子圖重疊,具體流程如下
1)首先本方法會忽略所有子圖中節點的實體邊,因為在之後的力導佈局計算中,實體邊的存在會影響整體佈局的位置。
2)之後每個子圖會被抽象成一個超大的圓形虛擬節點。
3)每個子圖之間會相互建立一個虛擬邊,
4)此時子圖會與其他節點一起構建成另一個大圖,然後我們通過力導佈局演算法計算出所有節點的位置。
5)由於力導佈局計算出位置無法保持原有子圖的拓撲資訊,因此我們會記錄每個節點的相對位置,每個節點與其相鄰節點之間的拉普拉斯差異可通過以下公式計算:
6)最後批量更新所有子圖以及其他節點的位置,從而達到對於子圖進行自定義佈局的目的。
最終效果
最後的佈局效果如下圖所示:
- 同心圓佈局+網格佈局
- 圓形佈局+網格佈局
- 同心圓佈局+DAG佈局+網格佈局
總結
子圖佈局一直是圖視覺化領域中研究的重點,本方法通過將子圖抽象成虛擬節點,並建立虛擬邊,然後使用力導演算法計算出所有子圖的位置,最後運用拉普拉斯變換的方式使整張圖儘量維持原有的拓撲性質。從而可以將一個圖拆分成多個自定義子圖進行不同方式的佈局。目前在圖分析業務場景使用比較廣泛。
作者:ES2049 / 謝康奎
文章可隨意轉載,但請保留此原文連結。
非常歡迎有激情的你加入 ES2049 Studio,簡歷請傳送至 caijun.hcj@alibaba-inc.com