算法:评分数字集相似性

4
什么算法可以比较多组数字与目标集合以确定哪些是最“相似”的?
这种算法的一个用途是将今天的小时天气预报与历史天气记录进行比较,以找到天气相似的日子。
两个集合的相似度有点主观,因此该算法实际上只需要区分好匹配和坏匹配之间的差异。我们有很多历史数据,因此我想尝试通过自动丢弃不接近的集合并尝试将“最佳”匹配放在列表顶部来缩小用户需要查看的天数。
编辑: 理想情况下,算法的结果可与使用不同数据集生成的结果进行比较。例如,使用Niles建议的均方误差产生了相当好的结果,但是比较温度时生成的数字不能与使用其他数据(如风速或降水)生成的数字进行比较,因为数据的规模不同。一些非天气数据非常大,因此均方误差算法生成的数字高达数十万,而使用温度仅生成数十或数百。

我实际上有类似的用途,希望能得到一些好的答案。 - mattlant
11个回答

4
我认为均方误差指标可能适用于天气比较等应用。它很容易计算,并给出有意义的数字。
由于您想要比较随时间变化的测量值,因此可以从计算中省略缺失值。
对于不受时间限制甚至未排序的多维散点数据,选择一个好的距离度量成为分析此类数据的一部分,需要一定技巧。

2

1
在金融领域,他们使用Beta来衡量两个数字系列之间的相关性。例如,Beta可以回答这个问题:“在过去一年中,如果标普500指数上涨了5%,IBM的股价会上涨多少?”它处理移动的百分比,因此这两个系列可以有不同的比例尺度。
在我的例子中,Beta是Covariance(IBM,S&P 500)/ Variance(S&P 500)。
维基百科有解释协方差、方差和Beta的页面:CovarianceVariance和Beta:http://en.wikipedia.org/wiki/Beta_(finance)

1

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


相关性是我首先检查的内容之一,但它只测量曲线的相似度,而不是实际值。如果温度每小时上升和下降相同,但相差100度,相关性仍将为1。 - Adam Hughes

1

找一位统计学家。

说真的。

他们以职业身份从事这种工作。

你写道“两个集合的相似性有点主观”,但实际上它根本不是主观的——它是确定适用于您问题域的相似性标准的问题。

这是其中一种情况,您与专业人士交谈比向一群程序员提问要好得多。


1
假设你在测量温度、风速和降水,我们把这些项目称为“特征”。所以有效值可能是:
- 温度:-50到100华氏度(我在美国明尼苏达州) - 风速:0到120英里/小时(不确定是否现实,但请忍耐) - 降水:0到100
首先对数据进行归一化处理。温度范围为150单位,风速为120单位,降水为100单位。将风速单位乘以1.25,降水乘以1.5,使它们与温度大致具有相同的“比例”。你可以制定复杂的规则,权衡一个特征比其他特征更有价值。在这个例子中,风速可能有很大的范围,但通常保持在较小的范围内,所以你想要给它的权重较小,以防止它扭曲你的结果。

现在,想象每个测量值都是多维空间中的一个点。这个例子测量了三维空间(温度、风速、降水)。好处是,如果我们添加更多特征,我们只需增加空间的维数,但数学仍然保持不变。无论如何,我们想要找到与当前点最接近的历史点。最简单的方法是使用欧几里得距离。因此,测量从当前点到每个历史点的距离并保留最接近的匹配项:

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。如果您有大量数据,则将当前观察结果与每个历史观察结果进行比较将太慢。树可以加速搜索速度。您可能想看看数据聚类最近邻搜索

干杯。


0
也许你可以把你的数字集合看作是一个向量(集合中的每个数字都是向量的一个分量)。
然后,你可以简单地使用点积来计算两个给定向量(即数字集合)之间的相似度。
你可能需要对你的向量进行归一化处理。
更多信息:余弦相似度

0
首先,问问自己这些是集合还是有序集合。
我假设这些是带有重复元素的有序集合。最明显的算法是选择一个容差值,在该容差值下认为数字相同,并计算在该度量下数字相同的插槽数量。

在这种情况下,我所有的集合都是有序的,并且每个集合包含24个小时值。选择公差级别的问题在于在运行之前我不知道值的范围。 - Adam Hughes
等一下...你知道这些是气象数据,但你不知道度量标准是什么吗?如果真是这样的话,为什么不通过分析数据的标准差来动态选择容差呢? - Marcin

0
有几次,你提到你不知道数据的分布,这当然是真的。我的意思是,明天可能会有一天是150华氏度,风速2000公里/小时,但这似乎相当不可能。
我认为你对分布有很好的了解,因为你有一个长期的历史记录。鉴于此,您可以将所有内容都转换为历史分布的分位数,并对所有测量值的分位数的绝对或平方差进行处理。这是另一种归一化方法,但它考虑了数据中的非线性。
任何样式的归一化都应使所有变量可比较。
例如,假设今天是一个多风热天:那可能有一个温度分位数为0.75,风速分位数为0.75。热量的0.76分位数可能相差1度,而风的分位数可能相差3km/h。
这种关注经验分布的方法也很容易理解,并且可能比正常估计(如均方误差)更加稳健。

天气只是这个算法可以用于的一种数据类型的例子。我不知道将输入什么类型的数据。它可能是棒球场热狗销售量、公路上行驶的汽车数量、电力负荷等。 - Adam Hughes

0

这两个数据集是否有序?

如果有序,索引是否相同?等间隔的吗?

如果索引是共同的(例如在不同位置测量的温度在同一天),则可以将第一个数据集回归到第二个数据集上,然后测试斜率是否等于1,截距是否为0。
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

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

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

注意:不同的数据集可能具有相同的均值和方差,这取决于你想要多么严格(以及你有多少数据),你还可以考虑测试更高阶矩的相等性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接