我打算计算两组大数据之间的欧氏距离。我用谷歌搜索了名为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
。我希望你能明白我的意思。
关键部分是a
,b
和c
等维度不可枚举。那么有没有更有效的方法来检索两组之间的最近距离?
答案 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
各自的距离。