如何在没有固定维度的情况下计算Python中的欧氏距离?

时间:2014-09-26 07:07:17

标签: python algorithm numpy scipy euclidean-distance

我打算计算两组大数据之间的欧氏距离。我用谷歌搜索了名为SciPy的模块将完成工作,其机制是通过k-d树。

但我没有固定的尺寸。我的数据结构如下:

data1 = {"1": {"a": 1, "b": 2}}
data2 = {"3": {"a": 2, "c": 3}, "4": {"b": 1, "d": 4}}

因此"1""3"之间的距离为(2-1)2 + (2-0)2 + (3-0)2"1""4"之间的距离为(1-0)2 + (2-1)2+(4-0)2。我希望你能明白我的意思。

关键部分是abc等维度不可枚举。那么有没有更有效的方法来检索两组之间的最近距离?

1 个答案:

答案 0 :(得分:1)

使用KDTree非常有效地找到最近的点。

从您的数据开始,首先要放入一个完整的格式,其中缺失的值由零填充,然后将其转换为数组并创建KDTree(这里我使用的是{{1}显示更快):

cKDTree

要查找距离最近的点import numpy as np from scipy.spatial import cKDTree data1 = {"1":{"a":1, "b":2}, "2":{"a":2, "c":3}, "3":{"c":2, "d":3}} data2 = {"5":{"a":2, "c":3}, "6":{"b":1, "d":4}} keys = [a.keys() for a in data1.values()] + [a.keys() for a in data2.values()] keys = sorted(list(set([a for j in keys for a in j]))) d1 = [[data1[k].get(pt, 0) for pt in keys] for k in sorted(data1.keys())] d2 = [[data2[k].get(pt, 0) for pt in keys] for k in sorted(data2.keys())] a1 = np.array(d1) a2 = np.array(d2) kd = cKDTree(a1)

query()

其中dist, ind = kd.query(a2) 包含的ind索引最接近a1中的每个点,a2各自的距离。