从数据集中删除相似的数据点

Remove similar data points from dataset

我正在 google 地图上规划旅程。数据量正在降低地图的性能,因此我正在寻找一种方法来减少数据量。具体来说,我希望删除彼此非常相似的情节点。

我有一组位置数据来描述一个人的旅程。这些数据点本质上是一个包含一些相关元数据的 lat/longs 的大列表,例如速度。

我记得线性回归模型可用于删除 "similar" 仅根据位置数据出现在一条线上的点,但它可以扩展到还包括另一个字段,例如速度吗?

即如果我有以下几点(为简洁起见,我将使用 X,Y 而不是 latlng)。我将绘制 dia

中的点

任何人都可以给我一些真正的代码如何做到这一点?我正在使用 javascript 但可以从任何语言或伪代码转换。如果速度不能包括在内,有人可以帮我做线性回归算法吗?

抱歉,如果我的数学术语不是很好,我的数学知识有点不够深入!

这是一个使用 reduce 循环遍历创建新数组的所有条目的示例,条目将被忽略,以防它们与前面的条目过于相似 (distance*speed > 5);

var data = [
  { Lat: 0, Lng: 0, Speed: 0 },
  { Lat: 1, Lng: 1, Speed: 0 }, // could be removed
  { Lat: 2, Lng: 2, Speed: 1 } ,// could be removed
  { Lat: 3, Lng: 3, Speed: 30 }, // big change, keep
  { Lat: 4, Lng: 4, Speed: 30 }, // could be removed
  { Lat: 5, Lng: 5, Speed: 30 }, // could be removed
  { Lat: 1, Lng: 5, Speed: 30 }
]

function distance(a,b){
    return Math.sqrt( Math.pow(a.Lat - b.Lat, 2) + Math.sqrt( Math.pow(a.Lng - b.Lng, 2) ))
}

function speedDif(a,b){
  return Math.abs(a.Speed - b.Speed)
}
var res = data.reduce((ac,x) =>{
  if(!ac.length)
    ac.push(x);
  else {
    const last = ac[ac.length -1 ];
    if(distance(last, x) * speedDif(last, x) > 5) //for ex.5
    ac.push(x)
  }
  return ac;
},[])

console.log(res)

您要查找的似乎是一个简单的点间距离计算器。因此,对于每个点,计算到下一个点的距离,如果它大于某个预定距离,则保留它,否则将其删除。唯一的问题是,假设您从 (1,1) 到 (2,2) 到 (3,3) 到 (4,4) 到... (1000,1000) 并且您继续删除所有内容!我的建议是将每个节点与前一个节点进行比较,计算距离,然后如果你要删除它,首先将它与你没有删除的最后一个节点进行比较。这样,即使您不断删除彼此靠近的多个节点,您仍然会知道何时距离包含的最后一个节点足够远。这只是一种没有所有讨厌的线性回归东西的方法...