☰
NGSIM驾驶风格识别:从轨迹特征到高斯混合聚类
2026/10/21 6:14:16 网站建设 项目流程

1. 为什么偏偏是NGSIM:一份轨迹数据集背后的驾驶风格密码

1.1 NGSIM里到底藏着什么

NGSIM是公开的车辆轨迹数据集,最早是几个高速路段的真实视频采集,再用图像处理还原出每一辆车的微观轨迹。很多人一听到"公开数据集"就以为只是给算法练手,实际上NGSIM的字段设计得非常适合做驾驶行为研究。每辆车有独立的车辆ID,每隔0.1秒记录一次,包含了时间戳、横向/纵向位置、速度、加速度、所在车道,以及前车ID、跟车距离等直接反映驾驶交互的信息。你可以把它理解成把一段高速上的交通流变成了一个巨大的数据库,每一辆车都是一个样本,每一个样本背后都藏着一位驾驶员的操作习惯。

当时我拿到这份数据的时候,第一反应是做更复杂的轨迹预测模型,后来发现,如果能够先把司机分成不同风格,再做预测或决策,模型会更有解释性。这也是这篇文章的出发点:从NGSIM的原始轨迹数据里提取驾驶风格特征,然后用高斯混合聚类把司机划分成几类。整个过程听上去像是一个标准的机器学习小项目,但真正做下来,坑非常多,尤其是特征提取部分,稍微处理不当,聚类结果就会变成一堆没有意义的数字。

1.2 驾驶风格识别能给现实带来什么

很多人会问,驾驶风格识别有什么用?最简单的场景是车险定价。激进驾驶者的出险概率明显比温和驾驶者高,如果可以用客观轨迹数据识别风格,保险公司就能更精准地定价,而不是只看年龄和违章记录。再往深了说,自动驾驶系统的个性化控制也依赖风格识别。同一套跟车策略,保守型驾驶员觉得舒适,激进型驾驶员可能会觉得太肉。如果车辆能在启动前识别乘客的驾驶偏好,就能自适应地调整加速曲线和跟车距离。

另一个重要场景是安全预警。高速上突然频繁变道、急加速急减速的车辆,往往就是潜在的交通事故风险源。从NGSIM中提取这些特征,用聚类模型学习出"激进型"的分布模式,然后部署到实时车载数据流中,就能在危险操作发生前给出预警。我这边拿模拟数据做过一轮验证,效果是可行的,但前提是聚类模型的质量要足够稳定。这也是我选择高斯混合模型而不是K-means的一个核心原因,后面会详细展开。

2. 特征提取:把驾驶员的"脾气"翻译成数字

2.1 微观轨迹特征怎么选

驾驶风格是一种抽象概念,要让它能被聚类算法处理,就必须转化成数值特征。NGSIM提供的是高频轨迹数据,最直接的办法是从速度和加速度中提取统计量。我最初列了一张很长的特征清单,包括速度均值、速度标准差、最大速度、85%分位速度、最大加速度、最小加速度、加速度标准差、正加速度均值、负加速度均值、急加速频次、急减速频次、平均车头时距、最小车头时距、换道次数等等,算下来有将近20个特征。

但特征并不是越多越好。NGSIM的每条轨迹长度不一样,有的车辆只在视野中出现了几十秒,有的则跟了好几公里。如果对整段轨迹取平均,一辆车在中间停了10秒和另一辆车全程匀速行驶,最后计算出来的特征差异会很大。我的做法是先把每条车辆轨迹按照连续时间片分割成固定长度的片段,比如每60秒一个样本。一个连续片段内的驾驶行为相对稳定,不同片段之间则可以体现出同一驾驶员不同时间段的状态变化。这样做还有一个额外的好处:样本量比按车辆数量多了好几倍,聚类模型的统计功效会更足。

在具体特征选择上,我更关注那些和驾驶风格有明确关联的指标,而不是单纯追求大而全。速度均值反映整体驾驶倾向,但两个司机可能速度均值相同,一个平稳跟车,一个频繁加减速,这时加速度波动和急加减速频次就能把两人区分开。跟车特征也一样,车头时距太短的人往往更有侵略性,因为他愿意冒更大的风险紧贴前车。换道频率高的人通常也更激进。

2.2 激进程度量化:急加减速与跟车距离

急加速和急减速是最能直接体现驾驶风格的行为。研究中常以加速度绝对值作为阈值,比如把加速度大于2.5 m/s²记为急加速,小于-2.5 m/s²记为急减速。不同研究取的具体阈值不完全一致,有的用2 m/s²,有的用3 m/s²,这个可以结合数据分布去调整。我的经验是先看整体加速度分布的百分位数,找到大约5%和95%的位置作为动态阈值,而不是拍脑袋定一个固定值。这样在不同路段、不同流量状态下,特征定义会更鲁棒。

跟车距离方面,我先计算车头时距(time headway),公式很简单:车头时距 = 自车与前车的间距 / 自车速度。这个指标比单纯的距离更有参考价值,因为它把速度因素去掉,直接反映驾驶员留给自己的反应时间。高速上速度很快的时候,如果还保持很小的车头时距,说明驾驶员对风险容忍度很高。我在特征清单里加入了平均车头时距、车头时距低于1秒的时间占比、最小车头时距等几个指标,它们和急加减速频次共同构成了"激进驾驶"的核心数值表达。

此外还应该考虑一个组合特征:平均加速度变化率,也就是加加速度(jerk)。这个指标在NGSIM原始数据中不直接提供,但可以用加速度差分近似。加加速度大说明操作比较粗暴,平稳驾驶员的加加速度通常很小。不过加加速度对噪声极其敏感,NGSIM的加速度本身已经有平滑处理,但依然需要再做一次滤波,否则差分出来的序列会全是毛刺。

2.3 特征相关性处理与标准化

特征提取完以后不要急着丢进聚类模型,先做两件事:相关性分析和标准化。

相关性分析非常重要。速度均值和85%分位速度往往高度相关,平均加速度和正加速度均值也是线性相关的。如果保留这些高度相关的特征,高斯混合模型中协方差矩阵的行列式可能趋近于零,EM算法会非常不稳定。我通常计算特征两两之间的皮尔逊相关系数,把相关系数高于0.8的特征只保留其中一个。有争议的时候优先保留业务含义更强、更容易解释的特征,比如速度均值保留,85%分位速度可以删掉。

标准化更是绕不开的一步。速度的单位是m/s,加速度的单位是m/s²,换道频率的单位是次/分钟,如果直接拼接成特征向量,速度的绝对数值会主导距离计算,聚类结果基本上等于按速度分类。我用的是Z-score标准化,把每个特征减去均值再除以标准差,让所有特征都落在相近的尺度上。这里有一个小细节:标准化必须基于全部样本的统计量来做,不能在分组之间分别标准化,否则会破坏样本之间的可比性。

做完这些之后,特征矩阵的形状大概是样本数乘8到10个特征,已经可以直接喂给GMM了。

3. 高斯混合聚类:软划分比硬划分更能反映驾驶风格

3.1 GMM的核心假设与EM求解思路

高斯混合模型的核心假设是:总体的样本来自若干个高斯分布,每个分布对应一种潜在类别。放在驾驶风格场景里,就是说存在K种典型的驾驶风格,每一种风格的速度、加速度、跟车等特征都围绕一个中心值上下波动,整体符合正态分布。K种风格按一定比例混合在一起,就形成了我们观测到的样本分布。

数学表达上,每个样本x的概率密度是K个高斯分布的加权和。模型要估计的参数包括每个高斯分布的均值向量、协方差矩阵,以及混合权重。求解这些参数靠的是EM算法。EM算法分两步循环:E步根据当前参数计算每个样本属于每个类别的后验概率;M步用这些概率重新估计参数,让似然函数最大化。和K-means的一个最大区别是,GMM的每个样本不是非此即彼地属于某一个簇,而是同时带有"这个样本有60%可能属于激进型,30%可能属于普通型,10%可能属于保守型"这样一套概率向量。

这一点在驾驶风格识别中特别有意义。一个平时温和但突然赶时间踩了几脚油门的人,他的行为本来就不是纯粹的某一种风格;强行把他划进某一类本身就是一种信息损失。GMM的概率输出保留了这种不确定性,下游应用可以自己设定阈值来决定置信度,比如概率大于0.8才视为明确风格,否则标记为混合型。我在实际项目里就是按这个逻辑处理,效果比硬分类更细腻。

3.2 确定聚类数量:BIC/AIC曲线怎么用

聚类数量K的选择是过不去的坎。K太小会合并不同风格,K太大又会出现拆分的伪簇。我不太推荐用K-means那种轮廓系数去选GMM的K,因为GMM是概率模型,轮廓系数基于距离,两者不适配。更合理的做法是用信息准则,比如贝叶斯信息准则(BIC)或者赤池信息准则(AIC)。

实际操作时,我通常跑一整个K值范围,比如从2到8,对每个K都拟合一个GMM,记录下对应的BIC值。BIC的公式里包含对数似然和一项惩罚项,后者还会考虑样本量和参数个数,所以BIC会随着K增大先下降,到达某个最低点后再回升。选择BIC最低对应的K,同时也要看看每个簇的样本比例是否合理。如果某个簇只有不到5%的样本,很可能K设大了。

有一次我遇到BIC在K=5时最低,但K=3和K=4的BIC值非常接近。这时候不需要硬选K=5,因为相差很小的BIC说明模型复杂度增加带来的拟合改善并不显著。这种时候我更倾向于选K=3,因为从业务解释性角度,保守、普通、激进三类最容易被行业理解和接受。统计指标是参考,不是教条。

3.3 从概率归属到风格标签

拟合完K个簇后,GMM会给每个样本输出一个K维后验概率向量。取最大概率对应的簇作为硬标签,同时保留概率值本身。我习惯把最大概率小于0.7的样本标记为"不确定/混合",不参与后续的风格画像统计,这样可以保证提取出的风格特征更纯粹。

聚类标签本身没有语义。K=3跑出来第0簇可能是保守型,第1簇是激进型,第2簇是普通型,但换一次随机种子,第0和第1簇可能就互换了。所以在报告结果之前,我必须先看每个簇的中心特征,根据特征含义手动给簇起名。比如簇中心显示速度均值低、加速度波动小、车头时距大,那这个簇就命名为保守型。这个步骤其实也是一个数据质量验证过程,如果某个簇的特征无法给出合理的业务解释,我就要回头检查特征提取有没有问题。

4. 聚类结果画像:三种驾驶风格长什么样

4.1 簇中心与特征分布解读

下面这张示意表是我从一轮典型实验中整理出来的,用来展示三个簇的中心特征对比。注意这只是一个示意性结果,具体数值会因为特征定义和路段选择不同而变化,但关键趋势是稳定的:

特征簇0(保守型)簇1(普通型)簇2(激进型)
速度均值较低中等中等偏高
速度标准差低中高
急加速频次低中高
急减速频次低中高
平均车头时距长中等短
换道频次低中等高

从表中可以看到,保守型驾驶员的特点是"稳"字当头:速度不快但波动也很小,跟车距离拉得很长,极少主动变道。普通型介于两者之间,该快的时候快,该慢的时候慢,但操作幅度相对温和。激进型则呈现明显的"高频大动作":急加速急减速频繁,车头时距经常压到很短,换道动作频繁且干脆。

还有一点容易被忽略的是簇内差异。GMM的协方差矩阵告诉我每个簇的内部离散程度。通常激进型的簇内方差最大,因为激进驾驶行为的表现形式很多样:有人是加速猛,有人是喜欢钻缝变道,有人是刹车特别晚。保守型的簇内方差往往比较小,因为保守的标志就是稳定。理解了这一点,就不会把"激进型"看作一个大一统的标签,而会继续细分或者结合具体特征子空间去描述。

4.2 风格的时间稳定性验证

聚类做完之后,我做的第一件验证不是画图美观不美观,而是检查这些风格标签在时间上是否稳定。具体做法是:把同一辆车的完整轨迹按时间分成两个等长的部分,分别提取特征,然后用已经训练好的GMM模型分别预测这两段特征的标签,统计同一辆车两次标签一致的比例。

如果一致性比例太低,说明当前特征定义捕捉到的更多是随机波动,而不是稳定的驾驶性格。我做过一组对比实验:只用速度统计特征时,前后段一致性只有58%,接近随机水平;加入加加速度变化率和车头时距特征后,一致性提升到了74%左右;继续把特征片段延长到90秒,一致性进一步提高到81%。这个结果说明,驾驶风格确实有稳定成分,但需要足够长的观测窗口和足够细致的操作特征去还原它。

时间稳定性的价值在于应用落地。如果车载系统要在短短30秒内判断驾驶员风格,那误差会很大;但如果有2到3分钟的观测窗口,判断结果就可靠很多。NGSIM数据是连续轨迹,非常适合做这种时间切片分析。

4.3 结果可用于哪些下游任务

从NGSIM聚类得到的驾驶风格标签,可以直接作为新特征送进下游模型。我试着把风格标签当作分类特征加入一个跟车行为预测模型,发现预测误差略有下降,而且模型在解释性上变得更好了——激进型样本的预测结果和保守型样本的预测结果呈现完全不同的误差模式。

更进一步,可以把实时车载传感器数据流做同样的特征工程,用一个已经训练好的GMM模型做在线预测。这种情况下,GMM的软分类比硬分类更有价值:如果模型判断当前驾驶状态在激进型概率高达0.9,安全系统可以提前拉高预警阈值,或者限制某些快速变道辅助功能的介入强度。如果概率在几个风格间漂移不定,系统就不应该采取任何强干预措施。

在车路协同场景中,群体层面的驾驶风格分布也很有用。统计一个路段上所有车辆的激进型占比,可以辅助评估该路段的潜在驾驶风险水平。NGSIM本身是几十年前的采集数据,但方法完全可以迁移到新的轨迹数据上。

5. 实操踩坑:处理NGSIM与GMM时的六个教训

5.1 数据清洗的坑:车辆轨迹的断点比想象中多

NGSIM数据看着整齐,实际上存在不少断点。有些车辆的ID不变,但中间整整跳过几十帧,可能是因为遮挡或者跨摄像头区域时跟踪丢失。如果我没检查时间戳连续性就直接算加速度分布,就会把这些"瞬移"当成正常的急加速,特征严重失真。

我的做法是,在按车辆ID分组之后,先检查每条轨迹的时间戳间隔。NGSIM标准采样间隔是0.1秒,如果间隔大于0.2秒,就认为轨迹断开,把片段截断。一个片段最少要持续30秒以上才进入样本池,太短的片段算出来的统计量不稳定。这个清洗步骤做与不做,最终聚类结果差异非常大。

另一个容易踩的是坐标轴。NGSIM有的文件使用局部坐标,有的数据表里纵向坐标是沿道路方向的距离,横向坐标是车道偏移量。如果不先搞清楚每个字段的几何含义,提取的"速度""加速度"可能是算错了方向的分量。我后来写了一套统一解析函数,对不同路段的文件先做字段映射,再统一换算成标准国际单位,省去了大量查错时间。

5.2 GMM初始化的坑:n_init必须设置

GMM的EM算法对初始值很敏感。我在第一次跑的时候,直接用默认参数调用高斯混合模型,结果连续跑几次,得到的BIC值都不一样,而且有一类簇每次分的样本数差异巨大。原因就是EM算法陷入局部最优。

解决办法很简单:设置较大的n_init值,让算法用不同初始点跑多遍,最后选择对数似然最高的那一次。我在实验中把n_init设为20,虽然耗时增加了一点,但结果稳定多了。还有一个技巧是设置init_params='kmeans',使用K-means的聚类中心作为GMM的初始中心,收敛速度更快,效果也更好。如果你发现某个簇的中心和另一个簇的中心几乎重合,基本就是初始化没调好。

另外,协方差类型也需要按样本量调整。默认的full协方差矩阵最灵活,但要估计的参数也最多。我的样本量在几千左右时,full没问题;如果某个场景下样本量只有几百,我会改用diag,也就是每个维度独立方差,参数更少,更不容易过拟合。

5.3 特征维数爆炸的坑:别把分位数全塞进去

有人喜欢把速度、加速度的每一个分位数都当特征,5%、10%、15%……一路算到95%,最终得到几十个特征。这种做法的后果是特征间存在极强的线性相关,GMM的协方差矩阵变成奇异的,EM算法直接不收敛,或者收敛后协方差矩阵里有负数方差。

我的建议是:每个指标只保留三到四个有代表性的分位数,比如中位数、85%分位数(刻画偏高速行为)、15%分位数(刻画低速行为)。反馈到加速度上,保留正加速度95%分位数和负加速度5%分位数,就要看它们的绝对值。分位数特征的优点是对异常值不敏感,但代价是冗余,需要严格筛选。

还有一个很实际的坑是标准化时机。如果你把全部数据标准化后再划分训练集和测试集,会导致信息泄漏。但聚类没有标签,通常用全部数据去拟合模型,这时标准化可以用全部样本的均值和方差。如果你把训练好的模型部署到在线环境,务必保存当时的标准化参数,用同样的scaler去转换新的数据,否则输入分布一偏,预测概率立刻不准。

5.4 结果验证的坑:标签号不是一回事

我第一次看到聚类结果时,记录文档里写着簇0是激进型,簇1是保守型。后来重新跑了一次程序,没改任何代码,只换了随机种子,结果簇0变成了保守型。我一度以为模型坏了,后来才意识到GMM不会自动把语义和簇号绑定。

所以在任何正式报告中,我都不直接说"簇1占比多少",而是先打印每个簇的中心向量,人工核对特征方向,再给簇命名。如果后续要做不同模型的对比,类别标签还需要用匈牙利算法做标签对齐,否则聚类准确率之类的指标全是乱账。

还有一个小提醒:GMM是软聚类,后验概率分布有时候会出现两个簇的最大概率非常接近,比如一个是0.51,一个是0.49。这种样本强行贴标签毫无意义。我在统计时会把这类样本单独标记为"混合型",再做Kappa一致性检验时,混合型样本直接剔除,否则会把一致性压低到虚假的水平。

5.5 最后一个教训:不要迷信公开数据集的"干净"

NGSIM虽然是公开数据集,但并非完美到可以直接用。它采集自几十年前的高速路场景,跟车行为、速度分布和现在的车流状况肯定有差异。用这个方法做研究可以,但如果想直接用它训练一个产品级驾驶风格分类器,数据漂移问题会很严重。

我会在最终报告中明确区分两个层次:一是方法验证,二是结果迁移。方法本身是通用的,只要换成当前车辆采集的轨迹数据,整个特征提取和聚类流程稍作参数调整就能复用。单纯把NGSIM的聚类模型部署到新环境,风险很大。这也是一些初学者容易犯的错:总希望找到一个现成模型直接套用,其实更靠谱的做法是参考这篇分析逻辑,在自己的数据上重新走一遍流程。

另外,如果你和我一样使用Python的scikit-learn库做GMM,记得把random_state固定下来,否则报告里的结果无法复现。这一点在业内做可解释研究时特别重要,有时候评审一质疑,想回看当初的聚类结果,结果因为随机种子没固定,生成的标签全变了,非常尴尬。

整体走下来,基于NGSIM的驾驶风格特征提取与高斯聚类分析,难度并不在算法本身,而在特征工程和数据理解。GMM的所有原理和参数都可以从文档中学到,但对轨迹数据的耐心打磨、对每一个特征背后物理含义的把握,才是决定结果质量的关键。如果你以后拿到自己的轨迹数据,不妨先耐着性子把数据清洗做扎实,然后一点点试特征组合。你会发现,真正困难的部分不是聚类,而是读懂每一段轨迹里那个司机到底想做什么。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询