① DTC深度轨迹聚类算法
A deep trajectory clustering method based on sequence- to- sequence autoencoder model论文原文名称《一种基于序列到序列自动编码器模型 的 深度轨迹聚类方法》
“序列到序列”就是:输入一串序列,输出另一串序列。输入一段轨迹点数据,输出压缩后的轨迹特征。
自动编码器是一种神经网络模型,用来把输入数据压缩成“隐藏特征”,再尽量还原出来。
“编码器”:把复杂的东西压缩、抽取出核心特征。
“解码器”:把这些特征重新还原成原来的样子。
在这里,它的作用是学习轨迹的内在模式,把原始轨迹变成更简洁、可比较的表示。
解决的问题:当前轨迹聚类使用点匹配相似度度量,相似度精度较差,降低聚类质量。
作者设计新的方法DTC,把轨迹数据变换到一个个小小的向量,更适合聚类的空间。
“聚类中心”就是每一类的“代表轨迹”,就像把同类的轨迹找个“队长”来代表大家。
作者的方法是 同时学这两个东西:既学轨迹的表示方式,又学每一类的中心,而不是先做一个再做另一个。轨迹是有顺序和连续性的,所以分组的时候也考虑轨迹的起点和终点,让分出来的类别更连贯。
Ⅰ、自编码器网络预训练序列到序列来压缩+还原轨迹,学习轨迹的主要特征。轨迹—>初步向量表示。
Ⅱ、把轨迹向量、聚类中心放在一个模型里面共同优化,让表示方式和分类效果互相促进。
Ⅲ、真实城市交通数据,利用学习的轨迹表示发现一些现实中的路线。
轨迹对象可以看作是一系列具有位置属性和时间戳的GPS记录。
① 先翻译轨迹 → 向量。
一条轨迹是很多 GPS 点组成的,长短不一,形状不规则。DTC 把地图切成小格子(像把城市切成很多方块),每条轨迹就变成“经过了哪些格子”的序列。
把研究区域划成等大小的空间网格,每个格子视为一个离散 token(词表里的一个词)。落在同一格的点都用同一个 token 表示。例如示意里把区域切成 9 格:词表 V={g1…g9};轨迹 t1= {g1,g2,g3},t2= {g4,g7,g8,g9}。
用一个“翻译机”(Seq2Seq自编码器)把这些序列翻译成一段固定长度的数字向量(比如256维)。
预训练(Seq2Seq Autoencoder)
编码器(Encoder):将轨迹token序列映射到固定长度向量 v。采用GRU单元(3层,每层256维)。顺序读入 token 序列 x=(x1,…,xT′),得到隐藏状态 ht′,最终把序列压成一个固定维度向量 v(通常取最后一个隐藏态)。这一步就是“把整条轨迹压缩成摘要”。
解码器(Decoder):根据向量v重构原始轨迹序列。用v作为条件,逐步预测重构序列 y=(y1,…,yT),即学习条件分布 P(y∣x)。
目标函数:最小化原轨迹分布与重构轨迹分布之间的KL散度,结合空间邻近约束(只计算目标点附近K个格子,降低计算量)。以真格子为中心、相近格子也给权重的空间邻近分布 Prt,和解码器输出的分布 Pyt做 KL 散度。训练后得到初步的轨迹低维表示。
② 让向量更适合聚类。
现在拿到每条轨迹的向量,重复跑kmeans,随机初始化,最优的结果的中心作为后续联合优化的初始化。
单纯翻译成向量还不够,DTC会一边学“怎么重建原轨迹”,一边学“向量要能分成几堆”。像把学生按性格分组:既要让每个人能描述自己,还要能自然分到某个小圈子。
③ 聚类。
开始时用 K-means 给个初始分组。然后系统一边调整“轨迹向量”,一边移动“聚类中心”,最后同时收敛。
② GRU门控循环网络(李沐)
目的:关注序列的时候,不是每个观察值都是同等重要。控制网络要关注哪一部分。
想要只记住相关的观察需要:
1、能关注的机制(更新门)
2、能遗忘的机制(重置门)
多了几个学习的权重:
两个全连接层学习重置和更新门的相关信息,之后sigmoid。
再加上一个候选隐藏状态H:
👇这个公式,假设不看Rt,Ht就是RNN的隐藏状态公式,即当前信息+上一层信息。
而点⚪:“按照元素相乘”,驾驶里面的元素靠近0,Rt和Ht-1按照元素相乘就会变得像是0。假设Rt全是1,那么全部信息都用来学习,这一个“()”就是看一个东西过来,确定哪些东西输送到我们的网络。
隐藏状态
Zt如果=1,那么Ht=Ht-1,相当于忽略了新来的一个信息。如果Zt=0,不拿过去的状态,就看现在的一个状态。
R_t 和 Z_t 都是根据过去的状态 H_{t-1} 和当前输入 X_t 计算得到的 【0,1】 之间的量。 R_t 首先与 H_{t-1} 进行元素积,由于 R_t 内部都是 【0,1】 的变量,因此是对过去的状态 H_{t-1} 进行一次选择,R_t 在某个位置的值越趋近于0,则表示这个位置的过去信息越倾向于被丢弃,反之保留。 随后与 X_t 一起构成候选隐藏变量 \tilde{H}_t。同样由于 R_t 的值在 【0,1】 中,它只会削弱过去的状态,而不会增强,因此被称为遗忘门(或重置门,重置过去的状态)。
Z_t 被称为更新门,因为它控制了隐藏状态的更新。假如Z_t全为1,则 H_t 将完全保留上一个时间的状态 H_{t-1};反之,则全盘采用当前时刻的候选隐藏变量{H}_t。 或许各位会有疑问,感觉 R_t 已经对过去有所选择,为何还要加上 Z_t 多此一举。个人认为,Z_t 实际上是对当前进行选择,根据老师的例子,如果一个序列中已经有很多的“猫”,那么再输入猫,实际上对于网络的正收益不大,可以抛弃,而 R_t 只能选择过去,不能抛弃当前,而 Z_t 可以。
总而言之,GRU通过两个门控网络,根据过去状态和当前输入,一方面对过去状态进行选择,一方面对当前状态也进行选择。
学习的权重=RNN两倍。
要更新新的隐藏状态,需要使用过去多少的信息。
要更新新的隐藏状态,需要当前Zt多少相关信息。
目的:判断是否要关注Xt,要关注多少。
——小狗照亮每一天
2025.9.9