「距離」または「類似性」は、このタイプの問題を指す場合があります。
あなたが行ったように、絶対差の合計を計算するだけで、かなりうまくいくはずです。これはマンハッタン距離と呼ばれます。数学的には、次のようになります。∑<sub>x ∈ (a,b,c,d) Abs(x1 - x2)
最善の対策は、実際に必要な動作によって異なります。
比率は、より良いアイデアになる可能性があります。
1000000, 5, 5, 5
vs999995, 5, 5, 5
やのようなものを考えてみましょう1000000, 0, 5, 5
。
上記の式によると、最初の要素は 2 番目と 3 番目の要素の両方と同じ類似性を持ちます。
これが望ましくない場合 ( に999995
かなり近いと考えられる1000000
一方0
で、 からかなり離れていると考えられる5
場合)、各距離を計算するときに 2 つの最大値で除算する必要があります。
∑<sub>x ∈ (a,b,c,d) [ Abs(x1 - x2) / max(x1, x2) ]
これにより、すべての数値が 0 から 1 の間に配置されます。これは、値のパーセンテージの差です。
これは、上記の例では、 と は非常に似ていると見なし (上記の合計は になるため1000000, 5, 5, 5
) 、とははるかに異なると見なされることを意味します (合計が になるため)。999995, 5, 5, 5
|1000000-999995|/1000000 + 0 + 0 + 0 = 0.000005
1000000, 5, 5, 5
1000000, 0, 5, 5
|0+5|/5 + 0 + 0 + 0 = 1
負の値が発生する可能性がある場合は、数式を適切に更新する必要があります。解決しようとしている問題に基づいて、それをどのように処理するかを決定する必要があります。10 to 0
と多かれ少なかれ異なる(または同等である)必要があり5 to -5
ますか?
要素はある程度交換可能ですか?
A=1, B=2, C=3, D=4
とのようなものを考えてみましょうA=4, B=1, C=2, D=3
。
個々の要素はすべて変更されていますが、セットは引き続き構成されて1, 2, 3, 4
おり、各要素は 1 位置だけシフトされています ( を除く4
)。
一部の問題では、これはまったく問題にならず、上記は からA=1, B=11, C=21, D=31
への移動とそれほど違いはありませんA=2, B=12, C=22, D=32
。ただし、他の問題については、非常に関連性がある可能性があります。
string や array のようなシーケンスの場合、要素を挿入、削除、またはシフトするという考えは理にかなっています。もしそうなら、編集距離を見たいと思うでしょう。そのうちの一般的なものはレーベンシュタイン距離です。また、これを変更して、個々の値がどの程度異なるかを検討することを検討することもできます (ただし、これは簡単なことではありません)。
set のようなものでは、要素は交換可能ですが、実際には要素に厳密な順序はありません ({1, 2, 3}
は と同じ{3, 1, 2}
です)。この場合、最も簡単なのは、値を並べ替えて、編集距離を使用することです。何らかの方法で両方を同時にループすることもできます。これにより、値の違いをより簡単に考慮に入れることができます。