轨迹聚类(二):分段及归组框架(Trajectory Clustering:A Partition-and-Group Framework)

该博文承接上一篇:
http://blog.csdn.net/jsc9410/article/details/51008444

4.线段聚类

对于线段聚类,原文采用的DBSCAN的算法,我在这篇博文里有详细讨论:
http://blog.csdn.net/jsc9410/article/details/51004057
由于DBSCAN的算法属于基于密度的聚类算法,而对于DBSCAN的研究大多是在散点的聚类背景下,因此有必要定义线段的密度。

4.1 基于线段聚类的DBSCAN名词定义

  1. 线段 Li Lj 之间的距离:回顾上篇博文有:
    dist(Li,Lj)=wd(Li,Lj)+wd(Li,Lj)+wθdθ(Li,Lj)
  2. 线段的 ε 邻域 Nε(Li) :
    Nε(Li)={LjD|dist(Li,Lj)ε}
  3. 核心线段:线段 Li(LiD) 被称为核心线段当且仅当 |Nε(Li)|MinLns
  4. 线段的直接密度可达:线段 LiD 直接密度可达线段 LjD 当且仅当 LiNε(Lj) 并且 |Nε(Lj)|MinLns
  5. 线段的密度可达:线段 LiD 密度可达于线段 LjD ,当且仅当存在一组线段 Lj,Lj1,...,Li+1,LiD 并且线段 Lk 直接密度可达于线段 Lk+1
  6. 线段的密度连接:线段 LiD 密度相连于线段 LjD 当且仅当存在一条线段 LkD 使得线段 Li 与线段 Lj 均密度可达于线段 Lk
  7. 线段的密度连接集:一个非空子集 CD 被称作密度连接集当且仅当 C 满足以下两个条件:
    1)连接性: Li,LjC,Li 密度相连于 Lj
    2)最大化: Li,LjD ,如果 LiC 并且 Lj 密度可达于 Li ,则有 LjC
    举个例子:
    轨迹聚类(二):分段及归组框架(Trajectory Clustering:A Partition-and-Group Framework)_第1张图片
    如上图,令 MInLns=3 ,加粗的线段为核心线段,线段的 ε 邻域用一个椭圆表示,基于以上的定义,可得到如下的结论:
    1) L1,L2,L3,L4,L5 均为加粗线段,即为核心线段;
    2) L2(L3) 直接密度可达于 L1 ,因为 L2 L3 均在L_1的红色椭圆里;
    3) L6 密度可达于 L1 ,然而反则不是:因为 L3 直接密度达于 L1 ,而 L6 直接密度可达于 L3 ,因此 L6 密度可达于 L1 ,但由于 L6 不是核心线段,因此这种密度可达关系不具有对称性。
    4) L1,L4L5 均为密度相连:因为 L1,L2,L3,L4,L5 形成了密度相连链。
    用图形化表示如下:
    Graph of Density Connecty

4.2线段聚类算法

原文中该算法的基本思想与DBSCAN如出一辙,对于给定的线段集合 D ,算法输出聚类集合 O ,对于输入的每条线段,算法会对其进行分类,即核心线段和边界线段。
算法过程分三步:
1. 对于每一条未分类的线段L,算法计算其的 ε 邻域以判断该线段是否为核心线段。若L为核心线段,则程序跳转第2步。
2. 计算核心线段的密度相连集合并把其加入该核心线段组成的簇中。如果新加入的线段未被分类,则把其加入队列Q中以做进一步扩展,因为该线段可能是核心线段;若新加入的线段不是核心线段,则不加入队列Q中。
3. 计算每个簇的基数,若其值小于阈值,则算法将该簇淘汰,因为其不够密集。
完整的算法描述为:
轨迹聚类(二):分段及归组框架(Trajectory Clustering:A Partition-and-Group Framework)_第2张图片
若对线段采用索引的方式组织,算法复杂度为 O(nlogn) ,否则为 O(n2) ,其中n为线段的个数。

4.3 轨迹簇的可视化表示

利用4.2的算法可以将轨迹基于密度分为多个簇,然而对于一个簇中所有轨迹的走向及其它特征并没有直观简洁地展示出来,因此有必要提取簇中的整体信息并用可视化的手段展示出来方便进一步分析。
一种可行的方法是计算簇中的平均轨迹,用平均轨迹来代表整个簇中轨迹的整体信息。原文中将这条轨迹形象地称为“代表性轨迹(Representative Trajectory)”。
生成代表性轨迹的方法如下:
轨迹聚类(二):分段及归组框架(Trajectory Clustering:A Partition-and-Group Framework)_第3张图片
用一条垂直于簇中线段的平均走向的直线扫描各条线段,每次经过一条线段的起点或终点时都要判断一下此时相交线段的个数是否不小于MinLns。若是,则计算一个所有交点的平均点并存储于列表中,否则不予理会。最终生成的列表即为平均轨迹的结点坐标信息。
这里忽略了一个问题,簇中线段的平均走向如何计算?
原文中是将簇中所有的线段用向量表示,向量的长度为线段的长度,将所有向量相加并单位化即可代表簇中线段的平均走向。
除此之处,由于算法要反复计算扫描直线与簇中线段的交点,如果扫描直线与x轴所成角度不为90度的整数倍,则计算量稍大。因此算法对此进行了预处理,将坐标系旋转使X轴与平均走向平行,这样计算起来就方便许多。
完整的算法描述如下:
轨迹聚类(二):分段及归组框架(Trajectory Clustering:A Partition-and-Group Framework)_第4张图片

Reference:
Trajectory Clustering: A Partition-and-Group Framework,Jae-Gil Lee, Jiawei Han,Kyu-Young Whang

你可能感兴趣的:(算法,clustering)