【问题标题】:How do I make approximate searches from a set with multiple dimensions?如何从具有多个维度的集合中进行近似搜索?
【发布时间】:2016-02-03 09:18:00
【问题描述】:

假设我有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 系统。

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

【问题讨论】:

  • 避免扫描整个数据集的一种方法是将数据放入箱中,然后仅扫描给定输入所在的箱中的项目。显然,垃圾箱越小,需要检查的项目就越少,但是垃圾箱越多,簿记也就越多。但在 4 个维度上,这可能是可以容忍的。至于度量(即距离函数),我想你会发现它并不重要。从普通的欧几里得距离开始,然后从那里开始。

标签: c# search data-structures statistics pca


【解决方案1】:

这是 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2015-03-18
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2021-04-29
    相关资源
    最近更新 更多