计算平方欧氏距离

时间:2013-04-15 02:23:45

标签: php mysql euclidean-distance

我有一个返回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。什么是有效和快速的计算方法?

1 个答案:

答案 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)是很烦人的,所以我想这是一个很好的解决方案。