从数据集中删除相似的数据点
Remove similar data points from dataset
我正在 google 地图上规划旅程。数据量正在降低地图的性能,因此我正在寻找一种方法来减少数据量。具体来说,我希望删除彼此非常相似的情节点。
我有一组位置数据来描述一个人的旅程。这些数据点本质上是一个包含一些相关元数据的 lat/longs 的大列表,例如速度。
我记得线性回归模型可用于删除 "similar" 仅根据位置数据出现在一条线上的点,但它可以扩展到还包括另一个字段,例如速度吗?
即如果我有以下几点(为简洁起见,我将使用 X,Y 而不是 latlng)。我将绘制 dia
中的点
- { 纬度:0,经度:0,速度:0}
- { Lat: 1, Lng: 1, Speed: 0 } // 可以删除
- { Lat: 2, Lng: 2, Speed: 1 } // 可以删除
- { Lat: 3, Lng: 3, Speed: 30 } // 大变化,保持
- { Lat: 4, Lng: 4, Speed: 30 } // 可以删除
- { Lat: 5, Lng: 5, Speed: 30 } // 可以删除
- { Lat: 1, Lng: 5, Speed: 30 } // 大变化,保持
任何人都可以给我一些真正的代码如何做到这一点?我正在使用 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) 并且您继续删除所有内容!我的建议是将每个节点与前一个节点进行比较,计算距离,然后如果你要删除它,首先将它与你没有删除的最后一个节点进行比较。这样,即使您不断删除彼此靠近的多个节点,您仍然会知道何时距离包含的最后一个节点足够远。这只是一种没有所有讨厌的线性回归东西的方法...
我正在 google 地图上规划旅程。数据量正在降低地图的性能,因此我正在寻找一种方法来减少数据量。具体来说,我希望删除彼此非常相似的情节点。
我有一组位置数据来描述一个人的旅程。这些数据点本质上是一个包含一些相关元数据的 lat/longs 的大列表,例如速度。
我记得线性回归模型可用于删除 "similar" 仅根据位置数据出现在一条线上的点,但它可以扩展到还包括另一个字段,例如速度吗?
即如果我有以下几点(为简洁起见,我将使用 X,Y 而不是 latlng)。我将绘制 dia
中的点- { 纬度:0,经度:0,速度:0}
- { Lat: 1, Lng: 1, Speed: 0 } // 可以删除
- { Lat: 2, Lng: 2, Speed: 1 } // 可以删除
- { Lat: 3, Lng: 3, Speed: 30 } // 大变化,保持
- { Lat: 4, Lng: 4, Speed: 30 } // 可以删除
- { Lat: 5, Lng: 5, Speed: 30 } // 可以删除
- { Lat: 1, Lng: 5, Speed: 30 } // 大变化,保持
任何人都可以给我一些真正的代码如何做到这一点?我正在使用 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) 并且您继续删除所有内容!我的建议是将每个节点与前一个节点进行比较,计算距离,然后如果你要删除它,首先将它与你没有删除的最后一个节点进行比较。这样,即使您不断删除彼此靠近的多个节点,您仍然会知道何时距离包含的最后一个节点足够远。这只是一种没有所有讨厌的线性回归东西的方法...