You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为输入轨迹匹配距离最近的DBSCAN聚类簇?

轨迹簇最近匹配Python高效实现方案

首先明确前提:轨迹的距离度量需要先确定,常用的包括DTW(动态时间规整)、豪斯多夫距离、LCSS(最长公共子序列),如果可以将轨迹转换为固定长度的特征向量(如方向直方图、统计特征、时序embedding等),优先选择向量化方案,效率会高几个数量级。

离线预处理(仅执行一次)

因为你已经完成DBSCAN聚类得到10个固定簇,先把聚类侧的准备工作做完:

  • 过滤掉DBSCAN输出的噪声点样本,仅保留c1到c10这10个簇的有效轨迹
  • 若选择向量化方案:预先计算每个簇的特征中心向量(簇内所有轨迹特征的均值),存为长度10的向量数组
  • 若选择原始轨迹距离匹配方案:整理所有有效轨迹和对应的簇标签,用于训练kNN分类器

最优实现代码

方案1:向量化匹配(最高效,适合实时场景)

单次查询耗时在毫秒级,适合对延迟要求高的业务,优先推荐:

import numpy as np
from sklearn.metrics.pairwise import euclidean_distances

# ------------------- 离线执行部分 -------------------
# 入参说明:cluster_feature_list 是长度为10的列表,每个元素是对应簇内所有轨迹的特征数组,形状为(n_samples, feature_dim)
cluster_centers = np.array([np.mean(cluster_feat, axis=0) for cluster_feat in cluster_feature_list])

# ------------------- 在线查询部分 -------------------
def match_nearest_cluster(t_feat: np.ndarray, cluster_centers: np.ndarray):
    """
    t_feat: 新轨迹t提取得到的特征向量,形状为(feature_dim,)
    返回值:最近的簇编号(0对应c1,1对应c2,以此类推)、对应的距离值
    """
    distances = euclidean_distances(t_feat.reshape(1, -1), cluster_centers)[0]
    nearest_idx = np.argmin(distances)
    return nearest_idx, distances[nearest_idx]

如果需要用余弦距离,替换euclidean_distances为sklearn.metrics.pairwise.cosine_distances即可。

方案2:kNN原始轨迹匹配(适合需要保留原生轨迹距离度量的场景)

如果无法做向量化,需要直接用原始轨迹点计算距离,用kNN分类器实现即可,因为只有10个簇,哪怕总样本量在1w以内,查询速度也足够:

import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from traj_dist.distance import dtw # 也可替换为你自定义的轨迹距离函数

# ------------------- 离线执行部分 -------------------
# 入参说明:
# all_valid_trajs: 所有非噪声轨迹的列表,每个元素是形状为(n_points, 2)的坐标点序列
# cluster_labels: 每个轨迹对应的簇标签,取值为0-9,对应c1-c10
def custom_traj_distance(t1: np.ndarray, t2: np.ndarray):
    # 这里可以替换为你业务中使用的轨迹距离度量
    return dtw(t1, t2)

# n_neighbors 选3-5即可,n_jobs=-1开启多核加速
knn_clf = KNeighborsClassifier(
    n_neighbors=3,
    metric=custom_traj_distance,
    n_jobs=-1
)
knn_clf.fit(all_valid_trajs, cluster_labels)

# ------------------- 在线查询部分 -------------------
def match_nearest_cluster_knn(new_traj: np.ndarray, knn_clf: KNeighborsClassifier):
    """
    new_traj: 新输入的轨迹点序列,形状为(n_points, 2)
    返回值:最近的簇编号(0对应c1,9对应c10)
    """
    return knn_clf.predict([new_traj])[0]

额外效率优化技巧

  • 轨迹点数量多的话,先对所有轨迹做RDP抽稀,减少单条轨迹的点数量,距离计算速度可以提升数倍
  • 单簇样本量过大的话,可以对每个簇做降采样,每个簇保留100-200条代表性轨迹即可,不会损失匹配精度的前提下大幅提升计算速度
  • 如果允许微小的精度损失,优先选择向量化方案,效率远高于直接计算原始轨迹距离

内容的提问来源于stack exchange,提问作者faring

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 13:36:03