数据集之间的区别
我有两个数据集,都是列表,比如说:
xa = [1, 2, 3, 10, 1383, 0, 12, 9229, 2, 494, 10, 49]
xb = [1, 1, 4, 12, 1100, 43, 9, 4848, 2, 454, 6, 9]
这些数据是市场数据,可能包含成千上万的数字,它们的长度是一样的。
我需要找出“差异”的百分比,这个百分比能显示出这两个数据集之间的“相似度/不相似度”。
目前我想到的方法是为每个列表画图(xa 和 xb 作为Y轴,range(1, len(xa)) 作为X轴)。然后对 xa 和 xb 进行插值计算,再计算 xa 和 xb 的面积(通过积分),以及 xa 和 xb 之间的差异面积。最后,不相似度的计算公式是(差异面积)*100% /(xa 面积 + xb 面积)。
我在想这个问题有没有更简单的解决办法。 如果没有的话,我该如何计算 xa 和 xb 的差异面积呢?这些图表是用 scipy、numpy 和 matplotlib 生成的。
更新:我想要一个数字来表示这两个数据集之间的差异,最好是百分比形式。
5 个回答
这很大程度上取决于你想做什么。举个例子,你可以想象一下,计算两个集合中只有一个集合的元素数量(也就是两个集合的对称差的长度)——如果这些数字代表的是测量值,那就显得非常糟糕了。
你提到时间序列,那我们可以假设顺序是重要的吗?
对于时间序列,通常在频谱域(也就是信号的频率成分)进行计算是很有好处的,这也是需要考虑的一个方面。仅用一个数字来表示,可能不会给你太多有用的信息。
这很大程度上取决于你想要的“相似性”是什么样的。
我想到两种方法。
- 计算
sqrt((X[i]-Y[i])^2)
或abs(X[i]-Y[i])
的总和,然后把结果归一化到 X 和 Y 的范围,也就是从 min(X, Y) 到 max(X, Y)。结果越接近 0,说明这两个数据集越相似。使用平方根的方式对小差异更敏感。 - 计算 相关性,这个值的范围从 +1(表示“完全相似”)到 -1(表示“完全不相似”)。需要注意的是,这种“相似性”并不一定意味着你的数据序列会完全一致地跟随。可以看看维基百科文章里的图片。
如果你想要一个可以用来比较两个一维向量的相似度指标,并且希望这个指标的值在0到1之间(或者0到100%),那么余弦相似度就是一个不错的选择(不过最后有个小提醒)。至于这个方法是否适合你的具体问题,我就不太清楚了,但你了解自己的情况,所以你可以自己判断。
import numpy as NP
import numpy.linalg as LA
# generate some data
fnx = lambda : NP.random.randint(0, 10, 10)
s1, s2 = fnx(), fnx()
# a function to calculate cosine similarity
cx = lambda a, b : round(NP.inner(a, b)/(LA.norm(a)*LA.norm(b)), 2)
cx(s1, s2)
# returns 0.85
如果你有很多一维向量,可以考虑用每个向量和一个中位数向量来计算余弦相似度。
一般来说,余弦相似度的值范围是从-1到1,不过在很多实际应用中,它的值通常会限制在0到1之间。
其次,计算余弦相似度的公式是:点积(a, b)除以(向量a的长度乘以向量b的长度);NumPy有一个点积函数,但实际上,inner是NumPy中用来计算点积的函数。