2 つのセット (順不同、重複要素なし) を想定します。
A = set(["z", "x", "c"])
B = set(["x", "z", "d", "e"])
これらのセットには、"z" と "x" の 2 つの共通要素と、セット固有の要素 c、d、e があります。
ストリング距離のように、各セットにスコアを与えるにはどうすればよいですか?
- 要素の順序を無視し、
- 孤立したセットごとに重複禁止の制約を課す
?
例でわかるように、各セットのサイズは異なる場合があります。
このアルゴリズムの重要でない要件は次のとおりです。
- 挿入 > 削除 (要素が不足しているセットは、要素が多すぎるセットよりもコストが高いことを意味します) 可能であれば、または単に INS = DEL
- スワップ: 0 (注文は距離に影響しないため、コストはかかりません)
今のところ、設定された距離スコアを計算しています。
score_A = len(common(a,b)) / len(a) # common(...) calculates intersection
score_B = len(common(a,b)) / len(b)
quadratic_score = sqrt(score_A * score_B)
この問題にどのようにアプローチするか、ソリューションを改善することをお勧めしますか?
コストを指定できるアルゴリズムはありますか?
今、集合変更のための単純な代数を定義しようとしています:
def calculate_distance( a, b, insertion_cost=1, deletion_cost=1 ):
"""
Virtually, a programmer-friendly set-minus.
@return the distance from A to B, mind that this is not
a commutative operation.
"""
score = 0
for e in a:
if e not in b: # implies deletion from A
score += deletion_cost
for e in b:
if e not in a: # implies insertion into A
score += insertion_cost
return score
この値を何に対して正規化するにはどうすればよいですか?