代码之家  ›  专栏  ›  技术社区  ›  Adam Hughes

数字集相似性评分算法

  •  4
  • Adam Hughes  · 技术社区  · 17 年前

    两个集合的相似性有点主观,因此该算法实际上只需要区分好匹配和坏匹配。我们有很多历史数据,所以我想通过自动扔掉不接近的集合,并尝试将“最佳”匹配放在列表的顶部,来缩小用户需要查看的天数。

    编辑 : Niles 产生了相当好的结果,但在比较温度时生成的数字无法与其他数据(如风速或降水量)生成的数字进行比较,因为数据的规模不同。一些非天气数据非常大,因此均方误差算法生成的数字为数十万,而使用温度生成的数字为数十或数百。

    11 回复  |  直到 9 年前
        1
  •  4
  •   Nils Pipenbrinck    17 年前

    我认为均方误差度量可能适用于天气比较等应用。它很容易计算,并且给出了有意义的数字。

    对于不受时间限制的值,甚至是未排序的多维分散数据,这有点困难。选择一个好的距离度量成为分析此类数据的一部分。

        2
  •  2
  •   Folkert van Heusden Folkert van Heusden    17 年前

    使用皮尔逊相关系数。我找到了如何在SQL查询中计算它的方法,可以在下面找到: http://vanheusden.com/misc/pearson.php

        3
  •  1
  •   RossFabricant    17 年前

    在金融领域,他们使用贝塔系数来衡量两组数字之间的相关性。例如,Beta可以回答这样一个问题:“在过去一年中,标准普尔500指数上涨5%的一天,IBM的价格会上涨多少?”它涉及的是上涨的百分比,因此2系列可以有不同的规模。

    在我的示例中,Beta是协方差(IBM,标准普尔500)/方差(标准普尔500)。

    维基百科有页面解释 Covariance Variance ,及测试版: http://en.wikipedia.org/wiki/Beta_(finance)

        4
  •  1
  •   leppie    17 年前

    看看统计网站。我认为你在寻找相关性。

        5
  •  1
  •   Corbin March    17 年前

    例如,我假设您正在测量温度、风和精度。我们将这些项目称为“功能”。因此,有效值可能是:

    • 温度:-50到100华氏度(我在美国明尼苏达州)

    现在,将每个测量想象为多维空间中的一个点。此示例测量三维空间(温度、风、精度)。好的是,如果我们添加更多的功能,我们只需增加空间的维度,但数学保持不变。无论如何,我们想找到最接近当前点的历史点。最简单的方法是 Euclidean distance . 因此,测量当前点到每个历史点的距离,并保持最接近的匹配:

    for each historicalpoint
    
        distance = sqrt(
            pow(currentpoint.temp - historicalpoint.temp, 2) + 
            pow(currentpoint.wind - historicalpoint.wind, 2) +
            pow(currentpoint.precip - historicalpoint.precip, 2))
    
        if distance is smaller than the largest distance in our match collection
            add historicalpoint to our match collection
            remove the match with the largest distance from our match collection
    
    next
    

    kd-trees r-trees . 如果你有很多数据,将你当前的观察结果与每一个历史观察结果进行比较会太慢。树木可以加快你的搜索速度。你可能想看看 Data Clustering Nearest Neighbor Search

    干杯

        6
  •  1
  •   Michael Dorfman    17 年前

    与统计学家交谈。

    “两个集合的相似性有点主观” ,但这根本不是主观的——这是一个为你的问题领域确定适当的相似性标准的问题。

    在这种情况下,与专业人士交谈要比询问一群程序员要好得多。

        7
  •  0
  •   Marcin    17 年前

    首先,问问自己这些是集合还是有序集合。

        8
  •  0
  •   Adam Hughes    17 年前

    我在我的应用程序中确实实现了一个解决方案,但我想看看是否有更好或更“正确”的解决方案。对于历史上的每一天,我都会执行以下操作:

    function calculate_score(historical_set, forecast_set)
    {
        double c = correlation(historical_set, forecast_set);
        double avg_history = average(historical_set);
        double avg_forecast = average(forecast_set);
        double penalty = abs(avg_history - avg_forecast) / avg_forecast
        return c - penalty;
    }
    

    然后我将所有结果从高到低排序。

        9
  •  0
  •   Gregg Lind    17 年前

    有几次,你提到你不知道数据的分布,这当然是真的。我的意思是,明天可能会有华氏150度,风速2000公里/小时的天气,但这似乎不太可能。

    我想说的是,由于你们有很长的历史记录,所以你们对分布有很好的了解。考虑到这一点,你们可以把所有的东西都放在历史分布的分位数上,然后用所有度量的分位数的绝对或平方差来做一些事情。这是另一种规范化方法,但它可以解释数据中的非线性。

    任何样式的规范化都应该使所有变量具有可比性。

    例如,假设一天有风,天气炎热:温度分位数可能为.75,风分位数可能为.75。热量的0.76分位数可能在1度之外,而风的0.76分位数可能在3公里以外。

        10
  •  0
  •   Gerry    17 年前

    这两个数据集是否有序?

    如果排序,索引是否相同?等间距?


    http://stattrek.com/AP-Statistics-4/Test-Slope.aspx?Tutorial=AP

    否则,您可以对y=值与它们的指数进行两次回归。 http://en.wikipedia.org/wiki/Correlation . 您仍然需要比较坡度和截距。

    ====

    http://en.wikipedia.org/wiki/Cumulative_distribution_function

    http://en.wikipedia.org/wiki/Kolmogorov-Smirnov_test

    你也可以看看

    学生的t检验, http://en.wikipedia.org/wiki/Student%27s_t-test

    还是威尔科克森签名等级测试 http://en.wikipedia.org/wiki/Wilcoxon_signed-rank_test

    测试两个样本之间的平均值是否相等。

    http://www.itl.nist.gov/div898/handbook/eda/section3/eda35a.htm

    注意:不同的数据集有可能具有相同的均值和方差——这取决于您希望达到的严格程度(以及您拥有的数据量) 能够

        11
  •  0
  •   user1493046    12 年前

    然后,您可以简单地使用点积来计算两个给定向量(即一组数字)的相似性。

    您可能需要规范化向量。

    更多: Cosine similarity