使用自定义距离函数在scipy中聚类GPS点

1 投票
1 回答
658 浏览
提问于 2025-04-18 12:24

我想知道在使用scipy进行聚类时,是否可以自己定义两个点之间的距离函数。我有一些数据点,包含三个值:GPS的纬度、经度和时间戳。我想用某种算法来对这些点进行聚类,比如层次聚类、均值漂移,或者其他方法。

问题是,计算GPS点之间的距离需要用到Haversine公式。而且,这个距离还需要适当加权,以便能和以秒为单位的距离进行比较,以便用于聚类。

我查看了scipy的文档,没有找到明显的方法来指定两个点之间的自定义距离。

我应该用其他方法来解决这个问题吗?我想知道在Python中应该怎么做。

1 个回答

0

你问的是关于sklearn的内容,但我这里没有好的答案。简单来说,你可以按照自己的方式构建一个距离矩阵,很多算法都能处理这个距离矩阵。不过,这样做需要的内存是O(n^2),也就是数据量越大,所需的内存就越多。

在我处理地理数据的聚类尝试中,我使用了ELKI(这是一个Java程序,不是Python)。首先,它包含了地理距离的计算功能;而且它还为很多算法和这个距离函数提供了索引加速。

我没有使用像时间这样的额外属性。正如你已经注意到的,你需要适当地给它们加权,因为1米和1秒是不能直接比较的。权重会根据具体情况而有所不同,而且是基于经验的。

我推荐ELKI是因为他们有一个很好的自定义距离函数的教程,这个函数可以在大多数算法中使用。不过,并不是所有算法都能用这些函数,有些算法根本不使用距离,或者只限于某些特定的度量方式,比如明可夫斯基度量。但很多算法可以使用任意的(甚至是非度量的)距离函数。

此外,还有一个关于索引加速距离函数的后续教程。对于我的地理数据,索引非常有用,速度提升超过100倍,这让我能够处理更多的数据。

撰写回答