① 一文带你认识30个重要的数据结构和算法
数组是最简单也是最常见的数据结构。它们的特点是可以通过索引(位置)轻松访问元素。
它们是做什么用的?
想象一下有一排剧院椅。每把椅子都分配了一个位置(从左到右),因此每个观众都会从他将要坐的椅子上分配一个号码。这是一个数组。将问题扩展到整个剧院(椅子的行和列),您将拥有一个二维数组(矩阵)。
特性
链表是线性数据结构,就像数组一样。链表和数组的主要区别在于链表的元素不存储在连续的内存位置。它由节点组成——实体存储当前元素的值和下一个元素的地址引用。这样,元素通过指针链接。
它们是做什么用的?
链表的一个相关应用是浏览器的上一页和下一页的实现。双链表是存储用户搜索显示的页面的完美数据结构。
特性
堆栈是一种抽象数据类型,它形式化了受限访问集合的概念。该限制遵循 LIFO(后进先出)规则。因此,添加到堆栈中的最后一个元素是您从中删除的第一个元素。
堆栈可以使用数组或链表来实现。
它们是做什么用的?
现实生活中最常见的例子是在食堂中将盘子叠放在一起。位于顶部的板首先被移除。放置在最底部的盘子是在堆栈中保留时间最长的盘子。
堆栈最有用的一种情况是您需要获取给定元素的相反顺序。只需将它们全部推入堆栈,然后弹出它们。
另一个有趣的应用是有效括号问题。给定一串括号,您可以使用堆栈检查它们是否匹配。
特性
队列是受限访问集合中的另一种数据类型,就像前面讨论的堆栈一样。主要区别在于队列是按照FIFO(先进先出)模型组织的:队列中第一个插入的元素是第一个被移除的元素。队列可以使用固定长度的数组、循环数组或链表来实现。
它们是做什么用的?
这种抽象数据类型 (ADT) 的最佳用途当然是模拟现实生活中的队列。例如,在呼叫中心应用程序中,队列用于保存等待从顾问那里获得帮助的客户——这些客户应该按照他们呼叫的顺序获得帮助。
一种特殊且非常重要的队列类型是优先级队列。元素根据与它们关联的“优先级”被引入队列:具有最高优先级的元素首先被引入队列。这个 ADT 在许多图算法(Dijkstra 算法、BFS、Prim 算法、霍夫曼编码 )中是必不可少的。它是使用堆实现的。
另一种特殊类型的队列是deque 队列(双关语它的发音是“deck”)。可以从队列的两端插入/删除元素。
特性
Maps (dictionaries)是包含键集合和值集合的抽象数据类型。每个键都有一个与之关联的值。
哈希表是一种特殊类型的映射。它使用散列函数生成一个散列码,放入一个桶或槽数组:键被散列,结果散列指示值的存储位置。
最常见的散列函数(在众多散列函数中)是模常数函数。例如,如果常量是 6,则键 x 的值是x%6。
理想情况下,散列函数会将每个键分配给一个唯一的桶,但他们的大多数设计都采用了不完善的函数,这可能会导致具有相同生成值的键之间发生冲突。这种碰撞总是以某种方式适应的。
它们是做什么用的?
Maps 最着名的应用是语言词典。语言中的每个词都为其指定了定义。它是使用有序映射实现的(其键按字母顺序排列)。
通讯录也是一张Map。每个名字都有一个分配给它的电话号码。
另一个有用的应用是值的标准化。假设我们要为一天中的每一分钟(24 小时 = 1440 分钟)分配一个从 0 到 1439 的索引。哈希函数将为h(x) = x.小时*60+x.分钟。
特性
术语:
因为maps 是使用自平衡红黑树实现的(文章后面会解释),所以所有操作都在 O(log n) 内完成;所有哈希表操作都是常量。
图是表示一对两个集合的非线性数据结构:G={V, E},其中 V 是顶点(节点)的集合,而 E 是边(箭头)的集合。节点是由边互连的值 - 描述两个节点之间的依赖关系(有时与成本/距离相关联)的线。
图有两种主要类型:有向图和无向图。在无向图中,边(x, y)在两个方向上都可用:(x, y)和(y, x)。在有向图中,边(x, y)称为箭头,方向由其名称中顶点的顺序给出:箭头(x, y)与箭头(y, x) 不同。
它们是做什么用的?
特性
图论是一个广阔的领域,但我们将重点介绍一些最知名的概念:
一棵树是一个无向图,在连通性方面最小(如果我们消除一条边,图将不再连接)和在无环方面最大(如果我们添加一条边,图将不再是无环的)。所以任何无环连通无向图都是一棵树,但为了简单起见,我们将有根树称为树。
根是一个固定节点,它确定树中边的方向,所以这就是一切“开始”的地方。叶子是树的终端节点——这就是一切“结束”的地方。
一个顶点的孩子是它下面的事件顶点。一个顶点可以有多个子节点。一个顶点的父节点是它上面的事件顶点——它是唯一的。
它们是做什么用的?
我们在任何需要描绘层次结构的时候都使用树。我们自己的家谱树就是一个完美的例子。你最古老的祖先是树的根。最年轻的一代代表叶子的集合。
树也可以代表你工作的公司中的上下级关系。这样您就可以找出谁是您的上级以及您应该管理谁。
特性
二叉树是一种特殊类型的树:每个顶点最多可以有两个子节点。在严格二叉树中,除了叶子之外,每个节点都有两个孩子。具有 n 层的完整二叉树具有所有2ⁿ-1 个可能的节点。
二叉搜索树是一棵二叉树,其中节点的值属于一个完全有序的集合——任何任意选择的节点的值都大于左子树中的所有值,而小于右子树中的所有值。
它们是做什么用的?
BT 的一项重要应用是逻辑表达式的表示和评估。每个表达式都可以分解为变量/常量和运算符。这种表达式书写方法称为逆波兰表示法 (RPN)。这样,它们就可以形成一个二叉树,其中内部节点是运算符,叶子是变量/常量——它被称为抽象语法树(AST)。
BST 经常使用,因为它们可以快速搜索键属性。AVL 树、红黑树、有序集和映射是使用 BST 实现的。
特性
BST 有三种类型的 DFS 遍历:
所有这些类型的树都是自平衡二叉搜索树。不同之处在于它们以对数时间平衡高度的方式。
AVL 树在每次插入/删除后都是自平衡的,因为节点的左子树和右子树的高度之间的模块差异最大为 1。 AVL 以其发明者的名字命名:Adelson-Velsky 和 Landis。
在红黑树中,每个节点存储一个额外的代表颜色的位,用于确保每次插入/删除操作后的平衡。
在 Splay 树中,最近访问的节点可以快速再次访问,因此任何操作的摊销时间复杂度仍然是 O(log n)。
它们是做什么用的?
AVL 似乎是数据库理论中最好的数据结构。
RBT(红黑树) 用于组织可比较的数据片段,例如文本片段或数字。在 Java 8 版本中,HashMap 是使用 RBT 实现的。计算几何和函数式编程中的数据结构也是用 RBT 构建的。
在 Windows NT 中(在虚拟内存、网络和文件系统代码中),Splay 树用于缓存、内存分配器、垃圾收集器、数据压缩、绳索(替换用于长文本字符串的字符串)。
特性
最小堆是一棵二叉树,其中每个节点的值都大于或等于其父节点的值:val[par[x]]
② 启发式搜索全局择优搜索和局部择优搜索的区别是什么
根据问题的实际情况不断寻找可利用的知识,从而构造成一条代价较少的推理路线,使问题得到圆满解决的过程称为搜索。
寻找问题的解的一种可靠的方法是首先列出所有候选解,然后依次检查每一个解,即可以找到所需要的问题的答案。这是一种“万能”的方法,理论上,当候选解的数量可以穷尽并且通过检查所有或部分候选解能够得到所需解时,问题就能得到解决。
但是,在实际应用中,因为候选解的数量通常都非常大(比如指数级),并且计算机的速度和内存都有限制,因此对问题不加分析的穷尽算法通常只能解决规模很小的问题。
在实际运用中常采用回溯和分枝定界法对问题进行求解。按照这两种方法对候选解进行系统检查通常会使问题的求解时间大大减少(无论对于最坏情形还是对于一般情形)。这二种方法由于都是按规定的路线进行,基本没有使用与问题有关的启发性信息,属于盲目搜索策略。在涉及人工职能的有些问题如博弈问题时,还会用到启发是搜索策略,如A*算法等。
一、回溯法和分枝限界法
问题的表示
状态空间表示法是表示问题及其搜索过程的一种形式表示方法。可以用解空间树来表示问题的结构。 对于一棵树,树中的每一个结点确定所求问题的一个问题状态,由根结点到其它结点的所有路径确定了这个问题的状态空间。解状态是一些问题状态S,对于这些问题状态,由根到S的那条路径确定了这解空间的一个元组。答案状态则是由解状态到根的路径。
对于一种状态空间树,可以先系统地生成问题的状态,接着确定问题状态的解状态,最后确定那些解状态是答案状态从而将这些问题解出。
从根结点开始解问题,如果已经生成一个结点而它的所有儿子结点还没有全部生成,则这个结点叫做活结点。当前正在生成其儿子的活结点叫E结点,不再进一步扩展或者其儿子结点已经全部生成的生成结点就是死结点。
回溯算法使用深度优先方法搜索树结构,而分枝定界一般用宽度优先方法来搜索这些树。
回溯方法的步骤如下:
1) 定义一个解空间,它包含问题的解。
2) 用适于搜索的方式组织该空间。
3) 用深度优先法搜索该空间,利用限界函数避免移动到不可能产生解的子空间。
回溯算法的特性是在搜索执行的同时产生解空间。在搜索期间的任何时刻,仅保留从开始节点到当前E -节点的路径。因此,回溯算法的空间需求为O(从开始节点起最长路径的长度)。
分枝限界法的步骤和回溯的唯一区别是采用了宽度优先的方法来搜索树,因此分枝法消耗的空间比回溯法要多。
这二种搜索策略从本质上来讲都是属于穷尽法的搜索,由于在搜索路径上的不同也造成这二种方法各自都有其优缺点、适用的求解问题也就不同。
宽度优先占有优势的问题:
九宫重排问题
九宫重排问题是一个可以回溯法和分枝法都能解决的问题。但是,对于这个问题运用分枝法是有利的。
九宫重排问题,在3*3的方格棋盘上放置标由数字1、2、3、4、5、6、7、8共8个棋子,初始状态为S 0 ,目标状态为Sg ,当找到一个解时结束搜索。
从根结点到叶子结点的路径即为解,算法为空格左移,空格上移,空格右移,空格下移。
S0
Sg
2
8
3
1
2
3
1
4
8
4
7
6
5
7
6
5
用宽度优先搜索,如下图:
f'(x) = g(x) + h(x)
2 8 3
14
7 6 5
2 8 3
1 4
7 6 5
23
1 8 4
7 6 5
3 8 2
1 6 4
75
3 8 2
1 4
7 6 5
8 3
2 1 4
7 6 5
3 8 2
14
7 6 5
82
2 1 4
7 6 5
2 3 4
1 8
7 6 5
1 2 3
8 4
7 6 5
2 3
1 8 4
7 6 5
2 3
1 8 4
7 6 5
2 8 3
1 6 4
7 5
2 8 3
1 6 4
7 5
3 8 2
14
7 6 5
2 8 3
1 6
7 5 4
2 8 3
6 4
1 7 5
2 8 3
1 4 5
76
28
1 4 3
7 6 5
2 8 3
1 4 5
7 6
28
1 4 3
7 6 5
2 8 3
7 1 4
6 5
2 8 3
74
6 1 5
8 1 3
24
7 6 5
8 3 2
2 1 4
7 6 5
1 2 3
84
7 6 5
16
26
9
8
7
6
2
1
S0
4
3
5
Sg
图示解的路径是 S0-3-8-16-26(Sg)
宽度优先搜索的盲目性较大,当目标结点距离初始结点较远时将会产生许多无用结点,空间浪费较大,搜索效率低,但是只要问题有解,用宽度优先搜索总可以得到解,而且得到的路径最短的解。
用深度优先策略搜索,如下图:
2 8 3
14
7 6 5
2 8 3
1 4
7 6 5
23
1 8 4
7 6 5
3 8 2
1 6 4
7 5
3 8 2
1 4
7 6 5
2 8 3
1 6 4
7 5
2 8 3
1 6 4
7 5
2 8 3
1 6
7 5 4
1
S0
2
2 8
1 6 3
7 5 4
2 8 1 6 3
7 5 4
2 8
1 6 3
7 5 4
3
4
5
6
在深度优先搜索中,搜索一旦进入某个分枝,就将沿着该分枝一直向下搜索,如果该节点恰好在此分支上,则可较快地得到解。但是,如果目标节电不在此分支上,而该分支又是一个无穷分支,则就不可能得到解。
显然该问题用宽度优先搜索的策略是较好的。
经典的N皇后问题
N皇后问题要求求出N个皇后在棋盘上的所有摆法,(该问题很多书籍上都有详细介绍,这儿图表省略),该问题是适合用回溯法来描述和解决的问题,通过深度优先搜索至多需要检索N!个元组,而如果用分枝法,因为要生成所有问题的解,则必须储存检索过程中的E结点,造成储存空间的极度膨胀,这类问题明显是用回溯法占优势的。
回溯法和分枝法是基本的搜索策略,大多数情况下如果找不到更好的解决方案,总是可以用这二种方法尝试。
但是它们有一个很大的缺陷就是都是在一个给定的状态空间中穷举。这在状态空间不大的情况下是很合适的算法,可是当状态空间十分大,且不预测的情况下就不可取了。它的效率实在太低,甚至不可完成。
二、启发式搜索算法
通常在搜索中能直接运用回溯、分枝法的问题并不多,回溯和分枝的过程中,施加一定的条件,对搜索过程中出现的结点进行判断,可以提高效率。
启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。在启发式搜索中,对位置的估价是关键。采用了不同的估价可以有不同的效果。
启发式搜索有很多的算法,如:局部择优搜索法、最好优先搜索法等等。A*也是。这些算法都使用了启发函数,但在具体的选取最佳搜索节点时的策略不同。
局部择优搜索法,就是在搜索的过程中选取“最佳节点”后舍弃其他的兄弟节点,父亲节点,而一直得搜索下去。这种搜索的结果很明显,由于舍弃了其他的节点,可能也把最好的节点都舍弃了,因为求解的最佳节点只是在该阶段的最佳并不一定是全局的最佳。
局部择优搜索法它是对深度优先搜索方法的一种改进。
全局择优搜索是 局部择优搜索的一种改进,试图克服局部择优搜索的的局限性。再搜索时,每次总是从全体的活结点中选取一个估价值最小的节点,
在搜索过程中,启发式搜索的关键是要确定下一个要考察的节点,用于估价节点重要性的函数称为估价函数
f'(x) = g(x) + h(x)
其中g(x)为从初始节点So到节点X已经实际付出的代价;h(x)是从节点X到节点Sg的最优路径的估计代价。h(x)称为启发函数。
九宫重排
当用全局择优搜索求解该问题时,可以设估价函数为 f'(x) = d(x) + h(x)
d(x)表示节点x的深度,h(x)表示节点x的棋局与目标节点棋局位置不相同的棋子数。
2 8 3
14
7 6 5
2 8 3
1 4
7 6 5
23
1 8 4
7 6 5
3 8 2
1 6 4
75
3 8 2
1 4
7 6 5
8 3
2 1 4
7 6 5
3 8 2
14
7 6 5
1 2 3
8 4
7 6 5
2 3
1 8 4
7 6 5
2 3
1 8 4
7 6 5
1 2 3
84
7 6 5
4
6
4
6
6
4
1
S0
4
4
5
Sg
1 2 3
7 8 4
6 5
5
5
S3
S2
S1
图中节点旁标明的数字是该节点的估价函数值。
该问题的解路径为: So-S1-S2-S3-Sg
以上论述一些树型问题基本的搜索的策略,当问题的状态空间是有向图时,节点的重复将导致大量冗余的搜索,甚至时搜索过程陷入无效的循环而无法找到解,这时就需要对估价函数进行限制,A*算法就是针对图的有序搜索的算法。
问题的求解可以有很多方法,而如何建立数学模型,选择问题的求解方式是十分重要的,方法的好坏是面向一个具体的问题的,需要具体问题具体分析
③ 基于社区发现算法和图分析Neo4j解读《权力的游戏》下篇
其中的分析和可视化是用Gephi做的,Gephi是非常流行的图分析工具。但作者觉得使用Neo4j来实现更有趣。
节点中心度
节点中心度给出网络中节点的重要性的相对度量。有许多不同的方式来度量中心度,每种方式都代表不同类型的“重要性”。
度中心性(Degree Centrality)
度中心性是最简单度量,即为某个节点在网络中的联结数。在《权力的游戏》的图中,某个角色的度中心性是指该角色接触的其他角色数。作者使用Cypher计算度中心性:
MATCH (c:Character)-[:INTERACTS]- RETURN c.name AS character, count(*) AS degree ORDER BY degree DESC
character
degree
Tyrion
36
Jon
26
Sansa
26
Robb
25
Jaime
24
Tywin
22
Cersei
20
Arya
19
Joffrey
18
Robert
18
从上面可以发现,在《权力的游戏》网络中提利昂·兰尼斯特(Tyrion)和最多的角色有接触。鉴于他的心计,我们觉得这是有道理的。
加权度中心性(Weighted Degree Centrality)
作者存储一对角色接触的次数作为 INTERACTS 关系的 weight 属性。对该角色的 INTERACTS 关系的所有 weight 相加得到加权度中心性。作者使用Cypher计算所有角色的这个度量:
MATCH (c:Character)-[r:INTERACTS]- RETURN c.name AS character, sum(r.weight) AS weightedDegree ORDER BY weightedDegree DESC
character
weightedDegree
Tyrion
551
Jon
442
Sansa
383
Jaime
372
Bran
344
Robb
342
Samwell
282
Arya
269
Joffrey
255
Daenerys
232
介数中心性(Betweenness Centrality)
介数中心性:在网络中,一个节点的介数中心性是指其它两个节点的所有最短路径都经过这个节点,则这些所有最短路径数即为此节点的介数中心性。介数中心性是一种重要的度量,因为它可以鉴别出网络中的“信息中间人”或者网络聚类后的联结点。
图6中红色节点是具有高的介数中心性,网络聚类的联结点。
为了计算介数中心性,作者使用Neo4j 3.x或者apoc库。安装apoc后能用Cypher调用其170+的程序:
MATCH (c:Character) WITH collect(c) AS charactersCALL apoc.algo.betweenness(['INTERACTS'], characters, 'BOTH') YIELD node, scoreSET node.betweenness = scoreRETURN node.name AS name, score ORDER BY score DESC
name
score
Jon
1279.7533534055322
Robert
1165.6025171231624
Tyrion
1101.3849724234349
Daenerys
874.8372110508583
Robb
706.5572832464792
Sansa
705.1985623519137
Stannis
571.5247305125714
Jaime
556.1852522889822
Arya
443.01358430043337
Tywin
364.7212195528086
紧度中心性(Closeness centrality)
紧度中心性是指到网络中所有其他角色的平均距离的倒数。在图中,具有高紧度中心性的节点在聚类社区之间被高度联结,但在社区之外不一定是高度联结的。
图7 :网络中具有高紧度中心性的节点被其它节点高度联结
MATCH (c:Character) WITH collect(c) AS charactersCALL apoc.algo.closeness(['INTERACTS'], characters, 'BOTH') YIELD node, scoreRETURN node.name AS name, score ORDER BY score DESC
name
score
Tyrion
0.004830917874396135
Sansa
0.004807692307692308
Robert
0.0047169811320754715
Robb
0.004608294930875576
Arya
0.0045871559633027525
Jaime
0.004524886877828055
Stannis
0.004524886877828055
Jon
0.004524886877828055
Tywin
0.004424778761061947
Eddard
0.004347826086956522
使用python-igraph
Neo4j与其它工具(比如,R和Python数据科学工具)完美结合。我们继续使用apoc运行 PageRank和社区发现(community detection)算法。这里接着使用python-igraph计算分析。Python-igraph移植自R的igraph图形分析库。 使用 pip install python-igraph 安装它。
从Neo4j构建一个igraph实例
为了在《权力的游戏》的数据的图分析中使用igraph,首先需要从Neo4j拉取数据,用Python建立igraph实例。作者使用 Neo4j 的Python驱动库py2neo。我们能直接传入Py2neo查询结果对象到igraph的 TupleList 构造器,创建igraph实例:
from py2neo import Graphfrom igraph import Graph as IGraph graph = Graph query = ''' MATCH (c1:Character)-[r:INTERACTS]->(c2:Character) RETURN c1.name, c2.name, r.weight AS weight '''ig = IGraph.TupleList(graph.run(query), weights=True)
现在有了igraph对象,可以运行igraph实现的各种图算法来。
PageRank
作者使用igraph运行的第一个算法是PageRank。PageRank算法源自Google的网页排名。它是一种特征向量中心性(eigenvector centrality)算法。
在igraph实例中运行PageRank算法,然后把结果写回Neo4j,在角色节点创建一个pagerank属性存储igraph计算的值:
pg = ig.pagerank pgvs = for p in zip(ig.vs, pg): print(p) pgvs.append({"name": p[0]["name"], "pg": p[1]}) pgvs write_clusters_query = ''' UNWIND {nodes} AS n MATCH (c:Character) WHERE c.name = n.name SET c.pagerank = n.pg '''graph.run(write_clusters_query, nodes=pgvs)
现在可以在Neo4j的图中查询最高PageRank值的节点:
MATCH (n:Character) RETURN n.name AS name, n.pagerank AS pagerank ORDER BY pagerank DESC LIMIT 10
name
pagerank
Tyrion
0.042884981999963316
Jon
0.03582869669163558
Robb
0.03017114665594764
Sansa
0.030009716660108578
Daenerys
0.02881425425830273
Jaime
0.028727587587471206
Tywin
0.02570016262642541
Robert
0.022292016521362864
Cersei
0.022287327589773507
Arya
0.022050209663844467
社区发现(Community detection)
图8
社区发现算法用来找出图中的社区聚类。作者使用igraph实现的随机游走算法( walktrap)来找到在社区中频繁有接触的角色社区,在社区之外角色不怎么接触。
在igraph中运行随机游走的社区发现算法,然后把社区发现的结果导入Neo4j,其中每个角色所属的社区用一个整数来表示:
clusters = IGraph.community_walktrap(ig, weights="weight").as_clustering nodes = [{"name": node["name"]} for node in ig.vs]for node in nodes: idx = ig.vs.find(name=node["name"]).index node["community"] = clusters.membership[idx] write_clusters_query = ''' UNWIND {nodes} AS n MATCH (c:Character) WHERE c.name = n.name SET c.community = toInt(n.community) '''graph.run(write_clusters_query, nodes=nodes)
我们能在Neo4j中查询有多少个社区以及每个社区的成员数:
MATCH (c:Character) WITH c.community AS cluster, collect(c.name) AS members RETURN cluster, members ORDER BY cluster ASC
cluster
members
0
[Aemon, Alliser, Craster, Eddison, Gilly, Janos, Jon, Mance, Rattleshirt, Samwell, Val, Ygritte, Grenn, Karl, Bowen, Dalla, Orell, Qhorin, Styr]
1
[Aerys, Amory, Balon, Brienne, Bronn, Cersei, Gregor, Jaime, Joffrey, Jon Arryn, Kevan, Loras, Lysa, Meryn, Myrcella, Oberyn, Podrick, Renly, Robert, Robert Arryn, Sansa, Shae, Tommen, Tyrion, Tywin, Varys, Walton, Petyr, Elia, Ilyn, Pycelle, Qyburn, Margaery, Olenna, Marillion, Ellaria, Mace, Chataya, Doran]
2
[Arya, Beric, Eddard, Gendry, Sandor, Anguy, Thoros]
3
[Brynden, Catelyn, Edmure, Hoster, Lothar, Rickard, Robb, Roose, Walder, Jeyne, Roslin, Ramsay]
4
[Bran, Hodor, Jojen, Luwin, Meera, Rickon, Nan, Theon]
5
[Belwas, Daario, Daenerys, Irri, Jorah, Missandei, Rhaegar, Viserys, Barristan, Illyrio, Drogo, Aegon, Kraznys, Rakharo, Worm]
6
[Davos, Melisandre, Shireen, Stannis, Cressen, Salladhor]
7
[Lancel]
角色“大合影”
《权力的游戏》的权力图。节点的大小正比于介数中心性,颜色表示社区(由随机游走算法获得),边的厚度正比于两节点接触的次数。现在已经计算好这些图的分析数据,让我们对其进行可视化,让数据看起来更有意义。
Neo4j自带浏览器可以对Cypher查询的结果进行很好的可视化,但如果我们想把可视化好的图嵌入到其它应用中,可以使用Javascript可视化库Vis.js。从Neo4j拉取数据,用Vis.js的neovis.js构建可视化图。Neovis.js提供简单的API配置,例如:
var config = { container_id: "viz", server_url: "localhost", labels: { "Character": "name" }, label_size: { "Character": "betweenness" }, relationships: { "INTERACTS": }, relationship_thickness: { "INTERACTS": "weight" }, cluster_labels: { "Character": "community" } }; var viz = new NeoVis(config); viz.render;
其中:
节点带有标签Character,属性name;
节点的大小正比于betweenness属性;
可视化中包括INTERACTS关系;
关系的厚度正比于weight属性;
节点的颜色是根据网络中社区community属性决定;
从本地服务器localhost拉取Neo4j的数据;
在一个id为viz的DOM元素中展示可视化。
④ 论文整理(1)社交网络影响力
社会网络分析理论:
在社会网络[63]由人类学家Barnes最早提出的概念,他在社会网络的分析基础上统地研究挪威一个小渔村的跨亲缘与阶级的关系。在社会网络分析中,存在一些经典的理论。这些理论主要包括:六度分割理论、弱关系理论、150法则、小世界网络理论、马太效应等。基于社会网络有关的研究方向和内容,在不同的领域着发挥着各自的作用,例如,社会影响力分析,社区发现,信息传播模型,链接预测,基于社会网络的推荐。
150法则是指一个人能保持稳定社交关系的人数上限通常为150人。1929年由英国罗宾•邓巴教授(Robin Dunbar)提出了经典的”150定律”理论,该定律同时也被称为“邓巴数字”[64]。这个定律在我们的实际日常生活中的应用是相当普遍的,SIM卡中只能存储150个联系人的电话,微软的MSN中也只可以最多把150位联系人的信息添加到自己的名单中[64]等等。
小世界网络是一种具有特殊结构的复杂网络,在这种网络中大部份的节点是不相邻的,但绝大部份节点之间是连通的且距离很短。六度分割理论也是小世界网络理论的一种体现。在多数现实世界的社会网络中,尽管网络中的节点数量巨大,网络中相邻的节点相对较少,但每两个节点间往往只需要很短的距离便能连通。
六度分割就是指一个人与其他任何一个人之间建立起联系,最多都只需要经过六个人。所以,即便邓巴数字告诉我们,我们是能力上维持一个特别大的社交圈的,但是六度分割理论却可以告诉我们,通过我们现有的社交人脉圈以及网络可以无限扩张我们的人脉圈,在需要的时候都能够和地球中想要联系的任何人取得联系。
弱关系理论弱关系(Weak Tie)是指需要较少或不需要情感联系的人们之间的社会联系,这种联系几乎不需要耗费个人的时间或精力来维系,但这种联系却很有作用。美国社会学家Mark Granovetter在研宄人们在求职过程中如何获取工作信息时发现[65],由家人、好友等构成的强关系在获取工作信息过程中起到的作用很有限,而那些关系较疏远的同学、前同事等反而能够提供更加有用的求职信息。
马太效应可以理解为达尔文进化论中适者生存的理念。在社交网络的发展过程如同生物进化的过程,存在强者越强、弱者越弱的现象。也就是说,在社交网络中越是处于网络核心的节点很大可能会变来越核心,而那些处于社交网络中边缘地带的节点或许会越来越不重要甚至直至消失。那些在社交网络中相比其他节点拥有更大影响力的节点,其带给该网络的影响也要比那些拥有弱影响力的节点所带来的影响要强。
从不同角度探索节点影响力挖掘算法:
1.基于邻节点中心性的方法。这类方法最简单最直观,它根据节点在网络中的位置来评估节点的影响力。度中心性[13]考察网络中节点的直接邻居数目,半局部中心性[14]考察网络中节点四层邻居的信息,ClusterRank[15]同时考虑了网络中节点的度和聚类系数。
2.基于路径中心性的方法。这类方法考察了节点在控制信息流方面的能力,并刻画节点的重要性。这类方法包括子图中心性[16]、数中心性[17](一些演化算法包括:路由介数中心性[18],流介数中心性[19],连通介数中心性[20],随机游走介数中心性[21]等)及其他基于路径的挖掘方法。
3.迭代寻优排序方法。这类方法不仅考虑了网络中节点邻居的数量,并且考虑邻居质量对节点重要性的影响,包括了特征向量中心性[13],累积提名[22],PageRank算法[23]及其变种[24-32]。
4.基于节点位置的排序算法。这类方法最显着的特点是,算法并没有给出一个计算节点重要性的定义,而是通过确定节点在网络中的位置,以此来确定节点的重要程度。在网络核心位置的节点,其重要性就相对较高,相反的,若节点处于网络边缘,那么它的重要性就会比较低。基于节点位置的以及不同应用场景的推荐算法具有重要的研究意义[34-37]。
节点影响力评估方法:
在社交网络节点影响力的评估方法主要可以分为三类,基于静态统计量的评估方法、基于链接分析算法的评估方法,基于概率模型的评估方法。
众学者在静态统计量的方法上,结合不同社交网络中相关信息,借鉴链接分析法以及建立概率模型来评估节点影响力,对社交网络节点影响力可以做到更有效的评估[66]。
1)基于静态统计量度量方法
主要是通过网络中节点的一些静态属性特征来简单直接地体现节点的影响力,但面对社交网络中复杂信息以及不同平台,并不能有效地度量不同社交网络中节点影响力。如度中心性,主观认为节点的重要性取决于与其他节点连接数决定,即认为一个节点的邻居节点越多,影响力越大。在有向网络中,根据边的方向,分为入度和出度,在有权网络中,节点的度可以看作强度,即边的权重之和。度中心性刻画了节点的直接影响力,度中心性指标的特点是简单、直观、计算复杂度低,也具有一定合理性。
但针对不同平台的网络结构中,度中心性的影响力效果未必能达到目标效果,而且社交网络中用户间关系的建立具有一定的偶然性,而且不同的用户间的关系强度也不同。度中心性没有考虑了节点的最局部信息,虽然对影响力进行了直接描述,但是没有考虑周围节点处所位置以及更高阶邻居。众学者在静态统计量的方法上,结合不同社交网络中相关信息,借鉴链接分析法以及建立概率模型来评估节点影响力,对社交网络节点影响力可以做到更有效的评估[66-67]。
2)基于链接分析算法的方法
链接分析算法(Link Analysis)主要应用在万维网中用来评估网页的流行性。通过超链接,万维网中的网页连接成一个网络,同时这个网络也具备了小世界网络的特征,且微博平台中的关注和粉丝关系与网页的链入与链出十分相似,因此链接分析法的思想也被应用在了微博社交网络中节点影响力的评估中。经典的算法是PageRank[68]和HITS算法[69](Hyperlink-Inced Topic Search)。
PageRank算法模型,是Google在搜索引擎结果中对网站排名的核心算法,核心思想通过计算页面链接的数量和质量,来确定网站的重要性的粗略估计,即节点的得分取决于指向它的节点的数量和这些节点的本身得分。即有越多的优质节点指向某节点时它的得分越高。
HITS算法是由Jon Kleinberg于1997年提出的。HITS算法模型中,有两类节点,权威(Authority)节点,和枢纽(Hub)节点。权威节点在网络中具有高权威性,枢纽节点具有很个指向边的节点。通过计算网络中每个节点的Authority权威值和Hub枢纽值来寻找高权威性的节点。即求值过程是在迭代中计算Authority和Hub值,直到收敛状态。Hub值和Authority值计算公式。
通过多数研究者发现,将链接分析法结合社交网络特性可以更好的对用户影响力进行评估,由于技术的快速发展,社交网络的多变性,因此如何将社交网络中的复杂数据和用户行为与相关算法进行结合,仍是需要我们继续研究的方向。
3)基于概率模型的方法
主要是建立概率模型对节点影响力进行预测。这么多学者将用户影响力作为参数对社交网络中的节点用户行为建立概率模型,并根据社交网络中已有的用户数据求解概率模型,得出用户影响力。
文献[70]认为用户间影响力越大、被影响用户的活跃度和转发意愿越高,则其转发另一个用户的信息的概率越大,所以利用用户影响力、转发意愿和活跃度等构建转发概率模型。通过用户发布的tweet数量、转发的tweet数和用户的历史转发行为数据,计算出用户活跃度、转发意愿和转发概率,进而社交网络中用户影响力。
文献[71]在度量影响力时融合了用户发布信息的主题生成过程,认为兴趣相似或经常联系的用户间影响力较强,用户的行为受其朋友的影响也受其个人兴趣的影响。基于这些假设,结合文本信息和网络结构对LDA模型进行扩展,在用户发布信息的基础上建立模型,通过解模型计算得出用户间基于主题的影响力。
文献[72]认为转发概率同样可以体现用户间的影响力,根据用户间的关注关系。历史转发记录,利用贝叶斯模型预测用户间的转发概率。
文献[73]考虑了用户建立关注关系的原因,用户被关注可能是与关注者兴趣投,也可能受用户的影响力影响。将基于用户的主题建模和基于主题的影响力评估相结合,并在同一个生成模型中进行计算,提出基于LDA算法模型的扩展算法模型FLDA模型(Followship-LDA)。
[13] P. Bonacich. Factoring and weighting approaches to status scores and clique identification[J]. Journal of Mathematical Sociology, 1972, 2(1): 113-120
[14]D.Chen,L.Lü,M.S.Shang,etal.[J]. Physica A, 2012, 391(4): 1777-1787
[15] D. B. Chen, H. Gao, L. Lü, et al. Identifying influential nodes in large-scale directed networks: The role of clustering[J]. PLoS One, 2013, 8(10): e77455
[16]E.Estrada, J.A. Rodriguez-Velazquez.[J].Physical Review E, 2005, 71(5): 122-133
[17]L.C.Freeman.[J].Sociometry,1977, 40(1): 35-41
[18] S. Dolev, Y. Elovici, R. Puzis. Routing betweenness centrality[J].Journal of the ACM, 2010, 57(4): 710-710
[19] Y. Gang,Z.Tao, H. Bo,etal. [J].PhysicalReviewE, 2005, 73(4): 46108
[20] E. Estrada, D. J. Higham, N. Hatano. Communicability betweenness in complex networks[J]. Physica A, 2009, 388(5): 764-774
[21]M.E.J.Newman.[J].Social networks, 2005, 27(1): 39-54
[22]R.Poulin,M.C.Boily,B.R.Masse. networks[J]. Social networks, 2000, 22(3): 187-200
[23] B. S. Brin, L. Page. The anatomy of a large scale hypertextual Web search engine[J]. Computer Networks & ISDN Systems, 1998, 30: 107-117
[24] P. Jomsri, S. Sanguansintukul, W. Choochaiwattana. CiteRank: combination similarity and static ranking with research paper searching[J]. International Journal of Internet Technology & Secured Transactions, 2011, 3(2): 161-177
[13][25]H.S.Bhat,B.Sims.[D].California: University of California. 2012
[26] J. Weng, E. P. Lim, J. Jiang, et al. Twitterrank: finding topic-sensitive influential twitterers[C]. Third International Conference on Web Search & Web Data Mining, ACM, 2010, 261-270
[27]Y.B.Zhou,L.Lu,M.Li.: [J].NewJournalofPhysics,2012,14(14): 33033-33049
[28] J. Xuan, H. Jiang, Z.Ren, et al. Developer prioritization in bug repositories[C]. International Conference on Software Engineering, 2012, 25-35
[29]Q.Li,T.Zhou,L.Lü,etal.[J]. Physica A, 2013, 404(24)47-55
[30] L. Lü, Y. C. Zhang, C H Yeung, et al.Leaders in social networks, the delicious case[J]. PLoS One, 2011, 6(6): e21202
[31]J.M.Kleinberg.[J].Authoritative sources in a hyperlinked environmen, 1999, 46(5): 604-632
[32]R.Lempel,S.Moran.Thestochasticapproachforlink-structureanalysis(SALSA)andthe TKC effect[J]. Computer Networks, 2000, 33(2): 387-401
[33]T.Martin,X.Zhang,M.E.J.Newman.[J].Physical Review E, 2014, 90(5): 052808
[34] A. Banerjee, A. G. Chandrasekhar, E. Duflo, et al. Gossip: Identifying central indivials in a social network[R]. National Bureau of Economic Research, 2014.
[35]S.Ji,L.Lu,C.H.Yeung,etal. percolation in social networks[J]. arXiv preprint arXiv:1508.04294, 2015.
[36] S. Y. Tan, J. Wu, L. Lü, et al. Efficient network disintegration under incomplete information: the comic effect of link prediction[J]. Scientific Reports, 2016, 6.
[37]任晓龙,吕琳媛.网络重要节点排序方法综述[J].科学通报, 2014,59(13): 1175-1197
[63]贝克,晓冬.社会资本制胜:如何挖掘个人与企业网络中的隐性资源[M].上海交通大学出版社,2002.
[64]天涯.六度分隔理论和150法则[EB/OL].http://blog.sina.com.cn/s/blog_62bae1640100|5f3.html.[2010-07-14].
[65]Granovetter M S.The Strength of Weak Ties[J]. American journal of sociology, 1973: 1360-1380.
[66]王梓.社交网络中节点影响力评估算法研究[D].北京邮电大学, 2014.
[67] Meeyoung Cha, Hamed Haddadi,Fabricio Benevenutoets. Measuring User Influence in Twitter: The Million Follower Fallacy[C]. Proceedings of the 4th International AAAI Conference on Weblogs and Social Media (ICWSM),2010:10-17
[3][68] Page, Lawrence, Brin, et al. The PageRank citation ranking[C]// BringingOrder to the Web. Stanford InfoLab. 1998: 1-14.
[4][69]Kleinberg J M. Authoritative sources in a hyperlinked environment[J]. Journal of the ACM, 1999, 46(5): 604-632.
[70]Zibin Yin, Ya Zhang. Measuring Pair-Wise Social Influence inMicroblog[C], 2012 ASE/IEEE International Conference on SocialComputing and 2012 ASE/IEEE International Conference on Privacy,Security, Risk and Trust, 2012: 502-507.
[71]Lu Liu, Jie Tang, Jiawei Han, Meng Jiang, Shiqiang Yang. Mining topic-level influence in heterogeneous networks[C]. Proceedings of the 19th ACMinternational conference on information and knowledge management, 2010: 199-208.
[72] Qianni Deng, Yunjing Dai. How Your Friends Influence You: Quantifying Pairwise Influences on Twitter[C], International Conference on Cloud and Service Computing, 2012:185-192.
[73] Bi, Bin, et al. Scalable Topic-Specific Influence Analysis on Microblogs[C], Proceedings of the 7th ACM international conference on Web search and data mining,2014: 513-522.
⑤ 数据结构和算法为什么这么重要
算法都是从生活里得到的,生活里用的很自如,应用到程序里一样会很方便。
比如最简单的,中国有那么多省,每个省有那么多市,每个市有那么多区县之类的,看到一个小地方,怎么才能知道它在哪,很明显,去看它在哪个区,哪个市,哪个省。
这就是树的作用,从子节点通过父节点去确定它的位置。这个同样应用在文件管理,还有特殊的比如要求设计个数据库,能够体现部门,小组的包含关系,很简单,在小组里面加个父节点的字段就可以了。
再比如查字典,给了一个字,怎么才能查到它?通过读音,知道它的首字母,就很容易的去从首字母找到它。如果字典是乱的,就完全无从下手,这就是hash算法的东西,通过能够区分出来的特征,缩小查找范围,加快查找效率。
同样的很多,都是可以用到程序里的,很容易理解
⑥ 图的节点特征
我的微信公众号是“黄泓图计算分享”,很多朋友反映公众号上看文章不方便,就在上同步一份
图包含两大要素:节点和边。节点和边上都可以有属性,边既可以有方向也可以无向。对于图的建模,可以包含结构上的特征和聚集的特征。特征表征的粒度,可以是节点,边,子图等等。
本文先从最常见的情况讲起:以节点为粒度的结构特征。以节点为粒度的结构特征,往往同时会作为图嵌入(Graph Embedding)算法的输入,从而得到描述节点所在的局部结构的向量。例如度以及三角形的个数,可以作为Role2vec[5]或者GraphSage[6]的输入。这些后面再详谈。
以节点为粒度的结构特征,最简单的是度(degree),也就是一个节点关联的邻居节点的个数。在很多应用中,想必大家都有意无意用过这个特征。
节点的重要性
描述节点重要性的特征,一般有两类:一类是基于一定的定义直接描述的特征,如度,介数中心性和紧密中心性等等。另外一类是源于互联网链接分析的算法,如HITS算法和PageRank算法。
根据定义直接描述的节点重要性
介数中心性(betweeness) 描述的是一个节点作为枢纽节点的重要程度。描述一个节点作为枢纽的重要程度还有别的方法(如HITS,下面会提到),介数中心性采用的是最粗暴的定义方法:一个节点的介数中心性是经过这个节点的最短路径条数与所有最短路径条数的比值。因为定义简单粗暴,所以计算起来也比较麻烦。如果要进行分布式计算的话需要设计特殊的算法。比较好的一个实现来自sparkling graph:
https://github.com/sparkling-graph/sparkling-graph/tree/master/operators/src/main/scala/ml/sparkling/graph/operators/measures/vertex/betweenness
这里betweeness使用了两个实现,分别是Edmonds[1]和Hua[2]。亲测Hua的实现效率更加高一些,奈何话题太冷,论文没什么人引用。
紧密中心性(closeness centrality) 描述一个节点到图中其他节点的难易程度。取的是这个节点到图中其他节点的距离平均数的倒数。如果这个值比较大,那么说明这个节点到其他节点大部分都是经过很少的几步就行,整个图结构比较紧密。对于这个指标,sparkling graph也有比较好的实现。
三角形计数(triangle count) 是用来描述一个图中的顶点之间聚集密集程度的系数。节点所在的局部结构越密集,三角形个数越多。对于这个指标,spark graphx有比较好的实现。
基于链接分析的节点重要性特征
HITS算法和PageRank算法最初的提出都是用于衡量Web图模型中页面的重要程度。他们基于不同的假设。
用户浏览网页的随机游走模型(Random Surfer Model)
用户浏览网页的随机游走模型(Random Surfer Model)假设用户随机游走网页由两部分构成:
(1)直接跳转:用户进入一个网页a,并且以等概率访问这个网页的链接(假设这个网页有d个链接,则为1/d)
(2)远程跳转(teleporting):用户浏览到某个程度之后决定不再继续深入,而是输入另外一个网址重新浏览。
PageRank算法
假设:
(1) 数量假设: 一个页面节点接收到的入链数量越多,他就越重要
(2) 质量假设: 如果指向一个页面节点的页面节点重要,这个页面就越重要
基于这样的假设以及random surfer model可以得到PageRank的迭代公式。首先一个页面节点a可能以两者方式受到访问:一种是远程跳转,一种是直接跳转。
假设图中有N个节点,用户有概率1-p会进行远程跳转,则远程跳转的概率是:
进入远程跳转的概率 x 选中这个节点的概率=(1-p)x(1/N)
第二种方式是有其他节点等概率跳转而来。假设节点a的一个邻居b,b自己有degree(b)个邻居,b自己的page rank分数为PR(b),则b能够给a的分数为PR(b)/degree(b)。a的所有邻居能分给a的page rank分数加起来,再乘以用户进入直接跳转的概率p,就是在直接跳转这种方式下节点a能够得到的page rank分数。
远程跳转和直接跳转两部分分数结合起来,也就是大家一般在博客里看到的page rank迭代公式。
HITS算法
HITS算法认为节点有两个特性:一是节点本身的重要程度,即权威度(Authority)。二是节点作为引向重要节点的枢纽节点的重要程度,即枢纽度(Hub)。
假设:
(1)一个Authority值高的节点应该有很多Hub值高的节点指向
(2)一个Hub值高的节点应该指向很多Authority值高的节点
HITS的迭代方式就是这样Authority值和Hub值迭代相互增强:
(1)一个节点的Authority值是指向他的节点的hub值之和(对应假设1)
(2)一个节点的Hub值是他指向的节点的Authority值之和(对应假设2)
执行1,2直到收敛
如果没有种子集合,HITS的初始值可以所有节点的authority和hub值都设置为1。如果有种子集合,则构图方式为对种子集合进行扩充,凡是和种子集合里面的节点有直接指向关系的节点都扩充进来,然后使用上述的迭代步骤。
应用场景
PageRank可以用于仅仅依靠链接指向判断图中的重要节点。HITS和page rank值本身也可以作为节点特征输入分类模型。例如对于企业违约风险的预测当中,[3]提到基于企业之间的担保关系可以构建一个有向图。这个论文使用了不同的图特征作为输入,发现HITS得到的authority和hub值的特征权重比较大。作者对此的解释是:风险大的企业,需要找很多公司担保,从而authority值高,最后违约率高。风险低,稳健的企业,倾向于担保很多企业,Hub值就会很高。其实单纯从这个角度来讲,直接用节点的出度和入度做特征也是可以的。HITS得到的好处在于可以实现Hub和Authority分值的相互增强。
HITS与PageRank在应用场景上的一个重要区别是HITS可以从一个有标注的种子集合向外扩充得到其他同样相关的节点中的重要节点。[4]使用HITS从一个专家标注的与“时尚”有关的网页地址的种子集合进行扩充,自动对外部关联的网页与“时尚”的相关性进行排序。重要的一点是作者提到PageRank和HITS在使用场景上的重要区别:
(1)PageRank在你有比较完整的链接信息的时候才有效,而HITS可以在链接信息不完整的时候也发挥作用
(2)HITS可以利用人工标注的样本进行挖掘,PageRank不行(除非personalized page rank,不过那是另一个故事了)
引用
[1]Edmonds N , Hoefler T , Lumsdaine A . A space-efficient parallel algorithm for computing betweenness centrality in distributed memory[C]// 2010 International Conference on High Performance Computing, HiPC 2010, Dona Paula, Goa, India, December 19-22, 2010. IEEE, 2010.
[2] Hua Q S , Fan H , Ai M , et al. Nearly Optimal Distributed Algorithm for Computing Betweenness Centrality[C]// IEEE International Conference on Distributed Computing Systems. IEEE, 2016.
[3] Niu Z, Cheng D, Yan J,et al. A hybrid approach for riskassessment of loan guarantee network[J]. Papers, 2017.
[4]https://www.confluent.io/blog/ranking-websites-real-time-apache-kafkas-streams-api/
[5]Ahmed N K , Rossi R , Lee J B , et al. Learning Role-based Graph Embeddings[J]. 2018.
[6]Hamilton W L , Ying R , Leskovec J . Inctive Representation Learning on Large Graphs[J]. 2017.
⑦ 网络中关键节点的识别
最近半年一直在尝试从复杂的关系网络中,挖掘可能从事某种恶意的团伙,比如在交易数据中挖掘潜在可疑交易的诈骗团伙等。在对全网的复杂网络分团后,面临一个问题,就是需要识别可疑恶意团伙的核心节点,或者关键节点。
从调研的情况来看,主要有如下衡量节点重要性的手段:
这是一种最简单也最直观的衡量方式,计算网络中每个节点的度数,根据度数大小衡量重要性。度数越大,说明与该节点连接的节点越多,即该节点越重要。典型的案例,如微博的大V,因为其分数多,度数高,因此根据度衡量,大V们往往会被计算为团中的关键节点。
优点:计算简单,成本低,是一种考虑节点近邻的排序方式。
存在的问题:缺乏全局的考虑,因为其仅考虑了1度关联的节点数,甚至没有考虑关联节点的重要性。如果某个大V购买了很多僵死粉,也会被计算为关键节点,虽然这个“大V”对其他正常用户的影响力很小。
某个节点的介数,是指网络中所有的最短路径中经过该节点的路径数。介数越高,说明网络中任意两个人的关系与这个节点的关系越大,即这个节点在全局中的影响力越大,也就越重要越关键。
优点:相比度,介数考虑节点在整个网络中的重要程度,是一种基于路径的衡量,或叫排序方式。
存在的问题:计算时间复杂度较大,尤其在节点较多的网络中,在实际应用中需要进行优化。
核度也是一种基于近邻度量的计算方式。对网络从外围一层一层剥离直到没有节点,节点的核度是指该节点处于被剥离的位置。如度为1的节点为最外层,也就是核度为1的层,剥离这些节点后,会再次出现度为1的节点,重复剥离。值得注意的是,并不是度越大的节点,核度越大,越最后被剥离。
如果一个节点的核度越大,越是最后被剥离,说明它越处于网络中的中心位置,也就越重要。
优点:相比度的局限性,核度考虑了节点在整个网络的重要程度,并且计算复杂度没有明显增大。
存在的不足:划分力度太粗,导致很多看起来并不属于同一层级的节点,被划分为相同的重要层级,即每一次剥离的节点很多。
除了上述3个指标,还有很多其他衡量节点的方式,如H指数等。综合来看,挖掘和识别网络中的重要节点,目前存在如下的问题:
1、无法找到一种适合所有网络结果的衡量方式,也就是说,不同网络结果的节点重要性衡量是不一样的。
2、即使在明确的衡量公式下,不同参数也会导致结果不同。
3、众多的分析算法都是对单个点的重要性衡量,而不是节点集,重要的节点集,并不是单个节点的集合,而是对复杂网络的一种抽取。