【问题标题】:Calculating Squared Euclidean distance计算平方欧几里得距离
【发布时间】:2013-04-07 01:41:39
【问题描述】:

我有一个 exe,它返回一个包含 16 个元素的数组。我必须使用 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 传递的 exe 中计算数组的欧几里德距离,并返回欧几里德距离最小的 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。有什么高效快速的计算方法?

【问题讨论】:

  • 手工制作。你的桌子似乎没有准备好。是idauto_increment?做这种事情,你真的应该为每张图片留一行,features 更具描述性和独立的列。
  • 是的,id 是自动递增的。如果我将特征保存在单独的列中会比单独的行更容易吗?
  • 是的,为了以任何精度进行这种类型的计算,一张图像的所有特征都需要使用自己的列进行设置。
  • 好的,我已将我的特征保存为列,并编辑了现在如何计算 mysql 中的距离?

标签: php mysql euclidean-distance


【解决方案1】:

由于 php 很慢,你应该像这样直接在 SQL 中执行此操作:

SELECT * FROM tablename 
ORDER BY ABS(f1 - :f1) + ABS(f2 - :f2) + ... DESC
LIMIT 6;

请注意,如果您对实际值不感兴趣,我使用的是绝对范数而不是欧几里德范数,这没有区别(因为在有限维的向量空间中,所有范数都是等价的)。用于示例的 sqlite 不提供 SQUARE 函数并且一直写 (f1 - :f1) * (f1 - :f1) 很烦人,所以我想这是一个不错的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2020-11-29
    • 2021-01-31
    • 2018-02-14
    • 2015-09-23
    • 1970-01-01
    相关资源
    最近更新 更多