本说明书涉及计算机软件技术领域,尤其涉及一种社区发现方法、装置以及设备。
背景技术:
在风控场景中,可以将用户、媒介(比如设备、银行卡,电子邮箱等)建模成节点,将节点之间的交易事件建模成边,从而可以构建出一个交易事件的图。不同的用户、不同的媒介可以通过交易事件连接在一起。关系比较密切的人往往用过相同的设备、银行卡、电子邮箱等媒介,因此在这个交易网络之下,他们会连接到一起,多个关系密切的节点可能构成一个社区,一个好的社区发现方案,能够将大图划分成许多小图,每一个小图即可以理解成一个关系密切的社区。这些社区可能是一个家庭,或者是一个犯罪团伙等,基于社区能够更高效地进行风控。
在现有技术中,主要有两类社区发现方案。一种是标签传播聚类方案,另一种是快速展开(fastunfolding)方案。
基于现有技术,需要更为可靠的社区发现方案。
技术实现要素:
本说明书实施例提供一种社区发现方法、装置以及设备,用以解决如下技术问题:需要更为可靠的社区发现方案。
为解决上述技术问题,本说明书实施例是这样实现的:
本说明书实施例提供的一种社区发现方法,包括:
获取原始图,原始图中的节点表示指定类型的元素,边及其权重表示节点之间的关系,各节点初始时分别属于不同社区;
计算原始图中的节点到多个社区的第一模块度增量,根据该第一模块度增量,确定该节点的目标社区并将该节点加入目标社区;
将各社区分别作为社区关系图中的一个节点,根据社区关系图中的节点在原始图中对应的邻居节点及连接边,建立社区关系图中的边并赋予权重;
计算社区关系图中的节点到其邻居节点的第二模块度增量,根据该第二模块度增量,确定所述社区关系图中需要合并社区的节点并进行合并;
根据社区关系图更新原始图,更新后计算原始图中的节点的第一模块度增量和已有增益,根据该第一模块度增量和已有增益,确定原始图中需要变更社区的节点并进行变更;
输出原始图中各节点的社区从属关系。
本说明书实施例提供的一种社区发现装置,包括:
获取模块,获取原始图,原始图中的节点表示指定类型的元素,边及其权重表示节点之间的关系,各节点初始时分别属于不同社区;
加入模块,计算原始图中的节点到多个社区的第一模块度增量,根据该第一模块度增量,确定该节点的目标社区并将该节点加入目标社区;
建立模块,将各社区分别作为社区关系图中的一个节点,根据社区关系图中的节点在原始图中对应的邻居节点及连接边,建立社区关系图中的边并赋予权重;
合并模块,计算社区关系图中的节点到其邻居节点的第二模块度增量,根据该第二模块度增量,确定所述社区关系图中需要合并社区的节点并进行合并;
变更模块,根据社区关系图更新原始图,更新后计算原始图中的节点的第一模块度增量和已有增益,根据该第一模块度增量和已有增益,确定原始图中需要变更社区的节点并进行变更;
输出模块,输出原始图中各节点的社区从属关系。
本说明书实施例提供的一种社区发现设备,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够:
获取原始图,原始图中的节点表示指定类型的元素,边及其权重表示节点之间的关系,各节点初始时分别属于不同社区;
计算原始图中的节点到多个社区的第一模块度增量,根据该第一模块度增量,确定该节点的目标社区并将该节点加入目标社区;
将各社区分别作为社区关系图中的一个节点,根据社区关系图中的节点在原始图中对应的邻居节点及连接边,建立社区关系图中的边并赋予权重;
计算社区关系图中的节点到其邻居节点的第二模块度增量,根据该第二模块度增量,确定所述社区关系图中需要合并社区的节点并进行合并;
根据社区关系图更新原始图,更新后计算原始图中的节点的第一模块度增量和已有增益,根据该第一模块度增量和已有增益,确定原始图中需要变更社区的节点并进行变更;
输出原始图中各节点的社区从属关系。
本说明书实施例采用的上述至少一个技术方案够达到以下有益效果:相比于标签传播聚类方案,有利于保证社区发现结果的稳定性,并且能够在社区发现过程中出现二分图情况时进行社区合并;相比于fastunfolding方案,能够解决fastunfolding方案不支持并行计算的问题,而且有助于更优地进行社区划分;因此,本说明书提供的社区发现方案相对更为可靠。
附图说明
为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本说明书中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本说明书的方案在一种实际应用场景下的整体原理示意图;
图2为本说明书实施例提供的一种社区发现方法的流程示意图;
图3a~图3c为本说明书实施例提供的针对一个示例性的原始图执行节点加入社区部分的过程中,原始图的变化示意图;
图4为本说明书实施例提供的对应于图2的一种社区发现装置的结构示意图。
具体实施方式
本说明书实施例提供一种社区发现方法、装置以及设备。
为了使本技术领域的人员更好地理解本说明书中的技术方案,下面将结合本说明书实施例中的附图,对本说明书实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本说明书实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
本说明书提出了一套社区发现方案,参见图1,图1为本说明书的方案在一种实际应用场景下的整体原理示意图,主要包含三个部分,第一部分是节点加入社区,第二部分是社区合并,第三部分是社区变更,这三个部分可以迭代循环执行多次,并且可以将节点分批次执行。第二部分反映了对社区宏观上的划分操作,第一部分和第三部分反映了对社区微观上的划分操作,各部分的迭代循环执行,使对社区宏观和微观的划分操作相互穿插,有利于趋向最优。不仅如此,针对这三个部分还提出了申请、判决和生效的示例性流程,支持并行化执行方案。另外,方案是基于模块度增量的,对在这三个部分中分别使用的模块度增量的计算方案也进行了统一。下面主要基于图1示出的整体原理,对本说明书的方案进行详细说明。
图2为本说明书实施例提供的一种社区发现方法的流程示意图,流程图中的部分步骤可以迭代循环执行,还可以并行执行以加快收敛速度。
图2中的流程可以包括以下步骤:
s202:获取原始图,原始图中的节点表示指定类型的元素,边及其权重表示节点之间的关系,各节点初始时分别属于不同社区。
在本说明书实施例中,指定类型的元素具体是怎样的元素,所述关系具体是怎样的关系,可以取决于方案的具体实施场景,这里不做限定。比如,对于交易风控场景,指定类型的元素可以是背景技术中提到的用户和/或媒介等,关系可以是相应的业务关系如交易关系等。
在本说明书实施例中,刚获取原始图时,可以将原始图中每个节点分别划分为一个不同的社区,节点上记录了其所属社区,随着后续步骤的执行,节点的社区从属关系可能发生变化,社区的数量也可能发生变化。在同一时刻,每个节点唯一属于一个社区。
s204:计算原始图中的节点到多个社区的第一模块度增量,根据该第一模块度增量,确定该节点的目标社区并将该节点加入目标社区。
在本说明书实施例中,对于这多个社区中的每个社区,可以分别为该节点计算出一个第一模块度增量,这里的“第一”只是为了便于描述,避免与社区到社区的模块度增量混淆,并没有实际意义。一般地,节点到社区的模块度增量越大,越适合将该节点加入该社区,以获得相对更优的社区发现结果,在每次迭代中,单个节点的目标社区一般只有一个,即第一模块度增量最大的社区。
进一步地,可以设定一定的条件,针对原始图的任意节点,当满足该条件时,才将该节点加入其目标社区,否则,可以不将该节点加入其目标社区。
s206:将各社区分别作为社区关系图中的一个节点,根据社区关系图中的节点在原始图中对应的邻居节点及连接边,建立社区关系图中的边并赋予权重。
在本说明书实施例中,通过执行步骤s206构造社区关系图,社区关系图的中每个节点表示一个社区,并指示了原始图中属于该社区的各节点,边表示社区之间的关系。
s208:计算社区关系图中的节点到其邻居节点的第二模块度增量,根据该第二模块度增量,确定所述社区关系图中需要合并社区的节点并进行合并。
在本说明书实施例中,社区关系图中的节点表示社区,则第二模块度增量即为上述的社区到社区的模块度增量。一般地,社区到社区的模块度增量越大,越适合将这两个社区合并,以获得相对更优的社区发现结果,在每次迭代中,单个社区适合与之合并的社区可以有一个或者多个,至少包含对应的第二模块度增量最大的社区。
s210:根据社区关系图更新原始图,更新后计算原始图中的节点的第一模块度增量和已有增益,根据该第一模块度增量和已有增益,确定原始图中需要变更社区的节点并进行变更。
在本说明书实施例中,步骤s210中的社区关系图本次已经执行过上述的节点加入和社区合并动作,据此更新原始图后,原始图也能够反映出最新的社区从属关系。
进一步地,更新原始图后,再次计算原始图中的节点的第一模块度增量,以及计算原始图中的节点的已有增益,用以再进行微观上的社区划分调整。此时,已有增益反映对应节点的社区划分结果优劣的现有状况,而第一模块度增量反映对应节点若进行相应的变更操作的社区划分结果优劣的预估状况。一般地,若节点的已有增益越小于第一模块度增量,越适合对该节点变更社区。
s212:输出原始图中各节点的社区从属关系。
通过图2的方法,相比于标签传播聚类方案,有利于保证社区发现结果的稳定性,并且能够在社区发现过程中出现二分图情况时进行社区合并;相比于fastunfolding方案,能够解决fastunfolding方案不支持并行计算的问题,而且有助于更优地进行社区划分;因此,本说明书提供的社区发现方案相对更为可靠。
基于图2的方法,本说明书实施例还提供了该方法的一些具体实施方案,下面进行说明。
在本说明书实施例中,对于步骤s204,所述计算原始图中的节点到多个社区的第一模块度增量,根据该第一模块度增量,确定该节点的目标社区,具体可以包括:
按照如下公式,分别计算原始图中的各节点分别到其各邻居社区的第一模块度增量:
进一步地,对于步骤s204,所述将该节点加入目标社区,具体可以包括:为该节点向其目标社区中的节点发送加入请求,若符合第一设定条件,则将该节点加入目标社区;所述第一设定条件比如包括以下至少一种:接收该加入请求的节点本次尚未发送加入请求;发送该加入请求的节点的所属社区与接收该加入请求的节点的目标社区一致,且发送该加入请求的节点的点度数小于接收该加入请求的节点的点度数。
在本说明书实施例中,对于步骤s208,所述计算社区关系图中的节点到其邻居节点的第二模块度增量,根据该第二模块度增量,确定所述社区关系图中需要合并社区的节点,具体可以包括:
按照如下公式,分别计算社区关系图中的各节点分别到其邻居节点的第二模块度增量:
进一步地,对于步骤s208,所述进行合并,具体包括:
为该节点向其需要与之合并社区的节点发送合并请求,若符合第二设定条件,则进行合并;所述第二设定条件比如包括以下至少一种:接收该合并请求的节点本次尚未发送合并请求;发送该合并请求的节点到接收该合并请求的节点的第二模块度增量最大;发送该合并请求的节点与接收该合并请求的节点的最优合并节点一致,且发送该合并请求的节点的点度数小于接收该合并请求的节点的点度数。
在本说明书实施例中,对于步骤s210,所述计算原始图中的节点的第一模块度增量和已有增益,根据该第一模块度增量和已有增益,确定原始图中需要变更社区的节点,具体可以包括:计算原始图中的节点的第一模块度增量,以及按照如下公式计算该节点的已有增益:
进一步地,所述在各非最优划分节点中确定需要变更社区的节点,具体可以包括:为至少部分非最优划分节点提出社区变更请求,按照如下公式计算该非最优划分节点的变更增益:
上面的实施例中,示例性地对第一模块度增量、第二模块度增量、已有增益和变更增益的计算公式进行了说明,还示例性地对第一设定条件和第二设定条件进行了说明,这些说明内容并非唯一实施方案,根据实际需要也可以对该上述计算公式和设定条件进行调整,只要能够实现较优的社区划分效果即可。
基于上面的说明,更详细地,本说明书的实施例还提供了一种实际应用场景下,上述社区发现方法的一种具体实施方案,该具体实施方案通过一套算法实现,主要分为12个步骤。为了便于理解,先对该实际应用场景进行说明,再详细说明各步骤。
在该实际应用场景下,该算法的输入是上述的原始图(称为图g),包括一个节点集合和一个边集合。节点集合由一组节点构成,每个节点都有自己全局唯一的节点id。这个节点id是一个不为0的整数。每个节点唯一地属于一个社区,每个节点会记录一个社区id,来表示这个节点属于这个社区。在算法未开始时,每个节点都各自为社区,假定其社区id为字母‘c’拼接上该节点的节点id。边集合由一组边构成,每条边都有其起始节点、终节点和权重,起始节点、和终节点都属于该节点集合。权重是一个大于0小于正无穷的实数。若一条边的起始节点等于他的终节点,称之为自环边。在算法的执行过程中,原始图中每个节点的节点id、每条边的起始节点、终节点和权重都不会发生变化,也不会增删节点或者边,可能发生变化的是节点记录的社区id。而算法的输出,就是原始图中每个节点所记录的节点id和社区id,表示着原始图中各节点(节点id)到各社区(社区id)的从属关系。
而在算法的运行过程中会产生上述的社区关系图。社区关系图的节点集合和原始图的节点集合是互不相交的,社区关系图和原始图间也不存在任何一条边。社区关系图也由一个节点集合和一个边集合构成,社区关系图中的每个节点都有自己全局唯一的节点id,假定该节点id是由字母‘c’拼接上一个不为0的整数构成,每个节点上记录着一个成员集合,该成员集合是一个不为0的整数的集合,该集合中的每个元素都对应着原始图中的一个节点id。社区关系图中的每条边也有起始节点、终节点和权重,该起始节点和终节点都属于社区关系图的节点集合。权重是一个大于0小于正无穷的实数。若一条边的起始节点等于他的终节点,称之为自环边。和原始图不同的是,社区关系图是在算法中动态生成的。社区关系图中的节点和边是可能被增删的,边上的权重也是可能被修改的。
依据上述原始图和社区关系图的设定,为了便于描述,进一步地延伸出如下设定:
1、从属关系。原始图中的节点id代表着这个节点,节点上记录的社区id代表着该节点所属的社区。
2、对应关系。原始图中某个节点的节点id和社区关系图中的某个节点id的整数部分相等,则认为这两个节点是对应关系。
3、邻居节点。原始图和社区关系图中任意一个节点(假定节点n)的邻居节点集合定义为:该图中,满足“起始节点为节点n”的所有边,这些边的终节点的集合。节点n的邻居节点集合中的任意一个元素被称作节点n的邻居节节点。
4、邻居社区。原始图中邻居社区集合定义为:原始图中满足“起始节点为节点n”的所有边,这些边的终节点所属社区的集合。节点n的邻居社区集合中的任意一个元素被称作节点n的邻居社区。对于原始图中任意一个节点(假定节点n),该节点的邻居节点数量记作hn。其邻居社区数量记作mn。由于每个邻居节点唯一地属于一个社区,因此mn≤hn。
5、点度数(nodedegree)为某个节点连接的全部边的权重之和。
6、社区度数(communitydegree)为该社区内全部节点的点度数之和。
7、图度数(graphdegree)为该图中全部的节点的点度数之和。
算法主要分为图1所述的三个部分。这三个部分的迭代循环执行的最大轮数分别为r1、r2、r3,这三个部分中的节点可以分p1、p2、p3个批次参与执行。r1、r2、r3、p1、p2、p3都可以预先指定,一般满足如下条件即可:r1、r2、r3、p1、p2、p3均为正整数,且r1是p1的整数倍,r2是p2的整数倍,r3是p3的整数倍。比如,假定r1为10,p1为2,则比如可以让节点id为奇数的各节点为一批次,节点id为偶数的各节点为另一批次,交替分别跑5轮,共计10轮。基于上述设定,详细说明算法的各步骤。
步骤0:轮数设为0。进入步骤1。
步骤1:若当前轮数大于等于r1,对于原始图中每个所属社区的成员数不大于1个且邻居节点集合不为空的节点,在社区关系图中建立一个节点id为该节点的社区id的节点,并且将社区关系图中该节点的成员集合中加入原始图中该节点的节点id。进入步骤4。
否则,对于原始图中每个满足条件的节点n,对于该节点邻居社区集合中的除自己所属社区的每个社区,计算节点n到该社区的模块度增量(即上述的第一模块度增量),得到若干个模块度增量。假定将其中最大的模块度增量称为该节点n的模块度增益,最大的模块度增量对应的社区为节点n的目标社区。若节点n的邻居社区集合中的多个社区的模块度增益同时最大,则目标社区可以选择这多个社区中的任意一个。若节点n的模块度增益大于0,则向目标社区对应的节点发出加入请求(比如目标社区为c1,那么对应的节点为节点1)。进入步骤2。
其中,该“满足条件”指:该节点所属社区的成员数不大于1个,且该节点id对p1取模等于轮数对p1取模。
步骤2:对于原始图中每个收到加入请求的节点,按照一定方式判断是否同意收到的请求。若该节点同意了任何一个收到的加入请求,且社区关系图中没有以该节点的社区id作为节点id的节点,则在社区关系图中创建一个节点id为该节点的社区id的节点(假定称为节点l),并且将该节点的节点id加入到节点l的成员集合中。进入步骤3。
其中,该“一定方式”指:对于每个接收到加入请求的节点,若该节点在上一步骤中没有发出过加入请求,则同意所有发至该节点的加入请求。否则,在所有的接收到的加入请求中,同意满足一定条件的请求,拒绝不满足该一定条件的加入请求。若在所有的接收到的加入请求中,没有满足该一定条件的,则拒绝所有收到的加入请求。对于该节点收到的每个加入请求,若同意该加入请求,则向提出该加入请求的节点发送同意消息。
该“一定条件”指的:(发送加入请求的节点所属社区和自己目标社区一致,且(发送加入请求的节点的点度数小于该节点的点度数或者(发送加入请求的节点的点度数等于该节点的点度数,且发送加入请求的节点的节点id大于该节点的节点id))。
步骤3:对于原始图中每个收到同意消息的节点,将该节点的社区id设置为该节点的目标社区。并且在社区关系图中节点id为目标社区的节点的成员集合中加上该节点的节点id。轮数加1。返回步骤1。
步骤4:删除社区关系图中成员集合为空的节点。对于社区关系图中每个成员集合不为空的节点,按照一定方式进行计算并且根据计算结果在社区关系图中添加边。将轮数置0,进入步骤5。
其中,该“一定方式”指:对于社区关系图中任意一个节点,创建一个空的邻居权重表。遍历其成员集合,对于成员集合中的每一个id,找到原始图中节点id和这个id相同的节点(称作成员节点)。对于每个成员节点遍历其邻居节点集合。对于该成员节点的每个邻居节点,拿到该邻居节点的社区id,查看邻居权重表中是否存在该社区id。若不存在则在邻居权重表插入一条以该社区id为键,以相关边的边权重为值的一条记录。否则,找到邻居权重表中键为该社区id的记录,将这条记录的值加上相关边的边权重。该相关边的边权重指:原始图中以该成员节点为起始节点、该邻居节点为终节点的边的边权重之和。
对于社区关系图中任意一个邻居权重表不为空的节点,遍历其邻居权重表。对于邻居权重表上的每条记录,拿出该记录的键和值。创建一条以该节点为起始节点、节点id和该记录的键一样的节点为终节点、边权重为该记录的值的边。对于社区关系图中的任意节点删除邻居权重表。
步骤5:若轮数不小于p2且在最近的p2轮中没有任何节点成功合并,结束算法。
若轮数不小于r2,则进入步骤8。否则,对于社区关系图中每个满足条件的节点n,对于该节点邻居社区集合中的除自己以外的每个节点,计算节点n和该节点的模块度增量,得到若干个社区模块度增量(即上述的第二模块度增量)。其中,最大的社区模块度增量称为该节点的社区模块度增益,最大的社区模块度增量对应的节点为该节点的最优合并点。若该节点的邻居节点集合中的多个节点的社区模块度增益同时最大,则最优合并点是这多个节点中的任意一个。若该节点社区模块度增益大于0,则向最优合并点发出合并请求。进入步骤6。
其中,该“满足条件”指:该节点的节点id的整数部分对p2取模等于轮数对p2取模。比如,节点id为c50,则该节点id的整数部分为50。
步骤6:对于社区关系图中每个收到合并请求的节点,按照一定方式判断是否同意收到的合并请求。若同意某个合并请求,则向该合并请求的发起节点发送同意合并消息。进入步骤7。
其中,该“一定方式”指:对于任意一个收到合并请求的节点,若该节点在上一步骤中没有发出过合并请求,则遍历收到的全部合并请求。计算该节点到每个对该节点发出合并请求的节点的社区模块度增量,得到一组社区模块度增量。选取其中最大的社区模块度增量所对应的合并请求,同意该合并请求,拒绝其他的合并请求(若收到的合并请求中的多个节点的社区模块度增益同时最大,则选择其中任意一个)。否则,在接收到的所有合并请求中,同意满足一定条件的合并请求,拒绝不满足该一定条件的合并请求。若在接收到的所有合并请求中,没有满足该一定条件的,则拒绝接收到的所有合并请求。
其中,该“一定条件”指:(发送合并请求的节点和该节点的最优合并点区一致)且(发送合并请求的节点的点度数小于该节点的点度数,或者(发送合并请求的节点的点度数等于该节点的点度数,且发送合并请求的节点的节点id的整数部分大于该节点的节点id的整数部分))。
步骤7:对于社区关系图中每个收到同意合并消息的节点:往最优合并点的成员集合中加入自己成员集合全部的元素。遍历以自己为起始节点的每条边,获得该边的边权重(假定称为权重w)和终节点(假定称为节点m)。若节点m不是该节点的最优合并点的邻居节点,则创建一条起始节点为最优合并点、终节点为节点m、边权重为权重w的边。否则将权重w加到起始节点为最优合并点、终节点为节点m的这条边上。遍历以自己为终节点的每条非自环边。获得该边的边权重(假定称为权重v)和终节点(假定称为节点n)。若不存在一条起始节点为节点n、终节点为最优合并点的边,则创建一条这样的边,并且使得该边权重为权重v。否则,将起始节点为节点n、终节点为最优合并点的边的边权重加上权重v。最后在社区关系图中删除该节点,以及以删除该节点为起始节点或者终节点的所有边。轮数加1。返回步骤5。
步骤8:对于社区关系图中每个节点,遍历其成员集合。对于社区关系图上的任意一个节点(假定称为节点c)的成员集合中的任意一个元素,找到原始图中节点id和该元素相等的节点,将该节点的社区id改成节点c的节点id。删除社区关系图中全部的边。将轮数置0。进入步骤9。
步骤9:若轮数不小于p3且在最近的p3轮中没有任何节点发生社区变更,或者轮数不小于r3,则返回步骤4。
否则,对于原始图中每个点计算并记录其模块度增益以及相应的目标社区。计算该节点的已有增益。若该节点的已有增益不小于该节点的模块度增益,则将该节点标记为最优划分点。进入步骤10。
步骤10:对于原始图中满足一定条件的点,提出社区变更请求。进入步骤11。
其中,该“一定条件”指:该节点未被标记为最优划分节点,且该节点id对p3取模等于轮数对p3取模。
步骤11:对于原始图中每个在上一步骤提出社区变更请求的节点,计算该节点的变更增益。若其变更增益大于该节点的已有增益,该节点变更社区。清除原始图上所有最优划分点标记。轮数加1。返回步骤9。
对于原始图上任意一个点(假定称为节点n),其所属社区为社区c,其目标社区为社区o,变更社区具体如下执行:找到社区关系图中节点id为社区c的节点(假定称为节点c),将节点n的节点id从节点c的成员集合中删除。将节点n的社区id改为社区o。找到社区关系图中节点id为社区o的节点(假定称为节点o),将节点n的节点id加到节点o的成员集合中,则节点n完成变更社区。
另外,更直观地,本说明书实施例还提供了针对一个示例性的原始图执行节点加入社区部分的过程中,原始图的变化示意图及相关说明,如图3a~图3c所示。
图3a示出了初始时的一个原始图,原始图中有节点id从1到6的六个节点,在算法未开始时,这六个点的社区id分别为c1、c2、c3、c4、c5、c6。为了便于描述,将节点id为1的节点,称作为节点1,以此类推,将节点id为6的节点称作为节点6。原始图中节点1、节点2、节点3互相之间都有边相连,节点4、节点5、节点6互相之间都有边相连,节点1和节点4间有一条边相连,节点2有一条自环边。
每条边都可以有不同的权重,这里假定每条边的权重都是1。则计算得到这六个节点的点度数分别为3、2、3、2、2,原始图度数为15。
假定上述的可调系数为1,按照节点到社区的第一模块度增量计算公式,分别计算六个节点分别到其各邻居社区的第一模块度增量。以节点1为例,节点1的邻居中里有属于社区c2、社区c3、社区c4的节点,节点1和社区c2连接的边仅有一条:即节点1连接节点2的这条边,因此节点1和社区c2所有连接边的权重之和为1,因此节点1到社区c2的第一模块度增量可以计算得到:
节点1到c1的第一模块度增量最大且大于0,因此节点1向节点3发出加入请求。类似地,对于原始图的其他节点,有如下表1的情况:
表1
根据前面提到的判决逻辑,节点1接受节点3的加入请求,节点3加入了社区c1。节点5接受节点6的加入请求,节点6加入了社区5,得到图3b。
节点2、节点4还未加入,继续计算,节点2的邻居中只有社区c1,节点2有两条边连接c1,因此节点2和社区c1所有连接边的权重之和为2,此时社区c1的社区度数为5,对应的第一模块度增益可以计算得到:
因此,节点2向节点1(社区c1)发出加入请求,节点4向节点5(社区c5)发出加入请求,前面提到的判决逻辑,社区c1、c5分别接受加入请求,则节点2加入社区c1,节点4加入社区c5,得到图3c。
根据图3c可以得到一个社区关系图,描述以下社区从属关系:
属于社区c1的三个节点为节点1、节点2、节点3。节点2的邻居中有社区c1,连接边的权重之和为3;节点3的邻居中有社区c1,连接边的权重之和为2;节点1的邻居中有社区c1,连接边的权重之和为2,有社区c5,连接边的权重之和1。将相同的社区号合并求和,得到社区c1的邻居:社区c1,边权重为2+2+3=7,社区c5,边权重为1。同理得到社区c5的邻居:社区c5,边权重为2+2+2=6,社区c1,边权重为1。
基于上面的说明,针对标签传播聚类方案社区发现结果不稳定的问题,本说明书的方案计算第一模块度增量、第二模块度增量、已有增益的方案,以及判决是否加入、是否合并、是否变更的方法都可以是固定的,因此能够保证社区发现结果的稳定性,而且能实现o(m)时间复杂度,支持并行计算;针对fastunfolding方案进入merge部分之后,随着社区和社区的合并,使得有些点的最优社区已经不是原来的社区的问题,本说明书的方案在社区进行r2轮合并之后会又进入社区变更部分),使得部分节点的社区划分继续微调,再次得到一个相对最优的划分,接着还能够再进入社区合并部分,从而更有利于使社区发现结果趋向于最优。
基于同样的思路,本说明书实施例还提供了上述方法对应的装置。图4为本说明书实施例提供的对应于图2的一种社区发现装置的结构示意图,所述装置包括:
获取模块401,获取原始图,原始图中的节点表示指定类型的元素,边及其权重表示节点之间的关系,各节点初始时分别属于不同社区;
加入模块402,计算原始图中的节点到多个社区的第一模块度增量,根据该第一模块度增量,确定该节点的目标社区并将该节点加入目标社区;
建立模块403,将各社区分别作为社区关系图中的一个节点,根据社区关系图中的节点在原始图中对应的邻居节点及连接边,建立社区关系图中的边并赋予权重;
合并模块404,计算社区关系图中的节点到其邻居节点的第二模块度增量,根据该第二模块度增量,确定所述社区关系图中需要合并社区的节点并进行合并;
变更模块405,根据社区关系图更新原始图,更新后计算原始图中的节点的第一模块度增量和已有增益,根据该第一模块度增量和已有增益,确定原始图中需要变更社区的节点并进行变更;
输出模块406,输出原始图中各节点的社区从属关系。
可选地,所述加入模块402计算原始图中的节点到多个社区的第一模块度增量,根据该第一模块度增量,确定该节点的目标社区,具体包括:
所述加入模块402按照如下公式,分别计算原始图中的各节点分别到其各邻居社区的第一模块度增量:
针对原始图中的节点,在为该节点计算出的最大的第一模块度增量对应的社区中,确定该节点的目标社区。
可选地,所述加入模块402将该节点加入目标社区,具体包括:
所述加入模块402为该节点向其目标社区中的节点发送加入请求,若符合第一设定条件,则将该节点加入目标社区;
所述第一设定条件包括以下至少一种:接收该加入请求的节点本次尚未发送加入请求;发送该加入请求的节点的所属社区与接收该加入请求的节点的目标社区一致,且发送该加入请求的节点的点度数小于接收该加入请求的节点的点度数。
可选地,所述合并模块404计算社区关系图中的节点到其邻居节点的第二模块度增量,根据该第二模块度增量,确定所述社区关系图中需要合并社区的节点,具体包括:
所述合并模块404按照如下公式,分别计算社区关系图中的各节点分别到其邻居节点的第二模块度增量:
针对社区关系图中的节点,在为该节点计算出的最大的第二模块度增量对应的节点中,确定需要与之合并社区的节点。
可选地,所述合并模块404进行合并,具体包括:
所述合并模块404为该节点向其需要与之合并社区的节点发送合并请求,若符合第二设定条件,则进行合并;
所述第二设定条件包括以下至少一种:接收该合并请求的节点本次尚未发送合并请求;发送该合并请求的节点到接收该合并请求的节点的第二模块度增量最大;发送该合并请求的节点与接收该加入请求的节点的最优合并节点一致,且发送该合并请求的节点的点度数小于接收该合并请求的节点的点度数。
可选地,所述变更模块405计算原始图中的节点的第一模块度增量和已有增益,根据该第一模块度增量和已有增益,确定原始图中需要变更社区的节点,具体包括:
所述变更模块405计算原始图中的节点的第一模块度增量,以及按照如下公式计算该节点的已有增益:
若原始图中的节点的已有增益小于其各第一模块度增量中的最大值,则确定该节点为非最优划分节点,在各非最优划分点中确定需要变更社区的节点。
可选地,所述变更模块405在各非最优划分节点中确定需要变更社区的节点,具体包括:
所述变更模块405为至少部分非最优划分节点提出社区变更请求,按照如下公式计算该非最优划分节点的变更增益:
基于同样的思路,本说明书实施例还提供了上述方法对应的设备和非易失性计算机存储介质。
本说明书实施例提供的对应于图2的一种社区发现设备,包括:
至少一个处理器;以及,
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够:
获取原始图,原始图中的节点表示指定类型的元素,边及其权重表示节点之间的关系,各节点初始时分别属于不同社区;
计算原始图中的节点到多个社区的第一模块度增量,根据该第一模块度增量,确定该节点的目标社区并将该节点加入目标社区;
将各社区分别作为社区关系图中的一个节点,根据社区关系图中的节点在原始图中对应的邻居节点及连接边,建立社区关系图中的边并赋予权重;
计算社区关系图中的节点到其邻居节点的第二模块度增量,根据该第二模块度增量,确定所述社区关系图中需要合并社区的节点并进行合并;
根据社区关系图更新原始图,更新后计算原始图中的节点的第一模块度增量和已有增益,根据该第一模块度增量和已有增益,确定原始图中需要变更社区的节点并进行变更;
输出原始图中各节点的社区从属关系。
本说明书实施例提供的对应于图2的一种非易失性计算机存储介质,存储有计算机可执行指令,所述计算机可执行指令设置为:
获取原始图,原始图中的节点表示指定类型的元素,边及其权重表示节点之间的关系,各节点初始时分别属于不同社区;
计算原始图中的节点到多个社区的第一模块度增量,根据该第一模块度增量,确定该节点的目标社区并将该节点加入目标社区;
将各社区分别作为社区关系图中的一个节点,根据社区关系图中的节点在原始图中对应的邻居节点及连接边,建立社区关系图中的边并赋予权重;
计算社区关系图中的节点到其邻居节点的第二模块度增量,根据该第二模块度增量,确定所述社区关系图中需要合并社区的节点并进行合并;
根据社区关系图更新原始图,更新后计算原始图中的节点的第一模块度增量和已有增益,根据该第一模块度增量和已有增益,确定原始图中需要变更社区的节点并进行变更;
输出原始图中各节点的社区从属关系。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置、设备、非易失性计算机存储介质实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书实施例提供的装置、设备、非易失性计算机存储介质与方法是对应的,因此,装置、设备、非易失性计算机存储介质也具有与对应方法类似的有益技术效果,由于上面已经对方法的有益技术效果进行了详细说明,因此,这里不再赘述对应装置、设备、非易失性计算机存储介质的有益技术效果。
在20世纪90年代,对于一个技术的改进可以很明显地区分是硬件上的改进(例如,对二极管、晶体管、开关等电路结构的改进)还是软件上的改进(对于方法流程的改进)。然而,随着技术的发展,当今的很多方法流程的改进已经可以视为硬件电路结构的直接改进。设计人员几乎都通过将改进的方法流程编程到硬件电路中来得到相应的硬件电路结构。因此,不能说一个方法流程的改进就不能用硬件实体模块来实现。例如,可编程逻辑器件(programmablelogicdevice,pld)(例如现场可编程门阵列(fieldprogrammablegatearray,fpga))就是这样一种集成电路,其逻辑功能由用户对器件编程来确定。由设计人员自行编程来把一个数字系统“集成”在一片pld上,而不需要请芯片制造厂商来设计和制作专用的集成电路芯片。而且,如今,取代手工地制作集成电路芯片,这种编程也多半改用“逻辑编译器(logiccompiler)”软件来实现,它与程序开发撰写时所用的软件编译器相类似,而要编译之前的原始代码也得用特定的编程语言来撰写,此称之为硬件描述语言(hardwaredescriptionlanguage,hdl),而hdl也并非仅有一种,而是有许多种,如abel(advancedbooleanexpressionlanguage)、ahdl(alterahardwaredescriptionlanguage)、confluence、cupl(cornelluniversityprogramminglanguage)、hdcal、jhdl(javahardwaredescriptionlanguage)、lava、lola、myhdl、palasm、rhdl(rubyhardwaredescriptionlanguage)等,目前最普遍使用的是vhdl(very-high-speedintegratedcircuithardwaredescriptionlanguage)与verilog。本领域技术人员也应该清楚,只需要将方法流程用上述几种硬件描述语言稍作逻辑编程并编程到集成电路中,就可以很容易得到实现该逻辑方法流程的硬件电路。
控制器可以按任何适当的方式实现,例如,控制器可以采取例如微处理器或处理器以及存储可由该(微)处理器执行的计算机可读程序代码(例如软件或固件)的计算机可读介质、逻辑门、开关、专用集成电路(applicationspecificintegratedcircuit,asic)、可编程逻辑控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:arc625d、atmelat91sam、microchippic18f26k20以及siliconelabsc8051f320,存储器控制器还可以被实现为存储器的控制逻辑的一部分。本领域技术人员也知道,除了以纯计算机可读程序代码方式实现控制器以外,完全可以通过将方法步骤进行逻辑编程来使得控制器以逻辑门、开关、专用集成电路、可编程逻辑控制器和嵌入微控制器等的形式来实现相同功能。因此这种控制器可以被认为是一种硬件部件,而对其内包括的用于实现各种功能的装置也可以视为硬件部件内的结构。或者甚至,可以将用于实现各种功能的装置视为既可以是实现方法的软件模块又可以是硬件部件内的结构。
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机。具体的,计算机例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本说明书时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本领域内的技术人员应明白,本说明书实施例可提供为方法、系统、或计算机程序产品。因此,本说明书实施例可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本说明书实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
本说明书是参照根据本说明书实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本说明书实施例可提供为方法、系统或计算机程序产品。因此,本说明书可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本说明书可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
本说明书可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本说明书,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本说明书实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。