【2.7.2】集合相似性--谷本系数(Tanimoto Coefficient)

Tanimoto系数由Jaccard系数扩展而来,又称为广义Jaccard相似系数,计算方式如下:

$$ E_{j} (A,B)= \frac{A * B}{ ||A||^{2} + ||B||^{2} - A*B }$$

其中A、B分别表示为两个向量,集合中每个元素表示为向量中的一个维度,在每个维度上,取值通常是[0, 1]之间的值(如果取值是二值向量0或1,那么Tanimoto系数就等同Jaccard距离),A\cdot B表示向量乘积,||A||^2表示向量的模,即

$$ ||A||^2 = \sqrt{\sum_{i=1}^{n}{A_i^2}} $$

Tanimoto系数容易与余弦相似度混淆在Tanimoto系数计算公式中,如果把分母的A\cdot B去掉,并将||A||^2+||B||^2替换为(||A||^2)*(||B||^2),就转成了余弦相似度(cosine similarity)。

$$ similarity=cos(\theta )=\frac{A\cdot B}{||A||^2\times ||B||^2}=\frac{\sum_{i=1}^{n}{A_i\times B_i}}{\sqrt{\sum_{i=1}^{n}{(A_i)^2}}\times \sqrt{\sum_{i=1}^{n}{(B_i)^2}}} $$

Tanimoto系数Python实现

import numpy as np
def tanimoto_coefficient(p_vec, q_vec):
    """
    This method implements the cosine tanimoto coefficient metric
    :param p_vec: vector one
    :param q_vec: vector two
    :return: the tanimoto coefficient between vector one and two
    """
    pq = np.dot(p_vec, q_vec)
    p_square = np.linalg.norm(p_vec)
    q_square = np.linalg.norm(q_vec)
    return pq / (p_square + q_square - pq)
药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn