[0045] 将原有点密度pi与广义密度值broad_pi比较,Pi>broad_pi,则i仍属于原有类,否则将i则属于离群点,其中i为点编号,pi为点密度值。
[0046] 再进一步,所述步骤三中,在计算距离矩阵的第i行时,向量Ai中所有的|ai·aj|(1≤j≤N)都会用到相同起始点ai和整个数据集的所有点{aj|1≤j≤N};
[0047] |ai·aj|=R·arccos[cosy1cosy2cos(x1-x2)+siny1siny2] (3)
[0048] 在Map阶段,把计算行Ai所需要的ai,标识成条的形式,其中key=,i=1,2,…,N,value=(‘A#’,ai);把的元素行Ai所需要的{aj|1≤j≤N},标识成条形式,其中key=,i=1,2,…,N,value=(‘B#’,{aj})j=1,2,…,N,那么在Reduce阶段,计算Ai所需要的ai和集合{aj}就会被分配到同一reduce任务中。
[0049] 更进一步,所述步骤4.1)中,在计算一大数据集中的最大的前K个数时,将数据集切分若干段,不同机器分别求出分片后各数据集中的最大的前K个数,然后合并到一台机器,求出整个数据集的最大的前K个数,Topk为数据集中元素按从大到小排列的后的前K个值的集合;
[0050] 在Map任务完成后将所有中间值传递到同一个Key之下,在Map阶段中,将来自数据集中元素,标识成条的形式,其中key=,value=(dij),(1≤i,j≤N);那么在Reduce阶段,就将求出合并后的小数据集中的TopK;
[0051] 所述步骤4.2)中,Map阶段,当dij<dc,将添加一条,其中key=,i=1,2,…,N,value=(onewritable),onewritable代表常数‘1’;在Reduce阶段,Key值i所对应的则为ρi=Σonewritable。
[0052] 所述步骤5.2)中,在Map阶段,把点i与对应的ρi,标识成条的形式,其中key=,value=(‘i’,ρi),在Reduce阶段,对vaule集合里的i按ρi大小做降序排序得到{j|ρi<ρj},标识成条的形式,其中key=,i=1,2,…,N,value=({ij|ρi<ρj});
[0053] 所述步骤5.3)包括如下过程:
[0054] ①在Map阶段,把来自角标数据的元素,标识成条的形式,其中key=,i=1,2,…,N,value=(‘A#’,list(ij)i);把来自距离矩阵的元素,标识成条形式,其中key=,i=1,2,…,N,value=(‘B#’,list(dij)i);
[0055] 在Map阶段,通过key,我们把参与计算的数据归为一类,通过value区分元素是来自还是角标数据还是距离数据;
[0056] ②在Shuffle阶段,相同key的value会被加入到同一个列表中, 形成对,传递给Reduce,这个由Hadoop自动完成;
[0057] ③在Reduce阶段,计算(i,j)∈list(i,j)i的最小距离,即为所求的δi。
[0058] 本发明的技术构思为:在面对大数据集时,通常采用MapReduce的计算模型。MapReduce在处理数据集时采用并行化处理方式,具有高容错性、数据均匀分布、自动负载均衡等优点。Hadoop的Mapreduce是一个分布并行处理大数据的开源程序
框架,一个Map/Reduce作业(job)通常会把输入的数据集切分为若干独立的数据
块,由map任务(task)以完全并行的方式处理它们。框架会对map的输出先进行排序,然后把结果输入给reduce任务。通常作业的输入和输出都会被存储在文件系统中。在本发明的方法中,主要计算的对数据的排序计算阈值,然后分类、聚类。各步骤都符MapReduce数据独立和计算独立的要求。所以采用MapReduce这个计算框架设计本方法十分有效。
[0059] 本发明的有益效果主要表现在:(1)处理大数据集,本方法面向大规模、高维数据。具有良好的处理能
力,完成单机无法完成的计算任务。(2)计算速度快,本方法主要计算都为线性计算,符合MapReduce特有的计算模式。计算速度是单机的几倍,甚至几十倍。(3)可扩展性,本方法采用MapReduce的计算框架,具有高横向扩展性。(4)支持广泛类型数据集,支持不同点数据集且具有良好聚类结果,具有普适性。
附图说明
[0060] 图1是计算截止距离MapReduce过程图。
[0061] 图2是计算点密度MapReduce过程图。
[0062] 图3是点密度排序MapReduce过程图。
[0063] 图4是计算点与较高密度点的最小距离δi的MapReduce过程图。
[0064] 图5是面向大数据的分布式密度聚类方法的
流程图。
[0065] 图6是计算点与较高密度点的最小距离δi流程图。
[0066]
具体实施方式
[0067] 下面结合附图对本发明作进一步描述。
[0068] 参照图1~图6,一种面向大数据的分布式密度聚类方法,包括如下步骤:
[0069] 步骤一:虚拟化环境、搭建Hadoop平台
[0070] 在一台刀片
服务器中,虚拟化出多台
虚拟机,虚拟机分配在不同的
硬盘上,分配IP建立相互通信。安装hadoop
软件,规划平台规模及
节点的角色实例。所有节点配置主要配置文件。
[0071] 步骤二:数据预处理与加载
[0072] 从数据库中将原始数据表抽取,利用sqoop–query命令截取需要的字段,将预处理后的数据直接抽取到Hdfs中。
[0073] 步骤三:计算距离矩阵
[0074]
[0075] Ai={di1 … din}ai·{a1 … an}={|ai·a1| … |ai·an|} (2)
[0076] 计算距离矩阵D,可以将矩阵分割计算。例如在计算距离矩阵的第i行时,向量Ai中所有的|ai·aj|(1≤j≤N)都会用到相同起始点ai和整个数据集的所有点{aj|1≤j≤N}。
[0077] |ai·aj|=R·arccos[cosy1cosy2cos(x1-x2)+siny1siny2] (3)
[0078] 在Map阶段,把计算行Ai所需要的ai,标识成条的形式。其中key=,i=1,2,…,N,value=(‘A#’,ai);把的元素行Ai所需要的{aj|1≤j≤N},标识成条形式,其中key=,i=1,2,…,N, value=(‘B#’,{aj}),j=1,2,…,N。那么在Reduce阶段,计算Ai所需要的ai和集合{aj}就会被分配到同一reduce任务中。
[0079] 其中ai代表点的坐标(1≤i≤N),N为点集合的总数,Ai为距离矩阵的第i行距离向量。R为地球半径,0为地心,ai、aj为球面上的两点、球面坐标为ai(x1,y1),B(x2,y2),x1、x2∈[-π,π],y1、y2∈[-π/2,π/2]。
[0080] 步骤四:计算截止距离与点密度
[0081] 4.1)计算截止距离
[0082] 截至距离dc为距离集合降序排列的20%的位置处的距离即:
[0083] dc=D([N*0.2])
[0084] 计算dc时,为了降低计算量采用了计算TopK的方法。避免对距离矩阵的所有元素进行排序而造成对内存的浪费。在计算一大数据集中的最大的前K个数时,可以将数据集切分若干段,不同机器分别求出分片后各数据集中的最大的前K个数。然后合并到一台机器,求出整个数据集的最大的前K个数。
[0085] 因为最终结果只产生一个TopK的集合,所以在Map任务完成后需要将所有中间值传递到同一个Key之下。所以在Map阶段中,将来自数据集中元素,标识成条的形式。其中key=,value=(dij),(1≤i,j≤N)。那么在Reduce阶段,就将求出合并后的小数据集中的TopK。
[0086] 参照图1,D为计算所得的距离{dij|1≤i,j≤N}的降序排列集合,N为点的总数,[]为取整函数,Topk为数据集中元素按从大到小排列的后的前K个值的集合。
[0087] 4.2)计算点密度ρ
[0088] 点密度ρi为点i与其他所有点的距离小于截止距离dc的个数。
[0089] 因为ρi的计算只与距离矩阵的第i行相关,所以在Map过程中将同一行的元素集中在相同Key中。另外为了减少Suffer过程的中间值的量,在Map的过程中将每个小于dij的元素化成常数‘1’加入到key值为i的value里。Reduce过程中对key值i对应的Values里的元素进行累加就可以得到各点的密度ρi。
[0090] Map阶段,当dij<dc,将添加一条。其中key=,i=1,2,…,N,value=(onewritable)。onewritable代表常数‘1’;在Reduce阶段,Key值i所对应的则为ρi=Σonewritable。
[0091] 步骤五:计算点与较高密度点的最小距离δi
[0092] δi为i与其高局部密度点的最小距离,计算δi的公式如下:
[0093] δi=min{dij|ρi<ρj}而最大Max(ρi)点所对应的δ=Max(dij)。这样使得δi>min(dij)成立。
[0094] 5.1)对ρi进行降序排序,得到对应i的排序后的集合{i}decrbypi。
[0095] 5.2)利用i对应的{j|ρi<ρj},我们得到i点的δi计算所需要的d的角标集合{ij|ρi<ρj}。
[0096] 在Map阶段,把点i与对应的ρi,标识成条的形式。其中key=,value=(‘i’,ρi)。在Reduce阶段,对vaule集合里的i按ρi大小做降序排序得到{j|ρi<ρj}。标识成条的形式。其中key=,i=1,2,…,N,value=({ij|ρi<ρj})。
[0097] 5.3)计算角标集合中对应dij的最 小值,由{ij|ρi<ρj},距离集合{dij|1≤i,j≤N}得 到 计 算δi所 需 要 的{dij|ρi<ρj};并且 记 录当δi =min{dij|ρi<ρj}成立时所对应的j值;
[0098] ①在Map阶段,把来自角标数据的元素,标识成条的形式。其中key=,i=1,2,…,N,value=(‘A#’,list(ij)i);把来自距离矩 阵的元素,标识成条形式,其中key=,i=1,2,…,N,value=(‘B#’,list(dij)i);。
[0099] 于是乎,在Map阶段,我们实现了这样的战术目的:通过key,我们把参与计算的数据归为一类。通过value,我们能区分元素是来自还是角标数据还是距离数据。
[0100] ②在Shuffle阶段,相同key的value会被加入到同一个列表中,形成对,传递给Reduce,这个由Hadoop自动完成。
[0101] ③在Reduce阶段,计算(i,j)∈list(i,j)i的最小距离。即为我们所求的δi。
[0102] 其中,dij为点i与点j的距离,ρi代表点i与其他所有点的距离小于dc的个数,ρj代表点j与其他所有点的距离小于dc的个数,N为点的总个数;
[0103] 步骤六:临界密度点临界距离以及聚类中心
[0104] 6.1)临界密度点ρ0、临界距离δ0
[0105] 临界密度点ρ0为{ρi}是密度从大到小后的排列的第C个点,临界距离δ0是集合{δi}从大到小后的排列的第C个点,我们对{ρi}从小到达的排序,然后取点{ρi|i=C}的点作为ρ0,对{δi},我们进行从小到达的排序,然后取点{δi|i=C}的点作为δ0;
[0106] MapReduce过程相同于步骤四的4.1)。
[0107] 其中ρi代表点i与其他所有点的距离小于dc的个数,δi为i与其高局部密度点的最小距离,C为固定常数,根据聚类要求可以自行调节。
[0108] 6.2)判定i是否为聚类中心
[0109] 分别判断i与之对应的ρi>ρ0,δi>δ0是否成立。若都成立则点i 为聚类中心。判断所有的点我们将得到聚类中心集合M={i|ρi>ρ0,δi>δ0}。
[0110] 步骤七:点进行聚类
[0111] 以上计算都是基于距离矩阵的大规模计算,量级都在o(n2)以上。步骤七点的聚类是基于点与聚类中心集合M的关系,计算量在o(n)次所以采用单机完成最后一步。
[0112] 顺序取{(i,j)}的点,判断i是否为聚类中心。如果属于则判断下个点,如果不属于判断(i,j)的j是否属于聚类中心,如果属于则i为j类,如果不属于判断i=j点对应的j是否属于聚类中心。循环后会得到最终的聚类结果。
[0113] 其中i为点编号,j为当δi=min{dij|ρi<ρj}成立时所对应的值,{(i,j)}代表(i,j)按照ρi从大到小排列。
[0114] 步骤八:判定离群点
[0115] 在聚类结果中,有些点是多个类群的边界点。需要重新判断这些点是否属于它的聚类中心。
[0116] 那么计算每个点的广义密度值:
[0117] broad_pi=(pi+max{pj|dij
[0118] 将原有点密度pi与广义密度值broad_pi比较,Pi>broad_pi,则i仍属于原有类,否则将i则属于离群点,其中i为点编号,pi为点密度值。
[0119] 实例:结合浮动车数据,对出行密度点进行聚类应用实例,进一步说明本方法。
[0120] 参照图5,本方法的主要步骤有:
[0121] 步骤一,虚拟化环境
[0122] 在一台刀片服务器中,虚拟化出8台虚拟机,虚拟机分配在不同的硬盘上,分配IP建立相互通信。系统为Centos6.5、CPU4个64位、8G内存。
[0123] 步骤二,搭建Hadoop平台
[0124] 在每台虚拟机中安装Hadoop-2.2.0,对集群中的每个节点配置/etc/hadoop目录下的配置文件,通过文件中属性参数dfs.namenode和dfs.datanode的设置,使集群中包含两个主节点master(一个为活跃节点,一个为热备份节点)和多个数据节点datanode;通过文件中属性参数mapred.jobtracker和mapred.tasktracker的设置,使集群中包含两个个调度节点和多个任务节点,建立开源的Hadoop平台。
[0125] 步骤三,数据预处理与加载
[0126] 从数据库中将原始数据表抽取,利用sqoop–query“select id,id_j,id_w from table”命令截取有效点的坐标,将预处理后的数据直接抽取到Hdfs中。处理后的点格式为:
[0127]ID 经度 维度
1 120.2497 30.222417
2 120.189567 30.27865
[0128] 表1
[0129] 步骤四,计算距离矩阵
[0130] 对所有点进行编号,统一处理成编号、经度、维度即{i,α,β};建立第一个MapReduce任务,在Map的输出过程中我们将编号i设为Key,将各个点的经纬度(α,β)设为Value。在Reduce过程中,对应的key编号的点就可以与Values里的所有点进行距离计算我们将结果直接存储在Hdfs上,避免内存被过度占用。矩阵的储存格 式为(i,j,d)。
[0131]ID1 ID2 dij(km)
1 1 0.00
1 2 8.52
1 3 2.10
[0132] 表2
[0133] 其中i为行,j为列。d为两点对应的距离。
[0134] 步骤五,计算截止距离与点密度
[0135] 5.1截至距离dc
[0136] 输入距离矩阵的所有点。数据分片后,计算各分片的TopK。然后再合并得到全数据集的TopK。集合中最后一个值即为dc。
[0137] 5.2计算点密度ρi
[0138]
[0139] 表3
[0140] 第四个MapReduce任务将i即第一个点编号设为Map阶段的输出key,dij设为value。在Reduce阶段,我们得到i与其对应的 距离集合{dij},统计集合{dij}中小于dc的个数。将其记为ρi。
[0141] 步骤六,计算点与较高密度点的最小距离
[0142] 参照附图6,计算点与较高密度点的最小距离主要步骤有:
[0143] δi为i与其高局部密度点的最小距离δi=min{dij|ρi<ρj}而最大Max(ρi)点所对应的δ=Max(dij)。这样使得δi>min(dij)成立。
[0144] 6.1对ρi进行降序排序
[0145] 步骤5.2所产生的结果的格式为编号,以及对应的ρ即:(i,ρi)。
[0146] 我们根据ρi进行降序排序。得到对应i的序列。
[0147]i ρi
1 4654
2 6231
[0148] 表4
[0149] 6.2生成角标集合
[0150] 启动第五个MapReduce的任务,我们步骤5.2所产生的结果,计算ρ大于ρi所有点的集合{j|ρi<ρj}。在Map阶段将i设为key,将与之对应的{j|ρi<ρj}设为vaule。Reduce阶段利用输入key与valuse集合元素组合将得到i点的δi计算所需要的d的角标集合{ij|ρi<ρj}。
[0151]
[0152] 表5
[0153] 6.3计算角标集合中对应dij的最小值
[0154] 根据6.2生成的角标集合{ij|ρi<ρj},在步骤4产生的结果中寻找角标所对应的{dij|ρi<ρj}且求得δi=min{dij|ρi<ρj}以及最小距离对应的j值。
[0155]
[0156] 表6
[0157] 步骤七,求临界密度点临界距离以及聚类中心
[0158] 求临界密度点临界距离以及聚类中心主要步骤有:
[0159] 7.1临界密度点ρ0、临界距离δ0
[0160] 在对5.2的结果集{ρi},我们进行从小到达的排序,然后取点{ρi|i=C}的点作为ρ0。在对6.3的结果集{δi},我们进行从小到达的排序,然后取点{δi|i=C}的点作为δ0。
[0161] 7.2判定i是否为聚类中心m
[0162] 在步骤5.2和步骤6.3得到的{ρi},{δi}。分别判断i的ρi>ρ0,δi>δ0是否成立。若都成立则点i为聚类中心。判断所有的点我们将得到聚类中心集合{i|ρi>ρ0,δi>δ0}。
[0163]
[0164] 表7
[0165] 步骤八,聚类
[0166] 对所有点进行聚类主要步骤有:
[0167] 8.1在经过步骤5.2、6.3后将存储一份格式为i,j的文件。其中i为点的编号,j为i对应δi=min{dij|ρi<ρj}的j。并将结果存在HashMap中,key为i,value为j。
[0168] 8.2读取第一行数据,判断编号i是否属于聚类中心集合{i|ρi>ρ0,δi>δ0},如果属于则为聚类中心,读取下一行。如果不属于,判断key值为i对应在HashMap的valuej是否属于{i|ρi>ρ0,δi>δ0}。如果属于则i属于类j。如果不属于则判断key为j对应的HashMap的value是否属于{i|ρi>ρ0,δi>δ0}。如果属于则i属于类j所对应的value类。如果不属于则递归下去,直至找到i所属的聚类中心。然后读取下一行。
[0169]
[0170] 表8。