【发布时间】:2009-12-22 17:12:52
【问题描述】:
我有一个存储向量的系统,并允许用户找到与用户查询向量最相似的 n 个向量。也就是说,用户提交了一个向量(我称之为查询向量),我的系统会吐出“这是 n 个最相似的向量”。我使用 KD-Tree 生成类似的向量,一切正常,但我想做更多。即使用户没有提交完整的向量(具有缺失值的向量),我也想提供 n 个最相似向量的列表。也就是说,如果用户提交了一个3维的向量,我仍然想找到我存储的n个最近的向量(存储的向量是11维)。
我有几个明显的解决方案,但我不确定任何一个看起来都很好:
-
创建多个 KD 树,每个 KD 树都使用用户将搜索的最流行的维度子集构建。也就是说,如果用户提交了一个维度为 x、y、z 的查询向量,我将该查询与我已经构建的 KD-Tree 匹配,该 KD-Tree 仅包含三个维度的向量 x、y、z。
当用户提交带有缺失值的查询向量并使用点积之类的方法将查询向量与向量(存储在数据库中的表中)一一进行比较时,忽略 KD 树。
这一定是一个常见问题,有什么建议吗?感谢您的帮助。
【问题讨论】:
-
你说的是数字向量,对吧?实数,自然数?请告诉我们更多关于您如何定义向量之间的“相似性”的信息。
-
布朗博士,是的,实数,自然数。具体来说,我有一个使用 double 类型数组的 Java 实现。这些数字是人体的测量值。因此,股骨有一个以厘米为单位的测量值,这是向量中的一个值。胫骨有一个以厘米为单位的测量值,这是向量中的一个值。很快。现在,相似性是由我正在使用的 KD-Tree api (cs.wlu.edu/~levy/software/kd) 创建的,但如果我按照方法 2 中的描述手动估计相似性,我会使用点积(这合理吗?)。谢谢。
-
这取决于您需要比较的值的数量。你的意思不是“点积”,对吗?您正在考虑诸如“最小二乘法”之类的东西,对吗?
-
布朗博士,我不清楚,有理数。在 Java 中翻倍,如 70.24、89.3。
-
也许我也不清楚。您的数据库中有多少个向量可供比较? 100、10000、1000000 还是更多?你的向量的典型长度是“十一”吗?
标签: database performance algorithm math vector