我有两个由两个不同系统生成的数组,它们彼此独立。我想通过比较数组生成的几个数字来比较它们的相似之处。
现在,我只是比较数组的最小值,最大值和总和,但我想知道那里是否有更好的算法?任何类型的散列算法都需要对数组之间的小浮点差异不敏感。
编辑:我要做的是验证两个算法生成相同的数据,而不必直接比较数据。因此,算法应该对数据的变化敏感,并且对每个元素之间的微小差异相对不敏感。
答案 0 :(得分:1)
我不会尝试将其减少到一个数字;只需传递tuple
个值,然后编写一个比较元组的close_enough
函数。
例如,您可以使用(mean, stdev)
作为您的值,然后将close_enough
定义为“每个数组的平均值在另一个数组的平均值的0.25 stdev范围内”。
def mean_stdev(a):
return mean(a), stdev(a)
def close_enough(mean_stdev_a, mean_stdev_b):
mean_a, stdev_a = mean_stdev_a
mean_b, stdev_b = mean_stdev_b
diff = abs(mean_a - mean_b)
return (diff < 0.25 * stdev_a and diff < 0.25 * stdev_b)
显然,正确的值是您希望根据您的用例进行调整的内容。也许你真的想要基于它,例如,方差(stdev的平方),方差和偏斜,或stdev和sqrt(偏斜),或者除算术平均之外的一些完全不同的标准化。这一切都取决于你的数字代表什么,以及“足够接近”意味着什么。
在不了解您的应用领域的情况下,很难提供更具体的内容。例如,如果您要比较音频指纹(或DNA指纹或指纹指纹),您需要的东西与您比较JPEG压缩的风景图像有很大不同。
在评论中,您说您希望对值的顺序敏感。为了解决这个问题,您可以生成一些关于序列“无序”的度量。例如:
diffs = [elem[0] - elem[1] for elem in zip(seq, sorted(seq))]
这为您提供了每个元素与排序位置中元素之间的区别。您可以构建一个类似于stdev的度量(每个值的平方,平均值,sqrt),或者取平均绝对差值等。
或者您可以比较实际索引与“正确”索引的距离。或者基于均值和stdev,该值与其索引处的预期值相差多远。或者......有无数的可能性。同样,哪个适当取决于您的应用领域。
答案 1 :(得分:1)
完全取决于您对“比较它们的相似性”的定义。
您想要比较哪些功能? 您可以识别哪些功能?是他们可识别的模式?即在这一组中,有6个关键点,有2个不连续点......等等......
你已经提到过比较最小值/最大值/总和;并且在评论中也谈到了手段和标准偏差。这些都是该集的所有功能。
最终,您应该能够获取所有这些功能并创建一个n维描述符。例如[min,max,mean,std等...]
然后,您可以比较这些n维描述符,以定义一个是否比另一个“更少”,“相等”或“更多”。如果你想将其他集合分类为是否更像“set A”或更像“set B”,你可以查看分类器。
见: