我有两个数据集作为列表,例如:
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 ax,范围(1,len(xa))构建图表作为X ax)。对xa,xb插值函数,然后计算xa,xb (积分)的面积以及xa和xb之间的差面积。在此基础上,差异为(差区)*100%/(xa区+ xb区)。
我不知道这个问题是否有更简单的解决办法。如果不是-如何计算xa,xb的差面积?图表是用are,numpy,matplotlib构建的。
update:我正在寻找一个代表集合之间差异的数字。最好是百分比。
发布于 2011-02-01 16:45:50
如果您想要一个比较两个一维向量的相似性度量,并且最好返回介于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)x范数(B));NumPy有一个点函数,但内部是实现点积的NumPy函数。
发布于 2011-02-01 14:18:39
这在很大程度上取决于你所寻求的“相似性”的性质。
我想到了两种办法。
sqrt((X[i]-Y[i])^2)或abs(X[i]-Y[i])之和,将其归一化为X和Y,即从最小(X,Y)到最大值(X,Y)。越接近0,数据集就越相似。sqrt版本对小的差异更敏感。发布于 2011-02-01 14:36:13
这在很大程度上取决于你想做什么。例如,为了给出一个尚未给出的例子,您可以想象在一个集合中计算元素,而不是两个集合(两个集合的对称差的长度)中的元素--如果数字对应于测量值,那么显然是非常糟糕的。
你说的是时间序列,那么我们可以假设顺序重要吗?
对于时间序列而言,在谱域中计算物体通常是有益的,这是值得考虑的事情。只有一个号码的东西不太可能给你很多信息。
https://stackoverflow.com/questions/4863404
复制相似问题