一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

基于直方图的K-core算法、装置、设备及存储介质

2022-07-16 15:42:22 来源:中国专利 TAG:

基于直方图的k-core算法、装置、设备及存储介质
技术领域
1.本发明涉及k-core分解算法技术领域,具体涉及一种基于直方图的k-core算法、装置、设备及存储介质。


背景技术:

2.随着万物互联时代的数据爆炸,网络数据规模变得十分巨大,图结构也日趋复杂。针对数据量过大的问题已经有成熟的分布式算法和外存算法解决,节点间大量的通信也是算法的瓶颈。虽能解决超大图的计算问题却无法进行加速计算。针对并行加速的问题有一些基于多核cpu和基于共享内存的算法,还有少量基于gpu的算法。由于cpu的核数和内存带宽的限制,不能达到高性能的计算要求。
3.k-core分解算法是一种图挖掘基本算子之一,用来在图中找出符合指定核心度的紧密关联的子图结构,该子图每个节点至少有k个邻接点。k-core分解是一种最基本的度量节点重要程度的方法,该问题及其相关变体,如core number、k-shell,退化排序,广泛应用于社交网络的用户分析、可视化,分析网络起源和演化过程等场景中。
4.k-core算法主要有两种策略:
5.(1)逐层剥离策略。该策略自底向上地迭代删除度数最小的点集合和对应边,并将其核数置为其当前度数,直到所有点的核数都确定为止。
6.(2)局部收敛策略。该策略自顶向下地根据邻接点的核数估算节点的核数,再进行反向传播对邻接点重新估算,迭代该过程直到所有节点的核数不再变化为止。
7.逐层剥离是一种直接求解符合条件的k-core策略,迭代过程需要遍历整个图,访问所有节点度数,找出符合条件的节点,然后将邻接点的度数都减一。
8.局部收敛策略计算核数时首先遍历邻接点进行正向收敛得到一个新的coreness(核数)值,命名为coreness
new
,然后再次遍历coreness
new
≠coreness
old
的邻接点进行反向传播。相对于剥离策略需要遍历整个图,计算过程只需访问邻接点,不需要访问整个图。因此局部收敛策略具有很好的扩展性,适用于分布式环境或外存计算解决超大规模的k-core问题。
9.相比之下,逐层剥离算法少遍历一次邻接点,算法速度更快,扩展性较差,适用于基于内存的k-core问题。由此可以看出,目前无论是逐层剥离策略还是局部收敛策略,都存在其自身的问题。


技术实现要素:

10.针对现有技术中存在的缺陷,本发明第一方面提供一种基于直方图的k-core算法,其在具备扩展性的同时还能保证计算速度。
11.为达到以上目的,本发明采取的技术方案是:
12.一种基于直方图的k-core算法,该方法包括以下步骤:
13.根据每个节点的邻接点的度数分布建立对应节点的直方图;
14.基于当前的直方图,对涉及的节点进行正向收敛和反向广播,以完成一次迭代,并对正向收敛和反向广播的过程中核数发生变化的节点的直方图进行修改;
15.重复迭代过程,以所有节点的直方图不发生变化时的长度作为各个节点的稳态核数。
16.一些实施例中,所述根据每个节点的邻接点的度数分布建立对应节点的直方图,包括:
17.将每个节点的核数初始化为度数,每个节点的度数为该节点的邻接点数量;
18.根据一节点的度数大小,确定该节点的邻接点的度数分布的度数值种类,统计该节点的邻接点的度数在每种度数值下所包括的个数;
19.以度数值种类作为直方图长度,并以每种度数值下所包括的个数作为直方图的数据,来建立对应节点的直方图。
20.一些实施例中,所述根据一节点的度数,确定该节点的邻接点的度数分布的度数值种类,包括:
21.当一节点的度数为n时,确定该节点的邻接点的度数分布的度数值种类为n,其中n为自然数。
22.一些实施例中,所述基于当前的直方图,对涉及的节点进行正向收敛和反向广播,以完成一次迭代,并对正向收敛和反向广播的过程中核数发生变化的节点的直方图进行修改,包括:
23.以当前的直方图长度作为每个节点当前核数,确定因支持度不够而不能维护当前核数的活动节点集合;
24.更新活动节点集合中的节点的核数,使得更新后的核数在具有足够支持度的同时尽可能大,并基于更新后的核数对活动节点集合中的节点的直方图的长度和数据进行修改,以完成节点的正向收敛;
25.确定活动节点集合中的节点不能为其邻接点提供支持度的邻接点集合;
26.更新邻接点集合中的节点的核数,使活动节点集合中的节点可为邻接点集合中的节点提供支持度,并基于更新后的核数对邻接点集合中的节点的直方图的长度和数据进行修改,以完成节点的反向广播。
27.本发明第二方面提供一种实现基于直方图的k-core算法的装置,其在具备扩展性的同时还能保证计算速度。
28.为达到以上目的,本发明采取的技术方案是:
29.一种实现基于直方图的k-core算法的装置,包括:
30.生成模块,其根据每个节点的邻接点的度数分布建立对应节点的直方图;
31.迭代模块,其基于当前的直方图,对涉及的节点进行正向收敛和反向广播,以完成一次迭代,并对正向收敛和反向广播的过程中核数发生变化的节点的直方图进行修改;
32.所述迭代模块还用于重复迭代过程,以所有节点的直方图不发生变化时的长度作为各个节点的稳态核数。
33.一些实施例中,所述生成模块根据每个节点的邻接点的度数分布建立对应节点的直方图,包括:
34.将每个节点的核数初始化为度数,每个节点的度数为该节点的邻接点数量;
35.根据一节点的度数大小,确定该节点的邻接点的度数分布的度数值种类,统计该节点的邻接点的度数在每种度数值下所包括的个数;
36.以度数值种类作为直方图长度,并以每种度数值下所包括的个数作为直方图的数据,来建立对应节点的直方图。
37.一些实施例中,所述生成模块根据一节点的度数,确定该节点的邻接点的度数分布的度数值种类,包括:
38.当一节点的度数为n时,确定该节点的邻接点的度数分布的度数值种类为n,其中n为自然数。
39.一些实施例中,所述迭代模块基于当前的直方图,对涉及的节点进行正向收敛和反向广播,以完成一次迭代,并对正向收敛和反向广播的过程中核数发生变化的节点的直方图进行修改,包括:
40.以当前的直方图长度作为每个节点当前核数,确定因支持度不够而不能维护当前核数的活动节点集合;
41.更新活动节点集合中的节点的核数,使得更新后的核数在具有足够支持度的同时尽可能大,并基于更新后的核数对活动节点集合中的节点的直方图的长度和数据进行修改,以完成节点的正向收敛;
42.确定活动节点集合中的节点不能为其邻接点提供支持度的邻接点集合;
43.更新邻接点集合中的节点的核数,使活动节点集合中的节点可为邻接点集合中的节点提供支持度,并基于更新后的核数对邻接点集合中的节点的直方图的长度和数据进行修改,以完成节点的反向广播。
44.本发明第三方面提供一种设备,其在实现基于直方图的k-core算法时,在具备扩展性的同时还能保证计算速度。
45.为达到以上目的,本发明采取的技术方案是:
46.一种设备,所述设备包括处理器、存储器、以及存储在所述存储器上并可被所述处理器执行的计算机程序,其中所述计算机程序被所述处理器执行时,实现上述的基于直方图的k-core算法的步骤。
47.本发明第四方面提供一种计算机可读存储介质,其在实现基于直方图的k-core算法时,在具备扩展性的同时还能保证计算速度。
48.为达到以上目的,本发明采取的技术方案是:
49.一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,其中所述计算机程序被处理器执行时,实现上述的基于直方图的k-core算法的步骤。
50.与现有技术相比,本发明的优点在于:
51.本发明中的基于直方图的k-core算法将收敛算法收敛操作得到的临时分布数组变成全局数组,不需要多次重复遍历邻接点求得分布数组。算法迭代过程为每个节点记录邻接点的coreness分布作为全局数组,根据这个数组得到coreness
new
,再去修改邻接点的全局分布数组。把全局分布数组发生变化的节点作为下一轮的活动节点,直到所有节点的coreness都不再变化,算法收敛。区别在于节点的cnt变成一个统计分布数组。这样就减少了对邻接点的遍历,转化为访问该节点的统计分布数组。
52.本发明中的算法使用空间置换时间的方法提高了算法效率,也依旧使用以节点为
中心的计算方式,也就继承了局部收敛的扩展性,通过访问节点的全局直方图数组减少了一次邻接点的遍历,具有近似剥离算法的计算速度的,同时算法可以设计为以节点为中心的并行算法。
附图说明
53.图1为现有技术中逐层剥离策略和局部收敛策略的流程图;
54.图2为节点的示例图;
55.图3为本发明实施例中基于直方图的k-core算法的流程图;
56.图4为图3中步骤s1的流程图;
57.图5为图3中步骤s2的流程图;
58.图6为本发明实施例中迭代算法的第一阶段的示意图;
59.图7为本发明实施例中迭代算法的第二阶段的示意图;
60.图8为本发明实施例中迭代算法的第三阶段的示意图;
61.图9为本发明实施例中迭代算法的第四阶段的示意图;
62.图10为本发明实施例中迭代算法的第五阶段的示意图;
63.图11为本发明实施例中迭代算法的最终阶段的示意图。
具体实施方式
64.针对为使本技术实施例的目的、技术方案和优点更加清楚,下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本技术的一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本技术保护的范围。
65.需要说明的是,为便于理解本发明中的内容,先对k-core算法的两种策略做出如下说明:
66.k-core的概念是每个节点至少有k个邻接点,假若一个无向图是五个节点的完全图,每个节点的度数都为4,所以这是一个4-core,同时也是3-core,2-core,1-core。一个节点可能处于多个k-core中,把那个最大的k-core的k值记作core number或者稳态的coreness,支持度就是针对所处的k-core来说的,对一个有五个节点的无向图来说,每一个节点都处于4-core中,每个节点的邻接点都能为其提供一个可以使其为4-core的支持度。
67.一个节点的核数coreness值的上界是其度数degree,而core number表示节点的稳态的coreness。但是这些节点的coreness不确定是否处于稳定状态,处于不稳定状态时称之为瞬态的coreness,瞬态的coreness只是度数和稳态的coreness的一个中间值,这是算法迭代过程中出现的值。算法迭代至所有节点的coreness不变时,才能判断所有节点的coreness都处于稳态,也就是求出了所有节点的稳态的coreness值或者core number。
68.局部收敛策略其实利用了h-index概念。度数是h-index的零阶值,core number或者稳态的coreness就是h-index无穷阶值,瞬态或者不稳定态的coreness必定是两者中间的值,即小于等于degree大于等于core number。下文中coreness大都指的是不稳定的coreness,也就是迭代过程中的coreness,或者称作coreness的上界。只有算法结束以后才
称作core number。
69.基于内存的k-core算法主要有bz算法。该算法采用逐层剥离策略,其主要计算步骤是初始化k为图中节点度数最低的值,删除图中所有节点度数小于等于该值的节点和其对应的边并标记其为core number为k,迭代该过程直到剩余节点度数都大于该值为止。重复该过程直到所有节点被删除,则求出了所有节点的core number。具体过程可参见图一左侧的逐层剥离流程。第一次迭代所有节点的度数,删除度数小于1的点,将其coreness置为1,删除对应边(5,1),即将节点1的度数减一,此时所有节点度数都大于1。第二次迭代遍历所有节点度数,删除度数小于等于2的节点和边,即删除节点4,将其coreness置为2,节点1和节点7的度数减一。重复该过程直到所有节点都被删除,此时所有节点的core number都已经确定。
70.基于外存的k-core算法主要有semicore。k-core的局部性定理为:一个节点core number为k的充分必要条件是至少有k个邻接点的core number大于等于k至多有k个邻接点的core number大于等于k 1。该算法以节点为中心,初始化每个节点的coreness值为其度数。首先进行正向传播,根据局部性定理遍历邻接点的coreness值计算其coreness值,并记录一个cnt值表示邻接点对该节点的支持度,如果节点coreness值发生变化则进行反向传播更新邻接点的cnt值,迭代计算cnt《coreness的这些节点,直到所有节点收敛便求出所有节点的core number。
71.下面结合图2阐述局部性定理:
72.首先以节点1为分析对象进行分析,节点1的邻接点和对应度数为{0:4,2:4,3:5,4:2,5:1,7:4}。第一次迭代,节点度数为其coreness值,此时节点1有5-core支持度为1(节点3),4-core支持度为4(节点0,2,3,7),3-core支持度为4,2-core支持度为5,1-core支持度为6(全部节点)。k-core值节点所位于的最大k-core结构,只有4-core的支持度足够且为最大,因此节点1的coreness
new
=4,其cnt也为4(4个邻接点节点的coreness》=4)。这时节点1的coreness
old
≠coreness
new
(coreness
old
=6),因为节点1的cnt降低了,可能影响其邻接点的支持度,所以进行反向传播。
73.通过节点1了解相关迭代流程之后,可以理解的是,对于局部收敛策略,首先初始化所有节点的coreness值为其度数,第一次迭代,所有节点都遍历其邻接点的coreness值,求出节点的coreness值和支持度。其中只有节点1、3、7的coreness值发生了变化。第二次迭代,节点1、3、7的coreness降低了,所以需要修改其邻接点的支持度,节点1、3、6的支持度降低了。第三次迭代,因为节点的支持度发生了变化,所以需要遍历邻接点重新计算coreness。重复该过程,直到所有支持度都大于等于coreness值,此时便得到了所有core number。
74.经过上述描述可以知道,剥离算法需要将整个图加载到内存中删除节点和边直到整个图被删完,迭代过程为找到小于等于度数最小的点,删除相应边,迭代过程只需要一次遍历邻接点,因此速度快,但难以设计成分布式和或者基于外存的方法,并行算法也由大量的原子减操作,并行度不高。
75.而对于局部收敛策略,其计算过程可以总结为:
76.1.正向收敛操作。
77.每个活动节点(要么是初始节点,要么是其cnt《coreness的节点)遍历邻接点得到
该迭代轮次该节点的统计分布数组num,这个数组是临时数组,根据该数组计算出新的coreness。
78.其中,cnt[u]值为一个自然数t,含义是节点u有t个coreness》=k的邻接点。
[0079]
2.反向广播操作。
[0080]
在收敛操作中发生变化的节点,再次遍历邻接点,将符合coreness_new《coreness_nbr《=coreness_old条件的邻接点节点的cnt减一。coreness_nbr是其中一个邻接点的coreness值,nbr代表neighbour。
[0081]
再将cnt小于coreness的节点重新遍历邻接点再次得到邻接点coreness统计分布数组,再次计算coreness,再进行遍历邻接点进行广播操作。这种方法采用了以节点为中心的算法策略,一个节点的coreness的计算只需要两次遍历邻接点,不停地求上界,直到收敛为止。因此当内存不够时,可以只加载活动节点的邻接点即可,或者将图切分先局部收敛再全局收敛即可。广泛适用于基于外存的算法和分布式算法中,但是需要两次遍历邻接点迭代速度偏慢。
[0082]
基于上述算法各自存在的问题,参见图3所示,本发明实施例提供一种基于直方图的k-core算法,该方法包括以下步骤:
[0083]
s1.根据每个节点的邻接点的度数分布建立对应节点的直方图。
[0084]
其中,在具体的实现中,参见图4所示,步骤s1具体包括:
[0085]
s11.将每个节点的核数初始化为度数,每个节点的度数为该节点的邻接点数量。
[0086]
s12.根据一节点的度数大小,确定该节点的邻接点的度数分布的度数值种类,统计该节点的邻接点的度数在每种度数值下所包括的个数。
[0087]
也就是说,当一节点的度数为n时,确定该节点的邻接点的度数分布的度数值种类为n,其中n为自然数。
[0088]
s13.以度数值种类作为直方图长度,并以每种度数值下所包括的个数作为直方图的数据,来建立对应节点的直方图。
[0089]
s2.基于当前的直方图,对涉及的节点进行正向收敛和反向广播,以完成一次迭代,并对正向收敛和反向广播的过程中核数发生变化的节点的直方图进行修改。
[0090]
其中,在具体的实现中,参见图5所示,步骤s2具体包括:
[0091]
s21.以当前的直方图长度作为每个节点当前核数,确定因支持度不够而不能维护当前核数的活动节点集合。
[0092]
s22.更新活动节点集合中的节点的核数,使得更新后的核数在具有足够支持度的同时尽可能大,并基于更新后的核数对活动节点集合中的节点的直方图的长度和数据进行修改,以完成节点的正向收敛。
[0093]
s23.确定活动节点集合中的节点不能为其邻接点提供支持度的邻接点集合。
[0094]
s24.更新邻接点集合中的节点的核数,使活动节点集合中的节点可为邻接点集合中的节点提供支持度,并基于更新后的核数对邻接点集合中的节点的直方图的长度和数据进行修改,以完成节点的反向广播。
[0095]
s3.重复迭代过程,以所有节点的直方图不发生变化时的长度作为各个节点的稳态核数。
[0096]
结合上述步骤,总结的来说,本实施例中的基于直方图的k-core算法主要包括三
个步骤:1.初始化一个全局直方图bin;2.更新coreness;3.更新bin。
[0097]
值得说明的是,全局直方图是一个全局二维数组bin[i][j](bin[i][j]表示节点i的邻接点的coreness(初始化为度数)值等于j 1的节点个数),该数组记录了每个节点的邻接点的度数分布,每个节点都有一个全局直方图,作为迭代操作的对象,为迭代做准备。迭代过程中只需逆序累加计算即可找到当前的coreness值,减少了一次对邻接点的遍历。coreness数组记录了节点为core number迭代过程中的结果,coreness
old
[u]表示节点u计算前的值,coreness
new
[u]表示节点u计算后的值,该值同时反应了该节点的直方图目前的长度。
[0098]
如果节点v的coreness[v]值变化,需要反向传播,修改符合coreness[u]》coreness[v]的邻接点u的直方图。对节点v反向传播时,只有邻接点u的coreness[u]小于coreness[v]时,节点v已经不能为其邻接点u提供支持度,因此bin[u][coreness
old
]减一,只能为coreness
old-core提供支持,因此bin[u][coreness
new
]加一。
[0099]
对于上述总结的三个步骤,可以用r集合表示第二步需要收敛计算的节点集合。第一次需要计算所有节点的coreness,即r为全部节点。h集合表明第二步coreness发生变化的节点集合。t表明第三步反向广播时,直方图发生变化的节点集合。算法首先初始化一个全局直方图,迭代执行第二步和第三步,直到达到需要的收敛条件,算法结束。
[0100]
下面以一个具体的例子做进一步说明:
[0101]
还是以图2中的示例图g为例,在图2中node表示各个节点的邻接点,degree为度数,core number为最终的稳态的coreness,也为节点最后迭代计算出来的稳态核数。
[0102]
第一步:初始化全局直方图,每个节点都有一个直方图数组。
[0103]
以节点1举例,其邻接点和对应度数为{0:4,2:4,3:5,4:2,5:1,7:4}。该节点bin[1]初始化长度为6。
[0104]
根据上述bin[i][j]的定义,可知
[0105]
bin[1][0]为节点1邻接点的coreness为1的个数;
[0106]
bin[1][1]为节点1邻接点的coreness为2的个数;
[0107]
bin[1][2]为节点1邻接点的coreness为3的个数;
[0108]

[0109]
基于上述定义,并根据节点1的邻接点coreness情况{0:4,2:4,3:5,4:2,5:1,7:4},可知:
[0110]
bin[1][0]表示节点1的邻接点的coreness的值等于1的个数,num({5})表示节点5符合条件,所以bin[1][0]=1;
[0111]
bin[1][1]表示节点1的邻接点的coreness的值等于2的个数,num({4})表示节点4符合条件,所以bin[1][1]=1;
[0112]
bin[1][2]表示节点1的邻接点的coreness的值等于3的个数,没有节点符合条件为0;
[0113]
bin[1][3]表示节点1的邻接点的coreness的值等于4的个数,num({0,2,7})表示节点0,2,7符合条件,所以bin[1][3]=3;
[0114]
bin[1][4]表示节点1的邻接点的coreness的值等于5的个数,num({3})表示节点3符合条件,所以bin[1][4]=1;
[0115]
bin[1][5]表示节点1的邻接点的coreness的值等于6的个数,没有节点符合条件为0。
[0116]
所以bin[1]初始化值为bin[1]=[1,1,0,3,1,0],这个操作其实就是统计节点1邻接点的coreness值的直方图,遍历一下邻接点的coreness,bin[1]相应位置加1。
[0117]
参见图6所示,bin[1]=[1,1,0,3,1,0]变作为节点1直方图的数据填入,沿着节点1的箭头指向依次为1,1,0,3,1,0。其余节点的直方图以此类推,本实施例再次不做赘述,根据上述方式计算便可得到所有节点的初始的直方图。
[0118]
第二步:更新节点的coreness值。
[0119]
以节点1为例,节点1初始coreness为其degree=6,其他节点coreness初始值也为其度数。使用其定义每个节点至少有k个邻接点的推广,一个节点的coreness为k的条件是有至少k的邻接点coreness大于等于k,验证节点1是否可以处于6-core中。
[0120]
节点1的{邻接点:coreness}值分别是{0:4,2:4,3:5,4:2,5:1,7:4},有0个coreness=6的,有1个coreness=5的,有3个coreness=4的,有1个coreness为2的,有1个coreness为1的,所以得到一个统计分布数组(直方图),表示为[index,value]为统计值[0:0,1:1,2:1,3:0,4:3,5:1,6:0](这里0:0表示有0个度数为0的,可以省略掉,之后的算法边省略了这个值)。
[0121]
然后根据这个数组可知节点1有0个邻接点coreness大于6,邻接点能提供的支持度(cnt)为0。所以节点1的不能处于6-core中,coreness也就不能为6。接着验证节点1的coreness是否能位于5-core中,由其统计数组可知由1《5个邻接点coreness大于等于5,位于5-core的支持度为1。所以节点1的不能处于5-core中,因此继续判断是否可以处于4-core,因为有4个邻接点coreness大于等于4(coreness为4的由3个,为5的有1个),位于4-core的支持度是大于等于4的。因此当前的迭代轮次,节点1的coreness的上界为4,也就是节点1当前轮次瞬态的coreness为4,即coreness
new
=4,coreness
old
就是之前的值6,并且记录节点1的支持度cnt[node=1]为4,也就是节点1当前有4个邻接点的coreness大于等于4。cnt[node=1]是全局变量,记录在一个全局数组cnt中。初始状态下,每个节点都要验证这样的过程,求出每个节点当前轮次稳态coreness的上界或者瞬态的coreness。这也称为迭代内的正向(采集)收敛操作。
[0122]
根据上述分析可以知道coreness
new
=4,因此coreness[1]=4,参见图7所示,然后将节点1的直方图长度缩短为4,然后bin[1][3]置为其支持度4。这一阶段节点1的coreness变为4支持度为4,节点7的coreness变为3,支持度为3,节点3的coreness变为4支持度为5。因此下一步需要更新节点{1,3,7}的邻接点的直方图数组。
[0123]
第三步:更新全局直方图数组:
[0124]
在上述步骤中存在一个问题,如果cpu单机计算,迭代内的计算顺序是0,1,2
……
。节点0是比节点1先验证计算coreness的,验证之后发现1也是0的邻接点。节点0验证自己的coreness上界时,对1的coreness的采集是6。节点0邻接点分布为(节点2,6)coreness为4,一个为5(节点3),一个(节点1)为6,因此有4个coreness大于等于4,所以节点0在当前迭代轮次coreness上界为4。
[0125]
然而验证节点1时,节点1的coreness上界降低了,但是节点0不知道,所以节点1从6降低到4时,需要广播一下,通知节点0节点1的coreness从6降到4。
[0126]
暂时先标记一下节点1需要进行反向广播操作,继续计算节点2,coreness不变cnt为4,节点3的coreness从5降到4,cnt为5,继续计算节点4、5和6,其coreness都不变,记录其cnt。计算节点7发现其coreness从4降到3,cnt为3。
[0127]
一次正向收敛后coreness发生变化的有3个节点{1 3 7}。对这三个节点进行反向广播操作,告知{1 3 7}的邻接点其coreness降低了,看能否继续为邻接点的coreness提供支持。节点1(coreness=4)的邻接点的coreness分别为{0:4,2:4,3:4,4:2,5:1,7:3},发现邻接点的coreness全部小于等于节点1的coreness,所以依旧可以为邻接点的当前的coreness提供支持。节点3也是如此。但是节点7的coreness从4降到了3。但是邻接点和coreness分别为{1:4,3:4,4:2,6:4},节点7的coreness变为3,所以不能为节点1的coreness=4提供支持度了,所以cnt[1]减1为3,因此节点1的支持度小于其coreness,所以节点1不能保持coreness为4了,参见图8所示,所以bin[1][3]减1,bin[1][2]加1,因此需要进一步计算,暂时标记一下。节点3也是cnt[3]由5变为4,其coreness等于其支持度,不需要重新计算。cnt[6]由4将为3,也小于其coreness,也标记一下。
[0128]
这时便完成了一次正向收敛和反向传播操作,称为一次迭代。
[0129]
参见图9至图11所示,随后继续迭代验证计算节点1和6的coreness值,重复该过程直到所有节点的cnt都大于等于其coreness,算法收敛。
[0130]
综上所述,本发明中的基于直方图的k-core算法将收敛算法收敛操作得到的临时分布数组变成全局数组,不需要多次重复遍历邻接点求得分布数组。算法迭代过程为每个节点记录邻接点的coreness分布作为全局数组,根据这个数组得到coreness
new
,再去修改邻接点的全局分布数组。把全局分布数组发生变化的节点作为下一轮的活动节点,直到所有节点的coreness都不再变化,算法收敛。区别在于节点的cnt变成一个统计分布数组。这样就减少了对邻接点的遍历,转化为访问该节点的统计分布数组。
[0131]
本发明中的算法使用空间置换时间的方法提高了算法效率,也依旧使用以节点为中心的计算方式,也就继承了其扩展性,通过访问节点的全局直方图数组减少了一次邻接点的遍历,具有近似剥离算法的计算速度,同时算法可以设计为以节点为中心的并行算法。
[0132]
与此同时,本发明实施例还提供一种实现基于直方图的k-core算法的装置,其包括生成模块和迭代模块。
[0133]
其中,生成模块根据每个节点的邻接点的度数分布建立对应节点的直方图;迭代模块基于当前的直方图,对涉及的节点进行正向收敛和反向广播,以完成一次迭代,并对正向收敛和反向广播的过程中核数发生变化的节点的直方图进行修改。迭代模块还用于重复迭代过程,以所有节点的直方图不发生变化时的长度作为各个节点的稳态核数。
[0134]
进一步地,生成模块根据每个节点的邻接点的度数分布建立对应节点的直方图,包括:
[0135]
将每个节点的核数初始化为度数,每个节点的度数为该节点的邻接点数量;
[0136]
根据一节点的度数大小,确定该节点的邻接点的度数分布的度数值种类,统计该节点的邻接点的度数在每种度数值下所包括的个数;
[0137]
以度数值种类作为直方图长度,并以每种度数值下所包括的个数作为直方图的数据,来建立对应节点的直方图。
[0138]
进一步地,生成模块根据一节点的度数,确定该节点的邻接点的度数分布的度数
值种类,包括:
[0139]
当一节点的度数为n时,确定该节点的邻接点的度数分布的度数值种类为n,其中n为自然数。
[0140]
进一步地,迭代模块基于当前的直方图,对涉及的节点进行正向收敛和反向广播,以完成一次迭代,并对正向收敛和反向广播的过程中核数发生变化的节点的直方图进行修改,包括:
[0141]
以当前的直方图长度作为每个节点当前核数,确定因支持度不够而不能维护当前核数的活动节点集合;
[0142]
更新活动节点集合中的节点的核数,使得更新后的核数在具有足够支持度的同时尽可能大,并基于更新后的核数对活动节点集合中的节点的直方图的长度和数据进行修改,以完成节点的正向收敛;
[0143]
确定活动节点集合中的节点不能为其邻接点提供支持度的邻接点集合;
[0144]
更新邻接点集合中的节点的核数,使活动节点集合中的节点可为邻接点集合中的节点提供支持度,并基于更新后的核数对邻接点集合中的节点的直方图的长度和数据进行修改,以完成节点的反向广播。
[0145]
本发明实施例还提供一种设备,所述设备包括处理器、存储器、以及存储在所述存储器上并可被所述处理器执行的计算机程序,其中所述计算机程序被所述处理器执行时,实现上述基于直方图的k-core算法的步骤。
[0146]
应当理解的是,处理器可以是中央处理单元(central processing unit,cpu),该处理器还可以是其他通用处理器、数字信号处理器(digital signal processor,dsp)、专用集成电路(application specific integrated circuit,asic)、现场可编程门阵列(field-programmable gate array,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。其中,通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
[0147]
其中,在一个实施例中,所述处理器用于运行存储在存储器中的计算机程序,以实现如下步骤:
[0148]
根据每个节点的邻接点的度数分布建立对应节点的直方图;
[0149]
基于当前的直方图,对涉及的节点进行正向收敛和反向广播,以完成一次迭代,并对正向收敛和反向广播的过程中核数发生变化的节点的直方图进行修改;
[0150]
重复迭代过程,以所有节点的直方图不发生变化时的长度作为各个节点的稳态核数。
[0151]
在一个实施例中,所述根据每个节点的邻接点的度数分布建立对应节点的直方图,用于实现:
[0152]
将每个节点的核数初始化为度数,每个节点的度数为该节点的邻接点数量;
[0153]
根据一节点的度数大小,确定该节点的邻接点的度数分布的度数值种类,统计该节点的邻接点的度数在每种度数值下所包括的个数;
[0154]
以度数值种类作为直方图长度,并以每种度数值下所包括的个数作为直方图的数据,来建立对应节点的直方图。
[0155]
在一个实施例中,所述基于当前的直方图,对涉及的节点进行正向收敛和反向广
播,以完成一次迭代,并对正向收敛和反向广播的过程中核数发生变化的节点的直方图进行修改,用于实现:
[0156]
以当前的直方图长度作为每个节点当前核数,确定因支持度不够而不能维护当前核数的活动节点集合;
[0157]
更新活动节点集合中的节点的核数,使得更新后的核数在具有足够支持度的同时尽可能大,并基于更新后的核数对活动节点集合中的节点的直方图的长度和数据进行修改,以完成节点的正向收敛;
[0158]
确定活动节点集合中的节点不能为其邻接点提供支持度的邻接点集合;
[0159]
更新邻接点集合中的节点的核数,使活动节点集合中的节点可为邻接点集合中的节点提供支持度,并基于更新后的核数对邻接点集合中的节点的直方图的长度和数据进行修改,以完成节点的反向广播。
[0160]
本发明实施例还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,其中所述计算机程序被处理器执行时,实现上述基于直方图的k-core算法的步骤。
[0161]
本领域普通技术人员可以理解,上文中所公开方法中的全部或某些步骤、系统、装置中的功能模块/单元可以被实施为软件、固件、硬件及其适当的组合。在硬件实施方式中,在以上描述中提及的功能模块/单元之间的划分不一定对应于物理组件的划分;例如,一个物理组件可以具有多个功能,或者一个功能或步骤可以由若干物理组件合作执行。某些物理组件或所有物理组件可以被实施为由处理器,如中央处理器、数字信号处理器或微处理器执行的软件,或者被实施为硬件,或者被实施为集成电路,如专用集成电路。这样的软件可以分布在计算机可读存储介质上,计算机可读存储介质可以包括计算机可读存储介质(或非暂时性介质)和通信介质(或暂时性介质)。
[0162]
如本领域普通技术人员公知的,术语计算机可读存储介质包括在用于存储信息(诸如计算机可读指令、数据结构、程序模块或其他数据)的任何方法或技术中实施的易失性和非易失性、可移除和不可移除介质。计算机可读存储介质包括但不限于ram、rom、eeprom、闪存或其他存储器技术、cd-rom、数字多功能盘(dvd)或其他光盘存储、磁盒、磁带、磁盘存储或其他磁存储装置、或者可以用于存储期望的信息并且可以被计算机访问的任何其他的介质。此外,本领域普通技术人员公知的是,通信介质通常包含计算机可读指令、数据结构、程序模块或者诸如载波或其他传输机制之类的调制数据信号中的其他数据,并且可包括任何信息递送介质。
[0163]
示例性的,计算机可读存储介质可以是前述实施例的电子设备的内部存储单元,例如电子设备的硬盘或内存。计算机可读存储介质也可以是电子设备的外部存储设备,例如电子设备上配备的插接式硬盘,智能存储卡(smart media card,smc),安全数字(secure digital,sd)卡,闪存卡(flash card)等。
[0164]
以上仅为本发明实施例的具体实施方式,但本发明实施例的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明实施例揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明实施例的保护范围之内。因此,本发明实施例的保护范围应以权利要求的保护范围为准。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献