これを 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 の 2 乗)、分散とスキュー、stdev と sqrt(skew)、または算術平均以外の完全に異なる正規化などに基づいて、実際にベースにしたい場合があります。それはすべて、数字が何を表しているか、および「十分に近い」とはどういう意味かによって異なります。
アプリケーション分野について何も知らなければ、より具体的なことを示すことは困難です。たとえば、音声指紋 (または DNA 指紋、または指紋指紋) を比較している場合は、JPEG で圧縮された風景の画像を比較している場合とは非常に異なるものが必要になります。
あなたのコメントでは、値の順序に敏感になりたいと言っています。これに対処するために、シーケンスがどの程度「順不同」であるかの尺度を生成できます。例えば:
diffs = [elem[0] - elem[1] for elem in zip(seq, sorted(seq))]
これにより、各要素とソートされた位置にある要素との違いがわかります。これから標準偏差のようなメジャーを作成するか (各値の平方、平均、平方根)、平均絶対差分などを取得できます。
または、実際のインデックスが「正しい」インデックスからどれだけ離れているかを比較できます。または、平均値と標準偏差に基づいて、そのインデックスで期待される値から値がどれだけ離れているか。あるいは……可能性は無数にある。繰り返しますが、どれが適切かは、アプリケーション領域に大きく依存します。