4

将多组数字与目标集进行比较以确定哪些数字最“相似”的算法是什么?

该算法的一种用途是将今天的每小时天气预报与历史天气记录进行比较,以找到具有相似天气的一天。

两组的相似度有点主观,所以算法真的只需要区分好匹配和坏匹配。我们有很多历史数据,所以我想通过自动丢弃不接近的集合并尝试将“最佳”匹配项放在顶部来尝试缩小用户需要查看的天数名单。

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

4

11 回答 11

4

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

由于您想随着时间的推移比较测量值,您可以在计算中忽略缺失值。

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

于 2008-09-26T14:22:51.543 回答
2

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

于 2008-09-27T14:28:45.110 回答
1

在金融领域,他们使用 Beta 来衡量 2 系列数字的相关性。例如,Beta 可以回答“在过去一年中,在标准普尔 500 指数上涨 5% 的一天,IBM 的价格会上涨多少?” 它处理移动的百分比,因此 2 系列可以有不同的比例。

在我的示例中,Beta 是 Covariance(IBM, S&P 500) / Variance(S&P 500)。

维基百科有解释CovarianceVariance和 Beta 的页面:http://en.wikipedia.org/wiki/Beta_(finance)

于 2008-09-26T14:46:20.910 回答
1

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

于 2008-09-26T14:53:58.770 回答
1

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

  • 温度:-50 到 100F(我在美国明尼苏达州)
  • 风速:0 到 120 英里/小时(不确定这是否现实,但请耐心等待)
  • 沉淀:0 到 100

首先标准化您的数据。Temp 的范围为 150 个单位,Wind 为 120 个单位,Precip 为 100 个单位。将你的风单位乘以 1.25 和 Precip 乘以 1.5,使它们与你的温度大致相同的“比例”。您可以在这里花哨并制定规则,使一项功能比其他功能更有价值。在此示例中,风的范围可能很大,但通常保持在较小的范围内,因此您希望减少它的权重以防止它扭曲您的结果。

现在,将每个测量值想象成多维空间中的一个点。此示例测量 3d 空间(温度、风、降水)。好消息是,如果我们添加更多特征,我们只是增加了空间的维度,但数学保持不变。无论如何,我们想找到最接近我们当前点的历史点。最简单的方法是欧几里得距离。所以测量从我们当前点到每个历史点的距离并保持最接近的匹配:

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-treesr-trees这样的树。如果您有大量数据,将您当前的观察结果与每个历史观察结果进行比较将太慢。树木可以加快您的搜索速度。您可能想看看Data Clustering and Nearest Neighbor Search

干杯。

于 2008-09-26T21:18:41.997 回答
1

与统计学家交谈。

严重地。

他们以做这种事情为生。

您写道“两组的相似性有点主观”,但它根本不是主观的——这是为您的问题域确定相似性的适当标准的问题。

在这种情况下,您最好与专业人士交谈,而不是询问一堆程序员。

于 2008-09-27T14:19:04.977 回答
0

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

我假设这些是带有重复的有序集合。最明显的算法是选择一个数字被认为相同的容差,并计算在该度量下数字相同的槽数。

于 2008-09-26T14:21:28.660 回答
0

我确实在我的应用程序中为此实施了一个解决方案,但我正在寻找是否有更好或更“正确”的东西。对于每个历史日,我都会执行以下操作:

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;
}

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

由于相关性是一个从 -1 到 1 的值,表示数字是一起下降还是一起上升,所以我用百分比差异来“惩罚”两组数字的平均值。

于 2008-09-26T15:31:23.843 回答
0

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

我认为你对分布有很好的了解,因为你有很长的历史记录。鉴于此,您可以根据历史分布的分位数来放置所有内容,并使用所有度量上的分位数的绝对差或平方差来做一些事情。这是另一种归一化方法,但它解释了数据中的非线性。

任何风格的标准化都应该使所有变量具有可比性。

例如,假设某天刮风、炎热:温度分位数可能为 0.75,风分位数为 0.75。热量的 0.76 分位数可能在 1 度之外,而风的分位数可能在 3 公里/小时之外。

这种对经验分布的关注也很容易理解,并且可能比正态估计(如均方误差)更稳健。

于 2008-09-27T13:47:49.420 回答
0

这两个数据集是否有序?

如果订购,索引是否相同?等距?

如果指数是共同的(例如在同一天(但在不同位置测量的温度)),您可以将第一个数据集与第二个数据集进行回归,然后测试斜率等于 1,截距为 0。
http://stattrek.com/AP-Statistics-4/Test-Slope.aspx?Tutorial=AP

否则,您可以针对它们的索引对 y=values 进行两次回归。 http://en.wikipedia.org/wiki/Correlation。您仍然需要比较斜率和截距。

====

如果无序,我想你想看看累积分布函数 http://en.wikipedia.org/wiki/Cumulative_distribution_function

一项相关的测试是 Kolmogorov-Smirnov: http ://en.wikipedia.org/wiki/Kolmogorov-Smirnov_test

你也可以看看

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

或 Wilcoxon 符号秩检验http://en.wikipedia.org/wiki/Wilcoxon_signed-rank_test

测试两个样本之间的均值相等性。

您可以使用 Levene 测试来测试方差的相等性http://www.itl.nist.gov/div898/handbook/eda/section3/eda35a.htm

注意:不同的数据集可能具有相同的均值和方差 - 根据您想要的严格程度(以及您拥有的数据量),您也可以考虑测试更高时刻的相等性。

于 2008-09-30T14:31:53.703 回答
0

也许您可以将您的一组数字视为一个向量(该组的每个数字都是该向量的一个分量)。

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

您可能需要标准化您的向量。

更多:余弦相似度

于 2013-08-16T21:39:59.510 回答