Python 数据集之间的差异

Python 数据集之间的差异,python,math,dataset,numpy,scipy,Python,Math,Dataset,Numpy,Scipy,我有两个数据集作为列表,例如: 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为Yax,范围(1,len(xa))为Xax)构建图表。对xa,xb


我有两个数据集作为列表,例如:

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为Yax,范围(1,len(xa))为Xax)构建图表。对xa,xb的函数进行插值,然后计算xa,xb的面积(带积分)以及xa和xb之间的差值面积。在此之后,差异性为(差异面积)*100%/(xa面积+xb面积)

我不知道这个问题是否有更简单的解决办法。 如果不是-如何计算xa,xb的差分面积?图表是使用scipy、numpy、matplotlib构建的


更新:我正在寻找一个表示两组之间差异的数字。百分比是首选

这就是你要找的

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]
xc = []

for i in range(0, len(xa)-1):
    xc.append(xa[i] - xb[i])

print xc
输出:

[0, 1, -1, -2, 283, -43, 3, 4381, 0, 40, 4]
编辑:

为什么不取每个值的百分比差,然后取它们的平均值:

from statlib import stats

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]
xc = []


for i in range(0, len(xa)-1):
    xc.append(abs(float(xa[i] - xb[i])/(xa[i] + xb[i])/2))

print stats.mean(xc)*100

如果你没有statlib,你可以得到它

这在很大程度上取决于你所寻找的“相似性”的性质

我突然想到两个办法

  • 计算
    sqrt((X[i]-Y[i])^2)或
    abs(X[i]-Y[i])
    之和,标准化为X和Y的范围,即从最小(X,Y)到最大(X,Y)。越接近0,数据集就越相似。sqrt版本对微小差异更敏感
  • 计算,它会给你一个从+1到-1的度量值,表示“完全相似”,到-1表示“完全不同”。请注意,这种“相似性”并不一定意味着您的系列可以整齐地相互遵循。看看维基百科文章中的图片

这在很大程度上取决于你想做什么。例如,给出一个给定的示例,您可以想象计算一个集合中的元素,而不是两个集合中的元素(两个集合的对称差的长度)-如果这些数字对应于测量值,这显然是非常糟糕的

你说的是时间序列,那么我们可以假设顺序很重要吗


对于时间序列,在谱域中计算事物往往是有益的,这是另一个需要考虑的问题。如果您想要一个比较两个1D向量的相似性度量,并且该度量最好返回一个介于0和1(或0和100%)之间的值,余弦相似性满足这些标准(根据最后的但书)。(考虑到你的问题的背景,我不知道这是否合适,但你知道背景,所以你当然可以做出决定。)

如果有多个一维向量,那么一种方法可能是测量每个向量相对于中值向量的余弦相似性

在一般情况下,余弦相似性返回的值介于-1和1之间,尽管在使用它的许多(大多数?)实际情况下,可能的值被限制在0和1之间

第二,余弦相似性的公式是点(a,b)/(范数(a)x范数(b));NumPy有一个点函数,但是,内部是实现点积的NumPy函数

from __future__ import division
from itertools import izip, repeat
import math

def weighted_mean(values, weights=None):
    total = 0
    number = 0
    if weights is None:
        weights = repeat(1)
    for weight, value in izip(weights, values):
        total += weight * value
        number += weight
    return number and total / number

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]


print "Option 1, if you want bigger numbers to have a bigger effect on the score"

weights = (math.sqrt(abs(a) * abs(b)) for a, b in izip(xa, xb))
scores = (abs(a) + abs(b) and abs(a - b) / (abs(a) + abs(b)) for a, b in izip(xa, xb))

final_score = weighted_mean(scores, weights)
print "%.02f%%" % (final_score * 100)


print "Option 2, if you want to have all numbers have the same effect on the score"

scores = (abs(a) + abs(b) and abs(a - b) / (abs(a) + abs(b)) for a, b in izip(xa, xb))

final_score = weighted_mean(scores)
print "%.02f%%" % (final_score * 100)
当然,您也可以使用其他类型的权重,例如
(abs(a)+abs(b))/2
,这取决于您希望如何解释给定的差异

第二个的无环版本:

xan = numpy.array(xa)
xbn = numpy.array(xb)
error_threshold = 0.000001
final_score = numpy.mean((abs(xan - xbn) + error_threshold) / (abs(xan) + abs(xbn) + error_threshold))
或者第一个:

scores = (abs(xan - xbn) + error_threshold) / (abs(xan) + abs(xbn) + error_threshold)
weights = numpy.sqrt(abs(xan) * abs(xbn))
final_score = numpy.sum(scores * weights) / numpy.sum(weights)

或者你在寻找每个数字的百分比差异?我在寻找一个代表“差异”的神奇数字。百分比是首选。)你至少应该使用abs(xa[i]-xb[i]),否则大错误可能会相互抵消。不知道为什么我会被否决。这样我至少可以修复我的帖子的问题…@Richard:即使OP问了“一个神奇的数字”,他也没有详细解释他的问题以提供任何代码。其次,至少,因为问题也被标记为
numpy
scipy
,所以您可以提供“无环”代码。Thanks完全相似/不相似并不能很好地描述相关性结果。@silenghost:链接的wikipedia文章提供了所有解释,并附有一张图片,显示了相关性作为相似性度量的局限性。但最初的海报并没有在他的书中具体说明什么是“相似的”,所以我也用了一些,呃,诗意的许可来描述相关性。我要淡化措辞,没有“神奇的差别”这回事。你想要两个列表之间的相关系数吗?你说的这个区别是什么?我知道这是一个混乱的解释,让它不局限于相关性。一般来说,当我比较xa和xb、xa和xc时,我应该知道xa比xa和xb更接近xc。我想在这里问这个问题可能会更好:与其说是编码问题,不如说是统计问题……也许可以从更多的例子开始,向你(和我们)展示类似的时间序列,例如。,[1,2,3,…]和[100200300,…]有多少相似之处?[1,2,3,…]和[0,0,0,1,2,3,…]有多少相似之处?@DominiCane:你所说的系列是什么意思?您如何描述xa[i]和xb[i]之间的“关系”。你认为xa[i]和xa[i-1]的某些“关系”对于xb[i]和xb[i-1]是相同的吗?我想你会得到更多的建议,因为这个问题与编程没有太多的关系,而是关于是否有任何单一的数字可以完整地描述你的差异。ThanksI宁愿使用scipy.signal.pdist(,'cosine')。LA代表numpy.linalg,我猜?但说真的,OP的问题中是什么让你提出这种方法的?@Rosh Oxymoron:OP的问题中是什么让你提出这种方法的?他的问题?DominiCane想要两个数字列表之间的百分比差异,每对数字之间差异的平均值似乎是一个相当大的位置
scores = (abs(xan - xbn) + error_threshold) / (abs(xan) + abs(xbn) + error_threshold)
weights = numpy.sqrt(abs(xan) * abs(xbn))
final_score = numpy.sum(scores * weights) / numpy.sum(weights)