集合同士の類似度を測る

# 集合同士の類似度の指標


| 名称           | 説明                                                                 | 
| -------------- | -------------------------------------------------------------------- | 
| ジャッカード係数 | 二つの集合の共通要素の数を、それらの和集合の要素数で割ったものです。この係数は、二つの集合がどれだけ似ているかを示します。|
| ダイス係数      | 二つの集合の共通要素の数の2倍を、両方の集合の要素数の合計で割ったものです。この係数は、ジャッカード係数に似ていますが、共通要素をより重視します。 |
| オーバーラップ係数 | 二つの集合間の共通要素の数を、それらのうちの小さい方の集合の要素数で割ったものです。これは、片方の集合がもう片方の集合にどれだけ含まれているかを示します。 |

``` python

# 集合の例
set_A = {'apple', 'orange', 'banana', 'grape'}
set_B = {'apple', 'banana', 'kiwi'}

#1.ジャッカード係数
# 二つの集合の共通要素の数を、それらの和集合の要素数で割る
def jaccard_coefficient(set_A, set_B):
    intersection = len(set_A.intersection(set_B))
    union = len(set_A.union(set_B))
    return intersection / union

jaccard_coef = jaccard_coefficient(set_A, set_B)
print(f"Jaccard Coefficient: {jaccard_coef}")

#2.ダイス係数
#二つの集合の共通要素の数の2倍を、両方の集合の要素数の合計で割る
def dice_coefficient(set_A, set_B):
    intersection = len(set_A.intersection(set_B))
    return 2 * intersection / (len(set_A) + len(set_B))

dice_coef = dice_coefficient(set_A, set_B)
print(f"Dice Coefficient: {dice_coef}")

#3.オーバーラップ係数
#二つの集合間の共通要素の数を、それらのうちの小さい方の集合の要素数で割る
def overlap_coefficient(set_A, set_B):
    intersection = len(set_A.intersection(set_B))
    return intersection / min(len(set_A), len(set_B))

overlap_coef = overlap_coefficient(set_A, set_B)
print(f"Overlap Coefficient: {overlap_coef}")


```

**出力結果**
```
Jaccard Coefficient: 0.4
Dice Coefficient: 0.5714285714285714
Overlap Coefficient: 0.6666666666666666
```

# 

| 名称             | 説明                                                                 |
| ---------------- | -------------------------------------------------------------------- |
| コサイン類似度    | ベクトル空間における二つのベクトルの間のコサイン角を用いて類似性を計測します。特にテキストデータの分析においてよく使用されます。 |
| ハミング距離      | 二つの同じ長さの文字列間の位置における異なる文字の数です。一方の文字列を他方に変換するための最小変更回数を示します。 |
| タネモト係数      | ベクトル間の類似性を測るもので、特に化学分野で分子の類似性を評価するのに用いられます。 |


```python

# ベクトルの例（コサイン類似度とタネモト係数のため）
import numpy as np
vector_A = np.array([1, 1, 0, 1])
vector_B = np.array([1, 0, 1, 1])

# 文字列の例（ハミング距離のため）
str_A = 'karat'
str_B = 'karma'

# コサイン類似度
def cosine_similarity(vector_A, vector_B):
    dot_product = np.dot(vector_A, vector_B)
    norm_A = np.linalg.norm(vector_A)
    norm_B = np.linalg.norm(vector_B)
    return dot_product / (norm_A * norm_B)

cosine_sim = cosine_similarity(vector_A, vector_B)
print(f"Cosine Similarity: {cosine_sim}")

# ハミング距離
def hamming_distance(str_A, str_B):
    return sum(c1 != c2 for c1, c2 in zip(str_A, str_B))

hamming_dist = hamming_distance(str_A, str_B)
print(f"Hamming Distance: {hamming_dist}")

# タネモト係数
def tanimoto_coefficient(vector_A, vector_B):
    dot_product = np.dot(vector_A, vector_B)
    norm_A = np.linalg.norm(vector_A) ** 2
    norm_B = np.linalg.norm(vector_B) ** 2
    return dot_product / (norm_A + norm_B - dot_product)

tanimoto_coef = tanimoto_coefficient(vector_A, vector_B)
print(f"Tanimoto Coefficient: {tanimoto_coef}")

```

# どういう時にどの係数を選択するのか？

| 係数               | 説明                                                           | 使用例                                                         | 適用条件                                                  |
| ------------------ | -------------------------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- |
| ジャッカード係数    | 集合間の共通要素の数を、和集合の要素数で割って計算します。       | 顧客が購入した商品のカテゴリから顧客の嗜好を比較する場合に使用。  | データが集合形式で、要素の有無のみが重要な場合。          |
| ダイス係数         | 共通要素の数の2倍を、両集合の要素数の合計で割ります。           | 文書や研究論文のキーワード集合の類似度を測るのに使用。            | ジャッカード係数よりも共通要素の重みを増やしたい場合。    |
| オーバーラップ係数  | 共通要素の数を、小さい方の集合の要素数で割ります。              | 一方のタグが他方のタグ集合にどれだけ含まれているかを調べる場合。  | 片方の集合が他方に対して非常に小さい場合。                |
| コサイン類似度     | ベクトルの内積と各ベクトルのノルムの積で割った値です。           | 文書のTF-IDFベクトルを比較して内容の類似度を評価する場合に使用。  | データがベクトル形式で、方向性や角度が重要な指標の場合。  |
| ハミング距離       | 同じ長さの二つの文字列間で異なる位置の文字の数をカウントします。 | DNAシーケンスやバイナリコードのエラー検出に使用。                 | 二つのデータポイントが同じ長さの文字列やコードである場合。|
| タネモト係数       | 二進ベクトル間の共通ビット数を、ベクトルのビット総数の和から減算したもので割ります。| 化学構造の類似性を評価する際に使用されます。                     | データが二進ベクトルで表され、ベクトル間の重なりと差異を考慮する必要がある場合。|