Trajectory Clustering
1. 步骤
- 提取轨迹特征点
- 使用DBSCAN算法聚类
2. 提取轨迹特征点
2.1 算法思想
一段轨迹,比如 {p1,p2,p3,p4,p5},遍历这个轨迹的所有点,计算每一个点的MDLpar和MDLnopar,如果MDLpar > MDLnopar,那么这个点就是特征点(MDL就是最小描述原则,有兴趣可以自行搜索)
算法伪代码
2.2 计算MDLpar和MDLnopar
轨迹 {pc1,pc2,pc3,pc4,ppari}
比如
MDLpar = L(H) + L(D|H)
MDLnopar = L(H)(轨迹总长度,上图为len(p1,p2)+len(p2,p3)+len(p3,p4))
两条线段Lj,Li(短的为Lj,长的为Li)
2.3 代码
2.3.1 一些计算距离的函数
def calc_distance(p1, p2):
"""计算p1,p2的直线距离"""
return math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2)
def calc_straight_line(p1, p2):
"""计算p1 p2的直线方程"""
try:
k = (p1[1] - p2[1]) / (p1[0] - p2[0])
except ZeroDivisionError:
k = 0
b = p1[1] - k * p1[0]
return k, b
def calc_projection(p1, p2, p3):
"""计算 p1 在 线段(p2,p3)上的投影点"""
k, b = calc_straight_line(p2, p3)
x = (k * (p1[1] - b) + p1[0]) / (k ** 2 + 1)
y = k * x + b
return [x, y]
def calc_point_line_distance(p1, p2, p3):
"""计算点 p1 到 线段(p2,p3)的距离"""
a = p3[1] - p2[1]
b = p2[1] - p3[1]
c = p3[0] * p2[1] - p2[0] * p2[1]
try:
distance = (math.fabs(a * p1[0] + b * p1[1] + c)) / (math.pow(a * a + b * b, 0.5))
except ZeroDivisionError:
distance = 0
return distance
def calc_angel_sin(p1,