我有一个返回16个元素的数组的exe。我必须使用php将这个数组传递给Mysql来计算欧几里德距离。我在MySQL中的表格就是这样。
id |img_id | features_1|features_2|features_3|features_4|features_5|features_6|features_7|...upto features_16
1 1 0.389 0.4567 0.8981 0.2345
2 2 0.9878 0.4567 0.56122 0.4532
3 3
4 4
......................
所以每张图片有16个功能,现在我有30,000张图片,img_id高达30,000张。我必须计算数组的欧几里德距离,该数据通过php与数据库中的数据一起传递,并返回欧几里德距离最小的6个图像的img_id。即假设我有一个来自exe A的数组[0.458,0.234,0.4567,0.2398]我必须用这个数组计算每个img_id的距离,即对于img_id = 1,距离将是((0.458-0.389)^ 2 +(0.234- 0.4567)^ 2 +(0.4567-0.8981)^ 2 +(0.2398-0.2345)^ 2)我必须对所有30,000张图像重复此过程并返回距离最小的6 img_id。什么是有效和快速的计算方法?
答案 0 :(得分:2)
由于php很慢,你应该直接在SQL中这样做:
SELECT * FROM tablename
ORDER BY ABS(f1 - :f1) + ABS(f2 - :f2) + ... DESC
LIMIT 6;
请注意,我使用绝对范数而不是欧几里德范数,如果您对实际值不感兴趣则没有区别(因为在有限维的向量空间中,所有范数都是等价的)。 sqlite for eample不提供SQUARE
函数,并且一直写(f1 - :f1) * (f1 - :f1)
是很烦人的,所以我想这是一个很好的解决方案。