美文网首页
python | 实现多行向量(matrix)两两计算余弦距离、

python | 实现多行向量(matrix)两两计算余弦距离、

作者: 与阳光共进早餐 | 来源:发表于2018-07-20 15:10 被阅读0次

余弦距离与欧几里德距离都是常用的距离度量方式。

关于两个向量之间求距离的能找到很多的参考材料,这里就不再赘述了。

在项目中用到了两个矩阵的多行向量需要计算两两之间的距离,就在这里做一个分享。

一 余弦距离

  • 直接上代码啦:
def cosine_distance(matrix1,matrix2):
        matrix1_matrix2 = np.dot(matrix1, matrix2.transpose())
        matrix1_norm = np.sqrt(np.multiply(matrix1, matrix1).sum(axis=1))
        matrix1_norm = matrix1_norm[:, np.newaxis]
        matrix2_norm = np.sqrt(np.multiply(matrix2, matrix2).sum(axis=1))
        matrix2_norm = matrix2_norm[:, np.newaxis]
        cosine_distance = np.divide(matrix1_matrix2, np.dot(matrix1_norm, matrix2_norm.transpose()))
        return cosine_distance
  • 运行结果验证:
    matrix1=np.array([[1,1],[1,2]])
    matrix2=np.array([[2,1],[2,2],[2,3]])
    cosine_dis=cosine_distance(matrix1,matrix2)
    print (cosine_dis)
  • 结果:


~~
20190307更新
这个也有封装好的,只是之前没有发现()

from sklearn.metrics.pairwise import cosine_similarity

cosine_dis2 = cosine_similarity(matrix1,matrix2)
  • 验证:
from sklearn.metrics.pairwise import cosine_similarity

def cosine_distance(matrix1, matrix2):
    matrix1_matrix2 = np.dot(matrix1, matrix2.transpose())
    matrix1_norm = np.sqrt(np.multiply(matrix1, matrix1).sum(axis=1))
    matrix1_norm = matrix1_norm[:, np.newaxis]
    matrix2_norm = np.sqrt(np.multiply(matrix2, matrix2).sum(axis=1))
    matrix2_norm = matrix2_norm[:, np.newaxis]
    cosine_distance = np.divide(matrix1_matrix2, np.dot(matrix1_norm, matrix2_norm.transpose()))
    return cosine_distance

matrix1=np.array([[1,1],[1,2]])
matrix2=np.array([[2,1],[2,2],[2,3]])
cosine_dis=cosine_distance(matrix1,matrix2)
print ('cosine_dis:',cosine_dis)

cosine_dis2 = cosine_similarity(matrix1,matrix2)
print('cosine_dis2:',cosine_dis2)
  • 结果:
[[0.9486833  1.         0.98058068]
 [0.8        0.9486833  0.99227788]]
[[0.9486833  1.         0.98058068]
 [0.8        0.9486833  0.99227788]]

二 欧几里德距离

  • 代码:
def EuclideanDistances(A, B):
    BT = B.transpose()
    vecProd = np.dot(A,BT)
    SqA =  A**2
    sumSqA = np.matrix(np.sum(SqA, axis=1))
    sumSqAEx = np.tile(sumSqA.transpose(), (1, vecProd.shape[1]))

    SqB = B**2
    sumSqB = np.sum(SqB, axis=1)
    sumSqBEx = np.tile(sumSqB, (vecProd.shape[0], 1))
    SqED = sumSqBEx + sumSqAEx - 2*vecProd
    SqED[SqED<0]=0.0
    ED = np.sqrt(SqED)
    return ED
  • 运行结果验证:
    matrix1=np.array([[1,1],[1,2]])
    matrix2=np.array([[2,1],[2,2],[2,3]])
    Euclidean_dis=EuclideanDistances(matrix1,matrix2)
    print (Euclidean_dis)
  • 结果:



20190223更新~~~~~~~~

发现已经有封装好的函数了哈哈哈哈,顺便又验证了一下上面的代码:

    from scipy.spatial.distance import cdist
    dis = cdist(matrix1,matrix2,metric='euclidean')
  • 验证代码
    matrix1 = np.array([[1, 1], [1, 2]])
    matrix2 = np.array([[2, 1], [2, 2], [2, 3]])
    Euclidean_dis= EuclideanDistances(matrix1, matrix2)
    print(Euclidean_dis)

    from scipy.spatial.distance import cdist
    dis = cdist(matrix1,matrix2,metric='euclidean')
    print(dis)

    print(Euclidean_dis==dis)
  • 结果:
[[1.         1.41421356 2.23606798]
 [1.41421356 1.         1.41421356]]
[[1.         1.41421356 2.23606798]
 [1.41421356 1.         1.41421356]]
[[ True  True  True]
 [ True  True  True]]

三 参考资料

相关文章

  • python | 实现多行向量(matrix)两两计算余弦距离、

    余弦距离与欧几里德距离都是常用的距离度量方式。 关于两个向量之间求距离的能找到很多的参考材料,这里就不再赘述了。 ...

  • (转)余弦距离、欧氏距离和杰卡德相似性度量的对比分析

    1、余弦距离 余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。 ...

  • 余弦相似度与余弦距离

    余弦相似度 即计算两个向量间的夹角的余弦值,计算公式如下: 根据线性代数的知识,余弦是通过点积和模长来计算。在向量...

  • 余弦距离

    余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。向量,是多维空间...

  • 余弦相似度算法与kotlin实现

    余弦相似度计算 余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角...

  • k-邻近算法

    使用Python实现kNN分类为算法 计算距离函数classify0()如下: 输入参数:用于分类的输入向量inX...

  • 20-余弦相似度及其R实现

    1 余弦相似度 余弦相似度 (Cosine Similarity) 通过计算两个向量的夹角余弦值来评估他们的相似度...

  • Numpy计算余弦相似度:向量之间,向量与矩阵,矩阵与矩阵

    摘要:Numpy,Python 余弦相似度公式 余弦相似度是衡量向量夹角的余弦值作为相似度度量指标,夹角越小相似度...

  • 分类

    第 14 章:余弦定律和新闻分类 计算机根本读不懂新闻,计算机的本质上只能做快速计算。 计算向量余弦的技巧 坟墓部...

  • 余弦相似度计算

    1. 余弦相似度: 余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估他们的相似度。余弦相似度将向...

网友评论

      本文标题:python | 实现多行向量(matrix)两两计算余弦距离、

      本文链接:https://www.haomeiwen.com/subject/bdfqmftx.html