0

互いに独立した 2 つの異なるシステムによって生成された 2 つの配列があります。配列から生成されたいくつかの数値のみを比較して、それらの類似性を比較したいと考えています。

現在、配列の最小値、最大値、および合計のみを比較していますが、より良いアルゴリズムがあるかどうか疑問に思っていましたか? どのタイプのハッシュ アルゴリズムも、配列間の浮動小数点数のわずかな違いに影響されないようにする必要があります。

編集:私がやろうとしているのは、データを直接比較することなく、2 つのアルゴリズムが同じデータを生成することを確認することです。そのため、アルゴリズムはデータの変化に敏感で、各要素間の小さな違いには比較的鈍感である必要があります。

4

2 に答える 2

1

これを 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))]

これにより、各要素とソートされた位置にある要素との違いがわかります。これから標準偏差のようなメジャーを作成するか (各値の平方、平均、平方根)、平均絶対差分などを取得できます。

または、実際のインデックスが「正しい」インデックスからどれだけ離れているかを比較できます。または、平均値と標準偏差に基づいて、そのインデックスで期待される値から値がどれだけ離れているか。あるいは……可能性は無数にある。繰り返しますが、どれが適切かは、アプリケーション領域に大きく依存します。

于 2013-03-05T21:32:25.037 に答える
1

「類似点を比較する」という定義に完全に依存します。

比較したい機能は何ですか?どのような特徴を識別できますか? それらの識別可能なパターンはありますか?つまり、このセットには 6 つの臨界点があり、2 つの不連続点があります...など...

最小/最大/合計の比較についてはすでに言及しました。平均と標準偏差についてもコメントで話題になっています。これらはすべてセットの特徴です。

最終的に、これらすべての機能を取得して、n 次元の記述子を作成できるはずです。たとえば、[最小、最大、平均、標準など...]

次に、これらの n 次元記述子を比較して、一方が他方よりも「少ない」、「等しい」、または「多い」かどうかを定義できます。他のセットを「セット A」に似ているか「セット B」に似ているかに分類したい場合は、分類子を調べることができます。

見る:

ファジー ロジックを使用した高次元パターンの分類

サポート ベクター マシン

于 2013-03-05T21:40:24.880 に答える