常见距离公式 numpy 实现

2018-11-19  本文已影响0人  走在成长的道路上

在使用 keras 或者使用 tf 做深度学习时,通常有些内容需要计算距离来作为判定相似程度的依据,如下列举一些常见的距离公式:

def minkowski_distance(vec1, vec2, p=3):
    """
    闵氏距离
    当p=1时,就是曼哈顿距离
    当p=2时,就是欧氏距离
    当p→∞时,就是切比雪夫距离
    :param vec1:
    :param vec2:
    :param p:
    :return:
    """
    # return sum([(x - y) ** p for (x, y) in zip(vec1, vec2)]) ** (1 / p)
    return np.linalg.norm(vec1 - vec2, ord=p)

def cosine_distance(vec1, vec2):
    """
    夹角余弦
    :param vec1:
    :param vec2:
    :return:
    """
    vec1_norm = np.linalg.norm(vec1)
    vec2_norm = np.linalg.norm(vec2)
    return vec1.dot(vec2) / (vec1_norm * vec2_norm)

def euclidean_distance(vec1, vec2):
    """
    欧氏距离
    :param vec1:
    :param vec2:
    :return:
    """
    # return np.sqrt(np.sum(np.square(vec1 - vec2)))
    # return sum([(x - y) ** 2 for (x, y) in zip(vec1, vec2)]) ** 0.5
    return np.linalg.norm(vec1 - vec2, ord=2)

def manhattan_distance(vec1, vec2):
    """
    曼哈顿距离
    :param vec1:
    :param vec2:
    :return:
    """
    # return np.sum(np.abs(vec1 - vec1))
    return np.linalg.norm(vec1 - vec2, ord=1)

def chebyshev_distance(vec1, vec2):
    """
    切比雪夫距离
    :param vec1:
    :param vec2:
    :return:
    """
    # return np.abs(vec1 - vec2).max()
    return np.linalg.norm(vec1 - vec2, ord=np.inf)

def hamming_distance(vec1, vec2):
    """
    汉明距离
    :param vec1:
    :param vec2:
    :return:
    """
    return np.shape(np.nonzero(vec1 - vec2)[0])[0]

def jaccard_similarity_coefficient(vec1, vec2):
    """
    杰卡德距离
    :param vec1:
    :param vec2:
    :return:
    """
    return dist.pdist(np.array([vec1, vec2]), 'jaccard')
上一篇下一篇

猜你喜欢

热点阅读