我有两个由两个彼此独立的不同系统生成的数组。我想通过仅比较从数组生成的几个数字来比较它们的相似之处。
现在,我只比较数组的最小值、最大值和总和,但我想知道是否有更好的算法?任何类型的散列算法都需要对数组之间的小浮点差异不敏感。
编辑:我要做的是验证两种算法是否生成相同的数据,而无需直接比较数据。所以算法应该对数据的变化敏感,对每个元素之间的微小差异相对不敏感。
我有两个由两个彼此独立的不同系统生成的数组。我想通过仅比较从数组生成的几个数字来比较它们的相似之处。
现在,我只比较数组的最小值、最大值和总和,但我想知道是否有更好的算法?任何类型的散列算法都需要对数组之间的小浮点差异不敏感。
编辑:我要做的是验证两种算法是否生成相同的数据,而无需直接比较数据。所以算法应该对数据的变化敏感,对每个元素之间的微小差异相对不敏感。
我不会尝试将其减少到一个数字。只需传递一个tuple
值,并编写一个close_enough
比较元组的函数。
例如,您可以将(mean, stdev)
其用作您的值,然后定义close_enough
为“每个数组的均值在另一个数组均值的 0.25 标准差范围内”。
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),或者采用平均绝对差异等。
或者您可以比较实际索引与“正确”索引的距离。或者该值与基于平均值和标准差的索引处的预期值相差多远。或者……有无数种可能。同样,这在很大程度上取决于您的应用领域。
完全取决于您对“比较它们的相似性”的定义。
您想比较哪些功能?你能识别出哪些特征?它们是可识别的模式吗?即在这组中,有 6 个临界点,有 2 个不连续点……等等……
您已经提到比较最小/最大/总和;并且在评论中也谈到了方法和标准偏差。这些都是套装的特点。
最终,您应该能够利用所有这些特征并制作一个 n 维描述符。例如 [min, max, mean, std, etc...]
然后,您可以比较这些 n 维描述符以定义一个描述符是否比另一个“少”、“相等”或“多”。如果您想将其他集合分类为更像“集合 A”还是更像“集合 B”,您可以查看分类器。
看: