如何从具有多个维度的集合中进行近似搜索

本文关键字:集合 搜索 | 更新日期: 2023-09-27 18:33:10

假设我有Items,一大组这些对象:

class Item
{
    public float Cost;
    public float Size;
    public float Weight;
    public float Temperature;
}

我想反复从这个集合中选择一个与给定输入非常匹配的对象。

Item PickItem(float cost, float size, float weight, float temperature) {...}

它应该从Items返回接近给定输入的Item。 它不必给出最佳答案;任何接近的值,甚至可能有一些随机变化,都可以。

我将如何做到这一点? 我一直在做一些研究,看起来使用主成分分析 (PCA( 可以让我将我的集合分组到类似的区域,但实施起来看起来很复杂。 另外,我不确定如何使用它来选择项目,除了将搜索词添加到集合中并查找附近的结果值之外,但这需要为每个搜索重建整个 PCA 系统。

有没有更简单的方法? 我可以只搜索平均差异最小的元素,但似乎我最终会得到介于所有内容之间的结果,而不是大部分相关但具有一两个异常值属性的结果。 我想如果我加权它,它会起作用吗?

如何从具有多个维度的集合中进行近似搜索

这是 O(n/2(

Item PickItem(float cost, float size, float weight, float temperature) 
{
    var bestDiff = float.MaxValue;
    Item bestItem = null;
    foreach(var item in items)
    {
        var diff = CaluclateDifference(item, cost, size, weight, temperature);
        if(diff < bestDiff)
        {
            bestDiff = diff;
            bestItem = item;
            if(bestDiff = 0)
                return bestItem;
        }
    }
    return bestItem;
}
static float CaluclateDifference(Item item, float cost, float size, float weight, float temperature) =>
    Math.Abs(item.Cost - cost) +
    Math.Abs(item.Size - size) +
    Math.Abs(item.Weight - weight) +
    Math.Abs(item.Temperature- temperature);