Board logo

标题: 使用 Flash 描述复杂的社交网络-1 简介 [打印本页]

作者: look_w    时间: 2018-8-23 09:25     标题: 使用 Flash 描述复杂的社交网络-1 简介

社交网络简介本文主要介绍的是弹簧理论算法在社交网络分析中的应用、社交网络图作为数据源的通用格式、弹簧算法的 Flash 实现以及 Flash 结合 Java Plug-in 的实现, 因此首先需要对社交网络分析和弹簧理论的概念有一个初步了解。
社交网络分析 (SNA)简单来说,社交网络是一个由个人或社区组成的点状网络拓扑结构。其中每个点 (Node) 代表一个个体,可以是个人,也可以是一个团队或是一个社区,个体与个体之间可能存在各种相互依赖的社会关系,在拓扑网络中以点与点之间的边 (Tie) 表示。而社交网络分析关心的正是点与边之间依存的社会关系。随着个体数量的增加,以及个体间社会关系的复杂化,最后形成的整个社交网络结构可能会非常复杂。本文所讨论的复杂社交网络中节点数一般为 100 个,上限为 300 个,若超过该上限,网络形成的性能将大大下降。
社交网络分析最初是用于帮助人们理解人群中流行性疾病的传播情况并加以抑制。疾病的传播所强调的关键词即“接触”,而现在这种接触逐渐演化为人与人之间的交流和联络,在社交网络中以边的形式表现出来,一条边即表示两个个体间建立了一种关联(ties)。
一张社交网络图的形状可以直观地决定网络本身对每个个体的重要程度。一般而言,一张聚合度更高、更紧密的网络(cliques,如一个部落、家族等)对于每个成员的重要程度要远远小于一张与外网络有大量弱关联 (weak ties) 的松散网络(如一个开源社区、bbs 论坛等),如图 1 所示。
图 1. 社交网络分析中的集群和弱关联自身网络越开放,与外界网络建立越多的弱关联,越容易开拓人的思维,分享更多知识,提供更多机遇。换句话说,社交网络分析建议,我们要避免与同一网络的个体间建立过多的冗余关联,同时要尝试与不同的外界网络建立联系。下面我们将由浅入深地介绍社交网络分析中的几个重要度量参数:
本文只介绍了几个对社交网络分析的图形特性有重大影响的度量参数,至于其他的一些参数,读者可以查阅 中的维基百科。
我们还可从图 1 的网络形状中获得一些额外信息:
我们说,具备以上特性和美感的网络结构图更直观可读,更易于社交网络分析。那么我们通过怎样的算法能够描述出图 1 中的网络模型呢?弹簧理论算法给出了答案。
经典弹簧理论算法——力导向算法原理分析基于力导向 (Force-directed) 的算法作为弹簧理论算法的一类典型,被广泛应用于描述社交网络等关系型信息图。它的原理其实非常易懂,我们可以把整张网络想象成一个虚拟的物理系统。系统中的每个节点都可以看成是一个带有一定能量的放电粒子,粒子与粒子之间存在某种库仑斥力,使它们两两相互排斥。同时,有些粒子间被一些“边”所牵连,这些边产生类似弹簧的胡克引力,又紧紧牵制着“边”两端的粒子。在粒子间斥力和引力的不断作用下,粒子们从随机无序的初态不断发生位移,逐渐趋于平衡有序的终态。同时整个物理系统的能量也在不断消耗,经过数次迭代后,粒子之间几乎不再发生相对位移,整个系统达到一种稳定平衡的状态,即能量趋于零。此刻,最终的这幅理想的社交网络图也基本绘制完成。清单 1 的伪代码描述了大致的迭代优化过程。
清单 1. 力导向核心算法实现伪代码
1
2
3
4
5
6
7
8
9
10
11
12
Set up initial node positions randomly
Loop for k
   For each node u
       For each node v
           net-force += Coulomb_repulsion( u, v )
       End For
   End For
   For each edge e compute
       net-force += Hooke_attraction( u1, u2 ) // u1, u2 is start and end node of edge e
   End For
   Update x and y values with each net-force // every node has its own net-force
End Loop




伪代码的整体思想归纳如下:
为了节省篇幅,省去了涉及细节的逻辑和计算,如参数的微调、斥力和引力产生的位移量公式等,如果读者有兴趣深入了解该算法可以查阅相关文献,详见 参考资源中的相关算法理论。另外,开发人员可以根据自己的偏好选择不同的编程语言来实现(后文中会提到 ActionScript 和 Java 的两种实现)。
该算法的平均时间复杂度是由两部分组成——每次迭代计算每两点间的斥力变化 O(n2) 和每条边给端点带来的引力变化 O(e),共进行 k 次迭代计算,即 O (k * (n2+e) )。其中 n 为节点个数,e 为边数。图 2 描述了随着迭代次数的增加,力导向算法在 3D 网络图中节点相互排斥吸引的扩散过程。
图 2. 力导向算法下节点的迭代扩散趋势我们从图 2 中可以发现点和边的位移趋势:
而以上几点也正符合上文归纳的适用于社交网络分析的网状结构图的几大基本特性。
既然力导向算法把社交网络分析的图形特性展现得如此完美,那么它是否还有进一步优化的余地呢?有一定算法基础的读者不难发现,该算法的最大弊病在于:为了追求图形的对称美,它在每一次的迭代中,都对每两点间的斥力进行了累加计算,即每次迭代的该部分时间复杂度达到了 O(n2)。若忽略边产生引力的部分计算,且假设迭代至趋于平衡的时间复杂度是 O(n),那么整个算法的时间复杂度为 O(n3)。这样对于大型复杂网络图,这种算法的效率将随着时间复杂度的上升而大大下降。我们该如何降低时间复杂度呢?这里文章给读者留下一个悬念,有兴趣的读者不妨思考一下。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0