我正在开展一个项目,涉及将颜色扫描到RGB,然后搜索更多RGB数据的数据库,以查看与扫描的颜色最相似的内容。我已经决定在这种情况下确定“相似”含义的最简单方法是在三维空间中表示颜色,然后找到扫描点与数据库其余部分之间的距离。
在我看来,第一部分很好,使用3d空间和接近度的想法,但下半部分对我来说似乎是一个坏主意,我不应该检查扫描的颜色对每一个在数据库中指出,我应该吗?从未做过正式的CS工作,我不知道该怎么做,但我有一种非常明显的感觉,那就是必须有更好的方法。
或者,为了使这个抽象:我有一些输入数据,一堆存储的数据和一个函数,告诉我任何两个数据有多相似。找出与输入最相似的存储实体的最有效方法是什么?
编辑:我正在使用python,如果有人好奇的话。
答案 0 :(得分:3)
解决抽象陈述:除非在先验已知的相似度函数中存在结构,否则没有比“尝试一切”更好的方法。
您的问题在"nearest neighbor search"一词下进行了研究。对于这个问题,cover tree非常适合。这个page有指向代码的指针。 kd-tree也可能是合适的。
由于缺乏有关参考颜色数据库结构或覆盖范围的进一步信息,很难提出进一步的建议。例如,如果已知数据库具有最差情况稀疏性,那么查询可以被约束到其R分量与测试颜色的R分量相差小于G和B分量的稀疏性等的那些条目,从而减少整个数据库到一个较小的立方体部分保证包含结果。 (使用此方法需要证明多维数据集中的某个点不是来自数据库中某个点的X,至少可以为固定数据库预定一次。)